首页
社区
课程
招聘
[原创][漏洞复现]ThinkPHP 5.1.x SQL注入漏洞
发表于: 2022-1-19 13:12 6476

[原创][漏洞复现]ThinkPHP 5.1.x SQL注入漏洞

2022-1-19 13:12
6476

本篇文章,将分析 ThinkPHP 中存在的 SQL注入 漏洞( select 方法注入)。次漏洞存在于 Mysql 类的 parseWhereItem 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。

ThinkPHP5全版本

程序默认调用 Request 类的 get 方法中会调用该类的 input 方法,但是该方法默认情况下并没有对数据进行很好的过滤,所以用户输入的数据会原样进入框架的 SQL 查询方法中。首先程序先调用 Query 类的 where 方法,通过其 parseWhereExp 方法分析查询表达式,然后再返回并继续调用 select 方法准备开始构建 select 语句。

phpstorm64_Y4K1Z3fAtN

phpstorm64_XQVGDRftNn

上面的 $this->builder 为 \think\db\builder\Mysql 类,该类继承于 Builder 类,所以接着会调用 Builder 类的 select 方法。在 select 方法中,程序会对 SQL 语句模板用变量填充,其中用来填充 %WHERE% 的变量中存在用户输入的数据。我们跟进这个 where 分析函数,会发现其会调用生成查询条件 SQL 语句的 buildWhere 函数。

phpstorm64_0RFjMV8uA9

phpstorm64_rKuFG7koWv

继续跟进 buildWhere 函数,发现用户可控数据又被传入了 parseWhereItem where子单元分析函数。我们发现当操作符等于 EXP 时,将来自用户的数据直接拼接进了 SQL 语句,最终导致了 SQL注入漏洞 。

phpstorm64_T8batPoWMu

总结一下流程

整个流程大概是这样

将 application/index/controller/Index.php 文件代码设置如下:

在 config/database.php 文件中配置数据库相关信息,并开启 config/app.php 中的 app_debug 和 app_trace 。

然后创建数据库

poc:

chrome_5EVuo9hjhI

更新官方补丁或根据官方代码方案修改

 
 
 
 
 
 
 
 
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//