Author:m3d1t10n
前两天看到phithon大大在乌云发的关于ThinkPHP的漏洞,想看看是什么原因造成的。可惜还没有公开,于是就自己回来分析了一下。
0x00官方补丁(DB.class.php parseWhereItem($key,$val))
注意红色框框起来的部分
0x01分析
|
1
2
3
|
//该正则没有起始符和终止符,xxxxinxxxxx等任意包含in的字符串都可以匹配成功,因而构成了注入
//同上
|
0x02验证
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
{
{
;
;
;
;
;
;
;
// 打印sql语句
;
// 打印数据
// 打印错误
|
0x03编写支持此注入的tamper
(支持mysql)
3.1由于php中有这样一段话,会将我们插入的语句全变成大写,所以我们要将payloa做一个转换
|
1
|
;
|
3.2sqlmap mysql error based 注入语句
|
1
2
|
)
/**其中的0x3a7a61623a等十六进制字符会因为x变成大写而报错,所以我们需要将他们匹配出来变成小写的 **/
|
3.3sqlmap myql boolean blind 注入语句
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
51
51
/**
因为>会被thinkphp进行实体编码,所以我们需要将整条语句换成
floor(payload / num.5)
例如:
52>51==1 为真
floor(52/51.5)==1 为真
51>51==0 为假
floor(51/51.5)==0 为假 **/
|
3.4最后的tamper代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#__author__ = 'm3d1t10n'
re
binascii
:
}
)
:
:
)
payload
subfix
)
#print payload
:
)
#print payload
payload
|
0x04sqlmap 本地测试
4.1boolean based