1. HTTP头部攻防基础:从修改到绕过
HTTP头部就像快递包裹上的物流标签,决定了数据如何被服务器处理和传递。在CTF比赛中,攻击者常常通过伪造、修改或注入头部字段来绕过安全限制。我们先从最基础的三种头部修改技巧说起:
User-Agent伪装是最常见的操作。就像快递员通过制服证明身份,服务器常通过这个字段识别客户端类型。我曾遇到一个CTF题目要求"使用1980年代的浏览器访问",只需这样修改:
curl -A "NCSA_Mosaic/1.0" http://target.comX-Forwarded-For伪造相当于在快递单上虚构发货地址。当题目提示"仅限内网访问"时,添加这个头部就能伪装成内部请求:
X-Forwarded-For: 192.168.1.100Referer控制则像谎报包裹来源。某次比赛中需要伪装从官网跳转,用以下代码就解决了:
import requests headers = {'Referer': 'https://official-website.com'} requests.get('http://ctf-target.com', headers=headers)2. 中级注入技术:CRLF与缓存投毒
当用户输入被拼接到HTTP头部时,CRLF(回车换行符)注入就像在快递单备注里偷偷塞入新的物流指令。通过%0d%0a可以插入新行:
GET / HTTP/1.1 Host: target.com User-Agent: Mozilla%0d%0aEvil-Header: hacked缓存投毒攻击更危险——就像调包快递中转站的货物标签。某次实战中,我通过伪造X-Forwarded-Host头部污染了CDN缓存:
GET / HTTP/1.1 Host: target.com X-Forwarded-Host: attacker.com服务器错误地将attacker.com的资源缓存到target.com的URL下,导致所有用户访问被劫持。
3. 高级利用:反向代理滥用与条件请求
云服务常用的反向代理常成为突破口。比如Akamai的ak_bmsccookie绕过案例:
Cookie: ak_bmsc=bypass; other_cookies=normal当配置不当时,这种伪造可以让服务器误判客户端身份。
条件请求攻击则像精准的物流欺诈。通过If-Modified-Since等头部,可以构造时间陷阱:
GET /flag HTTP/1.1 If-Modified-Since: Wed, 21 Oct 2100 07:28:00 GMT某些服务器会因此返回304状态码泄露缓存内容。
4. 实战案例:从CTF题目看防御之道
去年某CTF赛题要求获取管理员Cookie,但限制admin=true的IP才能访问。通过组合技突破:
headers = { 'X-Forwarded-For': '127.0.0.1', 'X-Original-URL': '/admin', 'Cookie': 'role=admin' } response = requests.get('http://gamebox', headers=headers)防御方面,建议开发者:
- 严格校验
Host和Origin头部 - 过滤所有头部中的CRLF字符
- 禁用非常规头部的缓存功能
- 使用标准化库解析而不要手动拼接
某次真实渗透测试中,正是由于Nginx配置漏掉了$host$request_uri的校验,导致攻击者能通过X-Original-URL绕过WAF防护。这提醒我们,头部安全需要代码、配置和架构的多层防护。