我TMD烦死了学习笔记
本题的解题思路是基于运行错误的Bool型盲注。
通过关键函数,可以绕过MYSQL语法检查,运行时候再出错。通过出错反馈进行布尔型盲注。
关键函数
Spatial Functions
这里用到两个Spatial Functions的函数,分别是ST_GeomFromText 、 ST_MPointFromText。两个函数相似,后文都采取前者做题。ST_GeomFromText函数的作用就是将指定字符串转换成对应的几何值返回,还有一个就是空间参照系标识符,由参数srid指定。具体如下:
1 | ST_GeomFromText(character-string[, srid]) |
但是在这道题里面我们不是运用此函数转换空间几何值的功能,而是借助此函数能绕过MYSQL检查的性质解题。需要注意的是 ST_GeomFromText 针对的是 POINT() 函数, ST_MPointFromText 针对的是 MULTIPOINT() 函数的。
用 ST_GeomFromText ()构造以下sql语句,查看是否可行。
1 | mysql> SELECT IF(0, ST_X(ST_GeomFromText('POINT(abc123)')), 0); |
运行结果:
1 | mysql> SELECT IF(0, ST_X(ST_GeomFromText('POINT(abc123)')), 0); |
我们知道,POINT()函数传入的必须是GIS的地理坐标。我们传入一个常量或者underfined类型(如上面的abc123),函数可以正常运行。
这是在if(0)下试验的,换成if(1)后,再实验一波。
1 | mysql> SELECT IF(1, ST_X(ST_GeomFromText('POINT(abc123)')), 0); |
运行结果:
1 | mysql> SELECT IF(1, ST_X(ST_GeomFromText('POINT(abc123)')), 0); |
明显,运行出错了。是因为POINT()函数里传入的不是规定数据类型而是abc123导致的。到这里,我们就可以确定,ST_GeomFromText函数可以绕过mysql检查,且在运行时会因为内部参数出错而报错。
回到题目,在cat后面输入任何数字时,页面不变。
输入字母的时候,显示空白。
输入–的时候,发现换了一张图片
经过简单的fuzz后,发现很多都被ban掉,出现乌克兰小乳猪
其中有过滤掉了空格,空格可以各种绕过。结合 ST_GeomFromText,构造payload如下:
1 | index.php?cat=1%09and%09IF(0,ST_X(ST_GeomFromText(123)),0) |
将if改位true即f(1)时,返回空白页面。
1 | index.php?cat=1%09and%09IF(1,ST_X(ST_GeomFromText(123)),0) |
对此,可以编写py脚本,把flag一个字母一个字母得跑出来。
编写的脚本中,由于空格被过滤掉了,所以使用Tab键代替空格。
1 | #author:Gqleung |