MySQL Order By 注入的小技巧
0x00 前言
前几年在工作上遇到了一个 MySQL 的注入问题,注入点在 order by
后面,类似于
select 1 from dual order by "", *;`
其中, *
所在的地方即为注入点。
随即本人尝试对这个点进行注入,经过若干次尝试后均以失败告终。 具体尝试结果如下:
1. 报错注入
尝试使用常见的 GTID_SUBSET()
函数进行报错注入,发现 order by
后没有发挥应用的效果。
2. 延时注入
尝试使用的 sleep()
函数进行延时注入,发现 order by
后没有发挥应用的效果。
此时你可能会发现, order by
后面的行为稍显怪异,难以琢磨。
难道就没有办法利用这个注入了吗?肯定得有,不然这篇文章就写不下去了。
0x01 order by
后的注入 POC
在经过若干次尝试后,本人发现下面的查询语句能够触发报错。
select 1 from dual order by "",(SELECT(1)FROM(SELECT(GTID_SUBSET(2,2))where(1=1))test); # 报错
select 1 from dual order by "",(SELECT(1)FROM(SELECT(GTID_SUBSET(2,2))where(1=2))test); # 不报错
因此,完全可以利用上述语句进行 bool 类型的注入, 甚至直接一点,利用该特性进行报错注入:
或者将 GTID_SUBSET
换成 sleep
进行延时注入。
0x02 未完待续
本文能够利用一些特殊的 SQL,对 order by
后的注入点进行注入。然而,这个只是表现,并非原理。至于 MySQL 的行为为何如此奇怪,本人并没有了解清楚,有待研究。