thinkphp5框架SQL注入分析:parseWhereItem+filterValue
前言
漏洞概要:
- 漏洞存在于 Mysql 类的 parseWhereItem 方法中,数据未经过过滤就拼接进sql语句。
- Request 类的 filterValue 方法漏过滤 NOT LIKE 关键字,
漏洞影响版本: ThinkPHP=5.0.10
环境搭建
控制器
1 |
|
漏洞复现
payload
1 |
|
漏洞分析
Input
我们传递的参数会先进入Request类的input方法,然后经过强制类型转换和filterValue方法的处理
1.get
$_GET数组被赋值给$this->get,然后进入input
2.input
array_walk_recursive 会对$data数组中的每个成员递归地应用filterValue函数,
3.filterValue
调用filterExp对数组中的每一个值进行过滤
4.filterExp
可以看到没有过滤NOT LIKE
1 |
|
parseWhereItem
1.控制器
2.where
调用parseWhere把username数组赋值给$this->options['where']['AND']
3.parseWhereExp
主要是赋值和拼接数组的具体过程
4.select
- select构建sql语句
- query执行构建好的sql语句
5.select
构造sql语句,进入parseWhere
6.parseWhere
if条件不满足,只执行了buildWhere
7.buildWhere
调用parseWhereItem
8.parseWhereItem
简化了下,只放了实际执行的代码
- parseKey给username拼接上了反引号
- $exp把小写的not like转成大写
- $value等于$val[1]
- 在这里parseValue的功能就是给传入参数拼接上单引号
- 逻辑操作符$logic来源于可控的$val[2],然后被拼接进sql语句,造成了sql注入
9.query执行sql语句
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!