【学习笔记】SQL注入的“特殊战场”——不同场景与二阶注入
一、开篇:当注入点不在“输入框”时
前六篇我们聚焦于URL参数、搜索框等“显性注入点”,但现实中,SQL注入可能藏在更隐蔽的地方:
Cookie里的sessionid;
HTTP Header中的User-Agent;
用XML/JSON格式传递的参数;
甚至“第一次注入,第二次触发”的二阶注入。
PortSwigger原路径将这些称为“上下文相关的SQL注入”——注入点的位置和环境,直接决定了Payload的写法和绕过技巧。
二、特殊场景1:注入点在“非参数位置”
PortSwigger原路径重点讲解了4类非传统注入点,我们用“实战+绕过”拆解:
- Cookie注入(最常见)
场景:某网站的Cookie中存储用户身份:Cookie: session=12345。应用逻辑:
SELECT*FROM users WHERE session_id ='12345';注入方法:修改Cookie为’ OR 1=1–,让SQL变成:
SELECT*FROM users WHERE session_id =''OR1=1--';✅ 触发条件:应用直接从Cookie中取数据拼SQL,未过滤。
- Header注入(User-Agent/Referer)
场景:应用记录用户访问日志,把User-Agent存入数据库:
INSERT INTO logs (ip, user_agent) VALUES ('1.2.3.4', 'Mozilla/5.0');注入方法:修改User-Agent为’ OR (SELECT 1)–,让SQL变成:
INSERT INTO logs (ip, user_agent) VALUES ('1.2.3.4', ''OR (SELECT1)--');✅ 触发条件:应用未过滤Header中的特殊字符(如’、;)。
- XML编码绕过(PortSwigger靶场实战)
场景:某网站的“订单提交”功能用XML传参:
<order>应用逻辑:解析XML后拼接SQL:
SELECT*FROM orders WHERE product_id ='1'AND quantity ='1';目标:绕过WAF过滤(WAF拦截’、OR等关键字)。
PortSwigger实验Payload(用XML实体编码):
<order>S是S的十六进制编码(WAF不认识,但XML解析后会还原成S);
最终SQL变成:
SELECT*FROM orders WHERE product_id ='1'SELECT1--' AND quantity = '1';✅ 成功绕过WAF,触发SQL注入!
三、特殊场景2:二阶注入(First insert, then execute)
PortSwigger原路径将二阶注入(Second-order SQLi)定义为:“第一次注入的数据被存储,第二次使用时才触发注入”。就像你把“炸弹”埋在数据库里,等有人“碰”它时才爆炸。
原理:两次查询的“时间差”
第一次请求:用户输入恶意数据(比如注册用户名’ OR 1=1–),应用将其存入数据库(未执行);
第二次请求:应用从数据库取出该数据,拼接到SQL中执行——此时注入生效!
PortSwigger靶场实战:注册时的“隐藏炸弹”
场景:某网站的“用户注册”功能,注册时用username和password,登录时用username查询:
注册时,应用执行:INSERT INTO users (username, password) VALUES (‘u s e r n a m e ′ , ′ username', 'username′,′password’);
登录时,应用执行:SELECT * FROM users WHERE username = ‘u s e r n a m e ′ A N D p a s s w o r d = ′ username' AND password = 'username′ANDpassword=′password’;
目标:用二阶注入登录administrator账号(无需密码)。
步骤:
注册用户名为’ OR username=‘administrator’–,密码随便填(比如123);
应用将’ OR username=‘administrator’–存入users表的username字段;
登录时,输入刚才的用户名和密码,应用执行:
SELECT*FROM users WHERE username =''OR username='administrator'--' AND password = '123';四、常见坑点与绕过技巧(PortSwigger原路径强调)
WAF过滤了’,怎么办?
- 检查数据存储时是否被转义(比如
'被变成\')→ 用CHAR()函数(CHAR(39)是'); - 检查第二次查询是否真的用了该数据(比如登录时才查询,而不是注册后立即查询)。
二阶注入没反应?
- 用十六进制编码(MySQL):
' OR 1=1--→0x27204f5220313d312d2d(需配合UNHEX()); - 用双写绕过:
' OR 'OR' 1=1--(WAF拦截OR,但双写后放行)。
五、防御:如何覆盖“特殊场景”?
PortSwigger原路径指出,特殊场景注入的根源是“所有用户输入(包括Cookie、Header、XML)都被当成SQL代码”,防御方法:
全输入点过滤:不仅过滤URL参数,还要过滤Cookie、Header、XML/JSON中的数据;
参数化查询(终极方案):不管是第一次插入还是第二次查询,都用?占位符(同第一篇);
二阶注入专项防御:存储数据时严格转义(比如mysqli_real_escape_string()),取出数据时再次验证。
六、互动与预告
小问题:你在测试中遇到过“Cookie注入”吗?是用Burp Suite的“Cookie Editor”修改的吗?欢迎评论区分享!
下期预告:我们将进入SQL注入的“终点”——防御篇,从代码层到架构层,彻底解决SQL注入问题。
(注:文中实验均基于PortSwigger Web Security Academy靶场,原文链接:https://portswigger.net/web-security/sql-injection)
学习资源
如果你也是零基础想转行网络安全,却苦于没系统学习路径、不懂核心攻防技能?光靠盲目摸索不仅浪费时间,还消磨自己信心。这份 360 智榜样学习中心独家出版《网络攻防知识库》专为转行党量身打造!
01内容涵盖
这份资料专门为零基础转行设计,19 大核心模块从 Linux系统、Python 基础、HTTP协议等地基知识到 Web 渗透、代码审计、CTF 实战层层递进,攻防结合的讲解方式让新手轻松上手,真实实战案例 + 落地脚本直接对标企业岗位需求,帮你快速搭建转行核心技能体系!
这份完整版的网络安全学习资料已经上传CSDN【保证100%免费】
**读者福利 |***CSDN大礼包:《网络安全入门&进阶学习资源包》免费分享 *(安全链接,放心点击)
02 知识库价值
- 深度: 本知识库超越常规工具手册,深入剖析攻击技术的底层原理与高级防御策略,并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等,提供了独到的技术视角和实战验证过的对抗方案。
- 广度: 面向企业安全建设的核心场景(渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营),本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点,是应对复杂攻防挑战的实用指南。
- 实战性: 知识库内容源于真实攻防对抗和大型演练实践,通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。
03 谁需要掌握本知识库
- 负责企业整体安全策略与建设的CISO/安全总监
- 从事渗透测试、红队行动的安全研究员/渗透测试工程师
- 负责安全监控、威胁分析、应急响应的蓝队工程师/SOC分析师
- 设计开发安全产品、自动化工具的安全开发工程师
- 对网络攻防技术有浓厚兴趣的高校信息安全专业师生
04部分核心内容展示
360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。
内容组织紧密结合攻防场景,辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合,是你学习过程中好帮手。
1、网络安全意识
2、Linux操作系统
3、WEB架构基础与HTTP协议
4、Web渗透测试
5、渗透测试案例分享
6、渗透测试实战技巧
7、攻防对战实战
8、CTF之MISC实战讲解
这份完整版的网络安全学习资料已经上传CSDN【保证100%免费】