在参考了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师傅的博客中有评论介绍,但确实没理解,所以此处不做讨论学习