thinkphp通杀漏洞利用以及网站安全修复建议

   

         thinkphp在国内来说,很多站长以及平台都在使用这套开源的系统来建站
,为什么会这么

深受大家的喜欢,第一开源,便捷,高效,生成静态化html,第二
框架性的易于开发php架构,

很多第三方的插件以及第三方的开发公司较多,模板
可以自定义设计,在thinkphp的基础上可

以开发很多大型的虚拟币平台,以及会员
平台,商城系统,thinkPHP的官方在系统升级方面做

的比较完善,及时更新与修复
一些BUG。


目前官方最新版本是ThinkPHP5.0.20版本,之前的ThinkPHP3.2,
ThinkPHP3.1、ThinkPHP3.0

都存在过网站漏洞,包括一些高危的远程代码执行漏洞
,thinkphp sql注入漏洞,后台管理员

XSS跨站漏洞,任意文件上传漏洞等等。
目前我们SINE安全于2018年9月5号,在日常的thinkphp

网站安全检测当中,发现某
客户使用的thinkphp系统存在着网站sql注入漏洞,危害性较高,一开

始以为客户
使用的是较低版本:thinkphp 3.2.3,才会存在这种网站漏洞,但是在实际的安全检测

当中发现不仅仅是这个版本,还包含了目前最新版本5.0.20,关于该网站漏洞
的详情与poc利用,

我们一步一步来分析。

 
 
thinkphp漏洞产生原理
 
 
产生网站漏洞的文件存在于library文件夹下的think文件,里面包含的db文件夹的

driver.class.php代码中的第677行开始,在order处理分析的时候发现分析参数里可以插入非法的

字符,在key赋值的时候并没有做严格的安全限制与过滤,导致攻
击者可以使用SQL注入语句进

行构造查询数据库里的内容,包括可以查选数据库里
的管理员账号密码, 写入数据库等等的操作。

thinkphp 3.2.3漏洞代码如下:
 
 /**
     * order分析
     * @access protected
     * @param mixed $order
     * @return string
     */
    protected function parseOrder($order) {
        if(is_array($order)) {
            $array   =  array();
            foreach ($order as $key=>$val){
                if(is_numeric($key)) {
                    $array[] =  $this->parseKey($val);
                }else{
                    $array[] =  $this->parseKey($key).' '.$val;
                }
            }
            $order   =  implode(',',$array);
        }
        return !empty($order)?  ' ORDER BY '.$order:'';
    }
 
ThinkPHP 5.1.22漏洞代码存在于library文件夹下的think文件里的db/query.php
 
代码里的第1514行,代码如下:
 
/**
     * 指定排序 order('id','desc') 或者 order
 
(['id'=>'desc','create_time'=>'desc'])
     * @access public
     * @param string|array $field 排序字段
     * @param string       $order 排序
     * @return $this
     */
    public function order($field, $order = null)
    {
        if (empty($field)) {
            return $this;
        } elseif ($field instanceof Expression) {
            $this->options['order'][] = $field;
            return $this;
        }
 
        if (is_string($field)) {
            if (!empty($this->options['via'])) {
                $field = $this->options['via'] . '.' . $field;
            }
            if (strpos($field, ',')) {
                $field = array_map('trim', explode(',', $field));
            } else {
                $field = empty($order) ? $field : [$field => $order];
            }
        } elseif (!empty($this->options['via'])) {
            foreach ($field as $key => $val) {
                if (is_numeric($key)) {
                    $field[$key] = $this->options['via'] . '.' . $val;
                } else {
                    $field[$this->options['via'] . '.' . $key] = $val;
                    unset($field[$key]);
                }
            }
 
从以上thinkphp 3.2.3 、thinkphp 5.0的代码里可以分析出来,当order在分析关联函数的时候会

赋值于key值中,可以掺入sql注入语句执行攻击网站,并可以拼接
方式绕过sql安全过滤,导致

可以执行sql语句,查询数据库,操作数据库。
 
thinkphp漏洞利用详情:
 

 
thinkphp漏洞修复建议:
 
如果是低版本的thinkphp 3.*的系统,请尽快升级到thinkphp最高版本。
 
如果是高版本的thinkphp 5.*的系统,请尽快升级到thinkphp最高版本。
 
如果网站被攻击了,请尽快做好网站的安全备份,查找网站存在木马后门,对其代码里被篡改的代

码进行修复,并做好网站安全加固,对一些缓存文件夹进行安全权
限设置,如果对网站漏洞修复不

是太懂的话可以找专业的网站安全公司去处理,国
内SINE安全公司,绿盟安全,启明星辰都是比较

专业的。如果网站使用的是单独服
务器比如linux系统、windows系统,可以部署网站防火墙,来

防止sql注入攻击。
网站默认的管理员后台地址可以修改为比较繁琐的地址。
 
分享: