HacKerQWQ的博客空间

TP5SQL注入漏洞分析TP5全版本

Word count: 442Reading time: 1 min
2021/06/26 Share

配置

通过以下命令获取测试环境代码:

1
composer create-project --prefer-dist topthink/think=5.0.10 tpdemo

composer.json 文件的 require 字段设置成如下:

1
2
3
4
"require": {
"php": ">=5.4.0",
"topthink/framework": "5.0.10"
},

然后执行 composer update ,并将 application/index/controller/Index.php 文件代码设置如下:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
namespace app\index\controller;

class Index
{
public function index()
{
$username = request()->get('username');
$result = db('users')->where('username','exp',$username)->select();
return 'select success';
}
}

config/database.php 文件中配置数据库相关信息,并开启 config/app.php 中的 app_debugapp_trace 。创建数据库信息如下:

1
2
3
4
5
6
7
create database tpdemo;
use tpdemo;
create table users(
id int primary key auto_increment,
username varchar(50) not null
);
insert into users(id,username) values(1,'mochazz');

漏洞简介

由于parseWhereItem方法中,对$whereStr直接进行的sql语句的拼接,造成了sql注入

payload

1
http://localhost/index.php/index/index?username=)='1' union select updatexml(1,concat(0x7,user(),0x7e),1

20210626212321

漏洞分析

20210626212413
首先进行参数的传入,然后先进入where方法
20210626212820
Query.phpwhereparseWhereExp会分析查询表达式,并使得$option具有如下值
20210626213152
然后进入thinkphp/library/think/db/Query.phpselect方法调用
20210626213341
这里的builderthinkphp/library/think/db/Builder.phpBuilder类,Builderselect方法用于拼接sql语句
20210626213639
上面代码用于对sql语句模板进行变量填充,问题出现在parseWhere方法中,即对%WHERE%进行填充出现问题,继续跟进
20210626214122
parseWhere方法又调用了parseWhereItem子方法进行SQL语句拼接,跟进
20210626215225
在此处又将值带入parseWhereItem拼接
20210626214832
由于$key值是EXP,进入该分支,将sql语句拼接成我们构造的sql语句,最终造成sql注入
20210626215007

总结

sql3

修复

由于官方不认为这是个漏洞,因此存在于整个TP5中

CATALOG
  1. 1. 配置
  2. 2. 漏洞简介
  3. 3. payload
  4. 4. 漏洞分析
  5. 5. 总结
  6. 6. 修复