[极客大挑战 2019] HTTP 请求头伪造学习笔记
记录通过 Referer、User-Agent 和 X-Forwarded-For 请求头分析并绕过错误信任判断的过程。
一、题目考点
核心考点:HTTP Header 伪造(HTTP Header Spoofing)。
服务器没有读取 GET、POST 参数,而是读取以下 HTTP 请求头:
User-AgentRefererX-Forwarded-For
二、HTTP 请求组成
浏览器访问网站时,实际上会发送类似下面的 HTTP 请求:
GET /Secret.php HTTP/1.1
Host:
User-Agent:
Referer:
Cookie:
Accept:
Accept-Encoding:
...
三、分析过程
1. 正常访问
先使用 curl 正常访问题目地址:
curl -k "URL"
-k 表示跳过 HTTPS 服务器证书校验。CTF 题目环境有时会存在证书校验问题,可以使用这个参数继续访问。
2. 发现 Secret.php
发现 Secret.php,页面中只有一句话:
It doesn't come from 'https://sycsecret.buuoj.cn/'
3. 修改 Referer
看到页面提示“来源”,想到 GET 请求中的来源信息与 Referer 有关,于是修改 Referer:
curl -k \
-H "Referer: https://sycsecret.buuoj.cn/" \
"URL/Secret.php"
响应页面发生变化,出现提示:
Please use "Syclover" browser
页面发生变化,说明后端进入了下一层判断,也就是后端执行路径发生了变化。
4. 修改 User-Agent
继续思考还有哪些请求头可以更改。提示要求使用 Syclover 浏览器,因此将 User-Agent 修改为 Syclover:
curl -k \
-H "Referer: https://sycsecret.buuoj.cn/" \
-H "User-Agent: Syclover" \
"URL/Secret.php"
页面变化为:
No!!! you can only read this locally!!!!
重点思考提示中的 read 和 locally。不要只想着服务器本地,而是要想到服务器可能错误信任了客户端输入,从而把客户端误判为本地访问。
5. 修改 X-Forwarded-For
想到与 IP 有关的 REMOTE_ADDR 和 X-Forwarded-For,于是把 X-Forwarded-For 设置为本地回环地址 127.0.0.1:
curl -k \
-H "Referer: https://sycsecret.buuoj.cn/" \
-H "User-Agent: Syclover" \
-H "X-Forwarded-For: 127.0.0.1" \
"URL/Secret.php"
后端将请求错误判断为本地访问,因此允许继续访问。
四、总结
「极客大挑战 2019」HTTP 题目通过多个 HTTP 请求头判断访问条件。利用客户端可控的 User-Agent、Referer、X-Forwarded-For 等 Header,可以绕过服务器错误的信任判断。
本质上考察的是 HTTP 请求结构,以及“不要盲目信任客户端输入”的安全思想。
使用工具
curl
用于向题目地址发送 HTTP 请求,通过 -H 参数逐步设置 Referer、User-Agent 和 X-Forwarded-For 请求头,并观察响应页面的变化。