创建盲SQL注入漏洞



我正在建立一个带有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注入呢?我真的不知道该怎么做。

UPDATE我写了一个脏的解决方案。然而,它是有效的(但我想得到另一个更有趣的解决方案(。事实是,当返回数据时,我会对数据库进行另一次查询,询问每个参数。如果它存在,则可以打印数据,因为它只包含真实信息(例如,不包含数据库用户名(。

$result2 = mysqli_query($conn,"SELECT * FROM News WHERE title='" . $m["title"] . "' and body='" . $m["body"] . "' and datetime='" . $m["datetime"] . "'");
$count2  = mysqli_num_rows($result2);

您混淆了错误处理和有效载荷。盲SQL注入并不意味着你不能用并集子句利用它,它意味着如果发生错误(例如,如果注入了撇号(,你将看不到任何错误消息或SQL注入的任何迹象。例如,您会看到一条常规的"错误ID"或"未找到结果"消息。如果您的目标是不向用户返回任何文本结果的SQL注入,那么您的目标就是二进制SQL注入,例如:登录屏幕。请记住,二进制SQL注入和文本(文本返回(SQL注入都可以是盲目的或描述性的(错误会打印回用户(。

最新更新