框架filterExp函数过滤不严格导致SQL注入
phpoop 漏洞分析 12984浏览 · 2017-09-14 08:44

0x00 说说说说说说说说说说说明

filterExp函数thinkphp5框架核心的安全过滤函数,他被配置与input函数一起使用, 他的前生是I函数,thinkphp5重写了数据库操作类方法,filterExp函数没有及时更正更新导致sql注入。

0x01漏洞利用

凌晨5点了,差不多猝死了,原理什么的就放在最后面了,直接来看如何利用把。QAQ

1,首先先看一波 input函数 了解这个东西何物先



漏洞场景方法1:




漏洞场景方法2:





0x02漏洞分析

上面我们展示了无聊的漏洞利用方法,这里我们对这个漏洞进行分析

那就看一下 select方法是如何定义的

文件:thinkphp\library\think\db\Builder.php

方法:select()





这里来看看TP系统核心安全函数之一 input函数,他可以帮助我们获取各种变量与自动过滤的功能等。

文件: thinkphp\library\think\Request.php

方法: input()



从这个函数来说,我们一般情况下就算可以控制传入的变量,也会因为多个空格导致匹配不上,但是这里因为TP5重写了数据库操作的方法,忽略了一些东西,所以导致我们可以投机取巧的绕过他。如下图

这个是TP5 支持的表达式,在看看input会进行过滤的表达式

通过对比是否就有一个比较清楚的概念了?没错TP5 新添加了一个表达式 not like 但是在 filterExp中又没有进行过滤,最终导致了可注入。

修复方法:

打开文件:\thinkphp\library\think\Request.php

打开方法:filterExp();

添加正则:/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i

222

11 条评论
某人
表情
可输入 255
hades
2017-09-19 05:28 0 回复

哈哈 可以分享一波~~


茜さす
2017-09-19 02:54 0 回复

哈哈   用这个漏洞 还刷了一个洞   师傅很仔细 和14年的那个比较相似


hades
2017-09-17 20:21 0 回复

嗯 是滴~官方已经修复了

如果哥们喜欢代码审计可以加我联系方式


0r3ak
2017-09-16 17:07 0 回复

学习了,上周看到thinkphp官方出了5.0.11并修复了一个安全问题,diff了一下就发现了这个fileterExp里面多了一个NOT LIKE


超神哥123
2017-09-15 21:57 0 回复

感谢分享好文章很棒


wind
2017-09-25 08:45 0 回复

我经常和作者研究审计,能不能带我一个


hades
2017-09-25 05:55 0 回复

你也很不错~期待你后续的文章


shutdown_r
2017-09-25 04:52 0 回复

implode那里纠结了半天~好文,不愧是研究到凌晨5点的~~真的很厉害


0r3ak
2017-10-13 03:35 0 回复

刚看了一下5.0.7的,还是存在not like的


if (in_array($exp, ['=', '<>', '>', '>=', '<', '<='])) {

            // 比较运算 及 模糊匹配

            $whereStr .= $key . ' ' . $exp . ' ' . $this->parseValue($value, $field);

        } elseif ('LIKE' == $exp || 'NOT LIKE' == $exp) {



0r3ak
2017-10-13 03:30 0 回复

以前我看到的是5.0.5-5.0.10 都有not like的方法,现在又修复了?


xiao_c
2017-10-13 00:48 0 回复

今天看了一下,可惜只有5.0.10的Builder.php添加了这个新用法,5.0.9(包括)以前都没添加,好气


目录