sql注入实战—Boolean注入

测试网站:自建靶场 http://192.168.57.128:1237/sql/boolean.php?id=1
测试工具:Burp Suite

1.访问目标测试地址,使用burp进行抓包。返回的测试结果如下所示:

在这里插入图片描述

2.使用id=1’ and 1=1%23,id=1’ and 1=2%23,发现返回的结果分别是yes和no,如下所示:在这里插入图片描述

由以上输出的结果可知,不能使用union注入,此处可以使用Boolean注入,Boolean注入是指在构造SQL判断语句1,通过查看页面的返回结果来推测哪些SQL判断条件是成立的,以此获取数据库中的数据。

3.首先判断数据库名字的长度,SQL语句构造如下:
' and length (database()) >= 1 -- +

有单引号所以需要注释符来注释。1的位置上可以是任意数字,如 ’ and length (database()) >= 8 - - + 和’ and length (database()) >= 9 - - +,我们可以构造这样的语句,然后观察页面返回结果,如下所示:
在这里插入图片描述在这里插入图片描述由上图可知,当数值是8时,返回的结果是yes;而当数值为9时,返回的结果是no。整个语句的意思是,数据库库名的长度大于等于8,结果为yes;大于等于9,结果为no,由此判断出数据库库名的长度为8。

4.接着,使用逐字判断的方式获取数据库库名。数据库库名的范围一般在a~z、0 ~ 9之内,可能还有一些特殊字符,这里的字母不区分大小写。SQL语句如下所示:
' and substr (database(),1,1) = 't' --+

substr是截取的意思,其意思是截取database()的值,从第一个字符开始,每次只返回一个。substr的用法跟limit的有区别,需要注意。limit是从0开始排序,而这里是从1开始排序。可以使用Burp的爆破功能爆破其中的’t’值,如下图所示,发现当值是s时,页面返回yes,其他值均返回no,因此判断数据库库名的第一位为s,如下图所示。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
使用如上的方法可以爆破出完整的数据库库名。

5.由上篇我们已经可以知道数据库库名是security,所以接下来我们爆破表名,SQL语句构造如下:
' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)= 't' -- +

在这里插入图片描述使用如上的方法可以爆破出完整的表名。依次类推我们可以爆破出所有的表名与字段名。

6.代码分析。
<?php
$con=mysqli_connect("192.168.57.128","root","123","security");
if (mysqli_connect_errno())
{
	echo "连接失败: " . mysqli_connect_error();
}
$id = $_GET['id'];
if (preg_match("/union|sleep|benchmark/i", $username)) {
	exit("no");
}
$result = mysqli_query($con,"select * from users where `id`='".$id."'");
$row = mysqli_fetch_array($result);
if ($row) {
	exit("yes");
}else{
	exit("no");
}
?>

在Boolean注入页面中程序先获取GET参数ID,通过preg_match判断其中是否存在union/sleep/benchmark等危险字符。然后将参数ID拼接到SQL语句,从数据库中查询,如果有结果,则返回yes,否则返回no。当访问该页面时,代码根据数据库查询结果返回yes或no,而不返回数据库中的任何数据,所以页面上只会显示yes或no。


版权声明:本文为qq_40909772原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。