网站建设笔记

ThinkPHP5.1漏洞被挂马事件

ThinkPHP5.1.x远程代码执行漏洞  已经存在很久的漏洞了,能升级5.1.42 就升。

5.1.42  改进多语言判断机制看这里 :https://github.com/top-think/framework/releases/tag/v5.1.42

如果像我一样 牵扯兼容的话那只能上手。

上手第一步

thinkphp/library/think/Request.php     文件找到:

public function method($method = false)
    {
        if (true === $method) {
            // 获取原始请求类型
            return $this->server('REQUEST_METHOD') ?: 'GET';
        } elseif (!$this->method) {
            if (isset($_POST[Config::get('var_method')])) {
                $this->method = strtoupper($_POST[Config::get('var_method')]);
                $this->{$this->method}($_POST);
            } elseif (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
                $this->method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);
            } else {
                $this->method = $this->server('REQUEST_METHOD') ?: 'GET';
            }
        }
        return $this->method;
    }

替换为:  (注意看原版的 第8 第9行)

    public function method($method = false)
    {
        if (true === $method) {
            // 获取原始请求类型
            return $this->isCli() ? 'GET' : (isset($this->server['REQUEST_METHOD']) ? $this->server['REQUEST_METHOD'] : $_SERVER['REQUEST_METHOD']);
        } elseif (!$this->method) {
            if (isset($_POST[$this->config->get('var_method')])) {
                $method = strtoupper($_POST[Config::get('var_method')]);
                if (in_array($method, ['GET', 'POST', 'DELETE', 'PUT', 'PATCH'])) {
                    $this->method = $method;
                    $this->{$this->method}($_POST);
                } else {
                    $this->method = 'POST';
                }
                unset($_POST[Config::get('var_method')]);
            } elseif (isset($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'])) {
                $this->method = strtoupper($_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE']);
            } else {
                $this->method = $this->isCli() ? 'GET' : (isset($this->server['REQUEST_METHOD']) ? $this->server['REQUEST_METHOD'] : $_SERVER['REQUEST_METHOD']);
            }
        }

        return $this->method;
    }
     //远程漏洞修复部分  结束

上手第二步:

5.1版本在    /thinkphp/library/think/route/dispatch/Url.php   文件,解析控制器 后面加上:

        if ($controller && !preg_match('/^[A-Za-z](\w|\.)*$/',$controller)) {
        throw new HttpException(404,'controller not exists:' . $controller);
        }

参考来源:https://blog.thinkphp.cn/869075

 

后续  笔记   只涉及到查询  看内容,不发文章不执行的查询网站,可以把发现木马的目录。在宝塔中 所有者 www 权限设成555   只读+执行 不给写入(默认是755),以后管理的时候用宝塔不用ftp就行。因为宝塔属于最高的root 不受www所有者影响  可以随便写入。

这样即使是以后有新漏洞也不容易被利用。

 

小结

1. 清理木马 方法  源码可以下载到本地,用护卫神+D盾查杀,然后修改服务器对应文件,

2. 用面板 宝塔的 服务器安全扫描 插件,扫描是否有多余mysql用户  或者其它异常权限。

通常会在mysql 总数据库 user数据表中多出外部访问的用户,一般我们都是本地localhost 或者 127.0.0.1  一旦出现不属于这两的就特别观察。