创建盲 SQL 注入漏洞
Posted
技术标签:
【中文标题】创建盲 SQL 注入漏洞【英文标题】:Create Blind SQL injection vulnerability 【发布时间】:2019-05-03 22:00:32 【问题描述】:我正在建立一个带有 SQL 注入漏洞的网站以进行测试。但是,我只想配置一个盲 SQL 注入。我有这个 php 代码:
<?php
$news_id = $_GET["id"];
$conn = mysqli_connect("localhost","root","","db");
$result = mysqli_query($conn,"SELECT * FROM News WHERE id='" . $_GET["id"] . "'");
$count = mysqli_num_rows($result);
if($count==0)
$message = "Invalid ID";
header( 'Location: id_not_found.html' );
else
$message = "Correct ID!";
$m = mysqli_fetch_assoc($result);
?>
<html>
<head>
<link rel="stylesheet" type="text/css" href="mystyle.css">
<title>NEWS</title>
</head>
<body>
<h1>NOTICIA</h1>
<div style="background-color:#c6c6c6;color:black;padding:20px;">
<h2><?php echo $m["title"]; ?></h2>
<p><?php echo $m["body"]; ?></p>
<p><?php echo $m["datetime"]; ?></p>
</div>
</body>
</html>
在我看来,这段代码似乎只有一个盲SQL漏洞,因为它只打印新闻表的列名,所以如果用户插入一些查询,结果不会被打印出来。
但是,当我进行这种注入时:
http://localhost:8080/web_base_de_datos_asig/check_newsid.php?id=-1' UNION SELECT NULL,NULL,user(),NULL-- kyGC
当前用户被打印,因为查询返回了下一个数组:
Array ( [0] => [id] => [1] => [title] => [2] => root@localhost [body] => root@localhost [3] => [datetime] => )
那么,我怎样才能只编写一个盲 SQL 注入?我真的不知道该怎么做。
更新 我写了一个肮脏的解决方案。但是,它有效(但我想获得另一个更有趣的解决方案)。 事实是,当返回数据时,我对数据库进行另一个查询,询问每个参数。如果存在,则可以打印数据,因为它只包含真实信息(而不是,例如db用户名)。
$result2 = mysqli_query($conn,"SELECT * FROM News WHERE title='" . $m["title"] . "' and body='" . $m["body"] . "' and datetime='" . $m["datetime"] . "'");
$count2 = mysqli_num_rows($result2);
【问题讨论】:
使用prepared 语句避免SQL 注入不是更好吗?为什么有人明确需要使用 SQL 注入的“功能”? 出于测试目的可能意味着他想展示一个可以在没有任何反馈的情况下进行 SQL 注入的网站。可能是为了学校演示。 正如@JaredC 所说,这是为了演示。 @LukStorms 我在 MySQLi 中使用了准备好的语句,显然,它工作得很好。但是,我想要一个具有此类漏洞的 PHP 代码用于培训/学校目的。 @Miguel.G 感谢您的澄清。 +1 【参考方案1】:您将错误处理与有效负载混淆了。盲注 SQL 并不意味着你不能使用联合子句来利用它,它意味着如果发生错误(例如如果注入了撇号),你不会看到任何错误消息或任何 SQL 注入迹象。例如,您会看到常规的“ID 不正确”或“未找到结果”消息。 如果您的目标是不向用户返回任何文本结果的 SQL 注入,那么您的目标是二进制 SQL 注入,例如:登录屏幕。 请记住,二进制 SQL 注入和文本(文本返回)SQL 注入都可以是盲目的或描述性的(错误会打印回用户)。
【讨论】:
以上是关于创建盲 SQL 注入漏洞的主要内容,如果未能解决你的问题,请参考以下文章