在参考了gq师兄的writeup与网上MADS师傅的博客后尝试写下来学到的
基于运行错误的BOOL型注入
什么是基于运行错误的BOOL性注入
比较常遇见的盲注是服务端会根据sql语句的逻辑true or false来返回不同的东西,而这里的是根据sql语句的执行情况的true or false来返回不同的东西,这样说来就是它可以通过MySQL解释器检查,但运行时又会产生错误的函数,然后“恰逢其时”地出现
Spatial Functions
通过传入非法参数给空间函数进行报错注入,ST_GeomFromText 、 ST_MPointFromText 是两个可以从文本中解析Spatial function的函数,当我们让它的语法符合MySQL的规则,但在解析文本处做些手脚,这样我们就可以通过MySQL的预检查,但是在运行时又产生“恰到好处”的错误,这样我们就可以进行盲注了
ST_GeomFromText针对的是POINT()函数
ST_MPointFromText针对的是MULTIPOINT()函数
- 以ST_GeomFromText为例
| 1 | mysql> SELECT IF(1, ST_X(ST_GeomFromText('POINT(mads)')), 0); | 
上述例子中很明显POINT函数传入的必须是GIS中的地理坐标的数据类型,但在这里写入一个常量或underfined类型却也能正常运行
而当我们将if的表达式改成false后,会执行中间的参数,POINT的数据类型错误会导致报错
| 1 | mysql> SELECT IF(1, ST_X(ST_GeomFromText('POINT(mads)')), 0); | 
总结整理其他可用函数
| 1 | SELECT IF({}, ST_X(ST_GeomFromText('POINT(mads)')), 0); | 
题目
我们可以发现这道题不论参数传入的数字都是只会返回同一张图片,


但如果传入的参数包含被ban掉的字符,则会返回另一张图,

借此我们就可以有一个简单的思路了
但我们首先抓包爆破一下看一下有哪些字符被ban了

得出
union
*
‘
“
substr
mid
=
like
into
file
sleep
benchmark
^
or
空格
&
>
<
#
-
ascii
ord
这里过滤了空格,我们可以用\t来代替,也就是%09,在写脚本时可以用TAB键来输入,而过滤掉的单双引号也可以用十六进制来代替字符串
我们用ST_GeomFromText来解题,构造payload
| 1 | index.php?cat=1%09and%09IF(0,ST_X(ST_GeomFromText(0x504F494E54286D61647329)),0) | 
如果if表达式false则可以返回正常的页面

如果为true,则返回错误的页面

据此可以编写python脚本
| 1 | #author:Gqleung | 
运行结果

除了报错盲注,也可以用延时盲注,在MADS师傅的博客中有评论介绍,但确实没理解,所以此处不做讨论学习

