(1)堆叠注入是当 php 连接 mysql 进行查询时,若查询语句使用的是 mysqli_multi_query() 而不是 mysqli_query()时,就会存在堆叠注入;
就是我们可以用 ; 作分隔,然后同时执行多个语句;
(2)而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?
区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句;
eg:sqli-labs Less-43
login_user=a&login_password=a'); create table yyuu like users#&mysubmit=Login
(3)使用 mysqli_multi_query() 的一般形式:
<?php
$con=mysqli_connect("localhost","my_user","my_password","my_db");
// 检测链接
if (mysqli_connect_errno($con))
{
echo "连接到 MySQL 失败: " . mysqli_connect_error();
}
$sql = "SELECT Lastname FROM Persons ORDER BY LastName;";
$sql .= "SELECT Country FROM Customers";
// 执行多个 SQL 语句
if (mysqli_multi_query($con,$sql))
{
do
{
// 存储第一个结果集
if ($result=mysqli_store_result($con))
{
while ($row=mysqli_fetch_row($result))
{
printf("%sn",$row[0]);
}
// 释放结果内存
mysqli_free_result($result);
}
}
// 相当于移动结果集的指针指向下一个结果集
while (mysqli_next_result($con));
}
mysqli_close($con);
?>
(4)报错注入和堆叠注入不能同时使用;
(5)使用堆叠注入进行插入操作时,也可以插入版本信息,查询信息等;
(6)若 select 被过滤,可以:
;set @a='select * from users;';prepare execsql from @a;execute execsql;