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 的行为为何如此奇怪,本人并没有了解清楚,有待研究。 ...