堆叠查询
堆叠查询,也叫堆叠注入( stacked injection),在SQL中,分号(;)是用来表示一条sql语句的结束。堆叠注入就是一次性注入并执行多条语句(多语句之间以分号隔开)的注入方式。
靶场环境:
sqli-labs-38
![](https://i-blog.csdnimg.cn/blog_migrate/4232e58ea7ed6e8f633590270c6c43d8.png)
页面显示“请输入id作为带数值的参数
判断注入点及注入类型
当我们输入参数?id=1,页面出现第一组用户名与密码
![](https://i-blog.csdnimg.cn/blog_migrate/fd66b6ed2e4c25aeda9db5db440ff7f2.png)
当我们输入参数?id=2,页面出现第二组用户名与密码
![](https://i-blog.csdnimg.cn/blog_migrate/ec641003104dee3ae1c61e25bd875d14.png)
说明id是一个可控输入参数且页面会根据参数进行回应,这是一个注入点。且由于网页有回显,可以使用union联合查询注入
当我们输入参数?id=1',页面发生报错
![](https://i-blog.csdnimg.cn/blog_migrate/74cfc25c8114adadc78848794f80420d.png)
说明这是一个由单引号包裹的字符型注入,且还为报错注入
当我们输入参数?id=1' and sleep(5) --+,页面成功显示延迟
![](https://i-blog.csdnimg.cn/blog_migrate/d93994329682427cde521372ecce88f6.png)
说明还存在延时注入
当我们输入参数?id=1' --+,页面成功返回第一组用户名和密码
![](https://i-blog.csdnimg.cn/blog_migrate/afb029b8450b82c79e6b31f6ada6605a.png)
说明--+成功注释了后面的语句
综上,注入点为单引号包裹的字符型注入,由于页面有回显,页面显示报错,页面显示有延迟,说明存在union联合查询、报错注入、延时注入漏洞。
union联合查询是以上几种注入方式中最为便捷的一种,所以我们优先选择使用union联合查询注入获取用户名密码在哪个表哪个字段中,接着往该表和字段中插入新的用户名和密码
执行语句
id=1';update users set password='123456' where id=1; --+
意思就是再更新id=1的用户密码为123456
![](https://i-blog.csdnimg.cn/blog_migrate/8c73250ef5f1bda8e4dbf507e3899947.png)
总结:
堆叠查询与union联合查询的区别:
union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
堆叠注入可以执行的是任意的语句,如增删改等
堆叠查询的局限性:
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。虽然我们前面提到了堆叠查询可以执行任意的sql语句,但是这种注入方式并不是十分的完美的。在我们的web系统中,因为代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。如上面的实例如果我们不输出密码那我们是看不到这个结果的。因此,在读取数据时,我们建议使用union(联合)注入。同时在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息