本Web安全基础推文系列旨在以平白的语言讲解漏洞原理,文章多数内容为我本人的学习笔记与总结,汇总供大家参考。

目录

1 堆叠注入
2 堆叠注入案例
3 总结
4 参考链接

1 堆叠注入

1.1 堆叠注入成因

Sql查询语句中, 分号“;”代表查询语句的结束,所以在执行sql语句结尾分号的后面,再加一条sql语句,这个语句会一起执行,造成注入,这就是堆叠注入(Stacked Injection)。
堆叠注入在mysql数据库中并不常见,常见于mssql数据库,mssql数据库是默认堆叠注入的。如用户输入:1; DELETE FROM products
服务器端生成的sql语句为:Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

1.2 堆叠注入触发条件

堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句,这就需要服务器在访问数据端时,使用的是可同时执行多条sql语句的方法,例如php中的mysqli_multi_query函数。但与之相对应的mysqli_query()函数一次只能执行一条sql语句,所以要想目标存在堆叠注入,在目标主机没有对堆叠注入进行黑名单过滤的情况下必须存在类似于mysqli_multi_query()这样的函数。总结就是:
1、目标存在sql注入漏洞
2、目标未对”;”号进行过滤
3、目标中间层查询数据库信息时可同时执行多条sql语句
因此,堆叠注入存在局限性:堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API或数据库引擎的不支持,堆叠注入都无法实现。堆叠注入通常无错误回显,堆叠注入第二个语句产生错误或者结果只能被忽略。因此,在读取数据时,建议使用union(联合)注入。同时在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。

2 堆叠注入案例

2.1 强网杯19年随便注 - BUUCTF靶场可测

还记得我们先前总结的测试流程吗?
首先,上万能payload, 单引号。
输入1’ 页面报错了,加上注释符号#页面又回显正常,那么闭合符号就是单引号。

过滤了很多函数和关键字。
尝试堆叠注入:1’; show databases;#

发现成功,爆出了有用的信息。

后续解题思路参考后文链接。我们浅尝则止,旨在突出堆叠注入的特点和使用场景。

2.2 Sqli-lab Less-38 堆叠注入 - 字符型 - GET

传入单引号报错,发现错误回显分析后构造单引号闭合发现字符型注入

1
2
?id=1' and '1'='1
?id=1' and '1'='2

经过测试存在union联合注入,使用联合注入爆破出users表中有id、username、password三个 字段。

于是尝试堆叠注入将id为1的用户密码改成123,可以配合联合查询来判断sql是否执行。

1
2
3
http://127.0.0.1/sqli-labs-master/Less-38/?id=-1%27%20union%20select%201,2,3;

update%20users%20set%20password=123%20where%20id=1--+

再次查询时发现已经更改,我们打开php源代码看一下是什么:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (mysqli_multi_query($con1, $sql))
{
/* store first result set */
if ($result = mysqli_store_result($con1))
{
if($row = mysqli_fetch_row($result))
{
echo '<font size = "5" color= "#00FF00">';
printf("Your Username is : %s", $row[1]);
echo "<br>";
printf("Your Password is : %s", $row[2]);
echo "<br>";
echo "</font>";
}
// mysqli_free_result ($result);
}
}

可以看到有这个函数:mysqli_multi_query。

3 总结

堆叠注入其实很好理解,但是它的应用场景比较局限,我们只需要知道注意多个sql语句同时执行这种情况可能存在注入就行。后面我们讲解宽字节注入和二次注入。

目前正在学习pikachu靶场,整理Burpsuite的使用笔记等等。

4 参考链接