SQL注入--堆叠注入
一.基本概念
堆叠注入概念:在 SQL 中, 分号(;) 是用来表示一条 sql 语句的结束。 试想一下我们在 ; 结束一个 sql语句后继续构造下一条语句, 会不会一起执行? 因此这个想法也就造就了堆叠注入。
二.堆叠注入和联合注入的区别
-
区别
- 联合注入:union或者 union all 执行的语句类型是有限的,可以用来执行查询语句。
- 堆叠注入:可以执行任意的语句(增删改查)。
三.使用条件
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行。
简单总结:
- 目标存在sql注入漏洞
- 目标未对";"号进行过滤
- 目标查询数据库信息时可同时执行多条sql语句
堆叠注入的局限性:
- 堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API或数据库引擎的不支持,堆叠注入都无法实现。
四.靶场示例
靶场:sqli-labs less 38
-
经测试,注入类型为字符型,闭合方式为单引号
-
?id=1
?id=1daw
?id=1daw'
-
-
经过测试存在union联合注入,然后尝试堆叠注入将id为1的用户密码改成123,可以配合联合查询来判断sql是否执行。
-
?id=1' ;update users set password=123 where id=1%23
-
-
然后再次查询id为1的用户时发现password信息已被修改,说明目标存在堆叠注入。