WP015——CTF赛题解析-XFF绕过

157 阅读3分钟

时效性

2025年8月3日

题目来源

本地管理员 - Bugku CTF平台

题目描述

某些网站会优先信任X-Forwarded-For头来获取客户端真实ip,导致我们可以直接伪造X-Forwarded-For:127.0.01来绕过!特别是在使用反向代理(如Nginx、Cloudflare等)的环境中。如果系统简单地信任这个头而不做验证,攻击者可以:伪造 X-Forwarded-For: 127.0.0.1 让服务器认为请求来自本地。从而突破IP的限制。

image.png

image.png

Write up

在html源码中存在一段Base64编码的字符串,进行解码后可以看到对应的密码test123

image.png

image.png

总结

“X-Forwarded-For” (XFF) 头绕过指的是攻击者通过伪造或操纵这个 HTTP 请求头来欺骗服务器,使其错误地识别客户端的真实 IP 地址。这是一种常见的 IP 欺骗技术,主要用于规避基于 IP 地址的安全控制(如访问控制列表、速率限制、地理封锁、反爬虫机制等)。

为什么 XFF 可以被绕过?

  1. 客户端可控性X-Forwarded-For 头是由客户端(浏览器、脚本、工具)或路径上的第一个代理服务器添加的。攻击者可以完全控制自己发送的请求头,直接设置 X-Forwarded-For 为任意值(包括多个 IP)。
  2. 代理链信任问题:如果服务器(或服务器前的最后一个代理/负载均衡器/WAF)盲目信任 X-Forwarded-For 头中的值,特别是第一个值或最后一个值,并将其视为客户端的真实 IP,那么伪造就成功了。
  3. 代理配置不当:中间代理服务器可能配置不当,未能正确覆盖或清理传入的 X-Forwarded-For 头,或者直接将客户端提供的 XFF 值追加到现有头中。

常见的 XFF 绕过手法:

  1. 简单伪造

    • 攻击者直接在 HTTP 请求中添加 X-Forwarded-For 头,并设置为自己想要的 IP 地址。
    • X-Forwarded-For: 203.0.113.100 (伪造的 IP)
    • 如果服务器直接信任这个值,攻击者就成功伪装了 IP。
  2. 追加伪造 (制造代理链假象)

    • 攻击者发送一个已经包含 X-Forwarded-For 头的请求,该头包含一个或多个看起来像代理链的 IP 地址,最后一个是攻击者希望服务器看到的伪造 IP。
    • X-Forwarded-For: 192.0.2.1, 198.51.100.2, 203.0.113.100 (假设 203.0.113.100 是伪造的目标 IP)
    • 服务器如果配置为取 X-Forwarded-For 头中的第一个 IP 作为客户端 IP(这在一些错误配置中会发生),就会取 192.0.2.1
    • 服务器如果配置为取 X-Forwarded-For 头中的最后一个 IP(这通常被认为是离服务器最远的、最原始的客户端 IP),就会取 203.0.113.100(伪造成功)。这是最常见的攻击方式
    • 服务器如果配置为取 X-Forwarded-For 头中倒数第二个 IP(假设它信任自己前面的一个代理),如果攻击者伪造的链长度足够,也可能被欺骗。
  3. 覆盖已有头

    • 即使客户端请求中可能没有 XFF 头,攻击者也可以主动添加一个。
    • 即使客户端请求中已经有一个 XFF 头(比如浏览器在某些代理后自动添加),攻击者可以发送一个同名的头。根据 HTTP 规范和服务器/代理的实现,后发送的头可能会覆盖前一个头,或者多个值被合并。这可能导致攻击者注入的值生效。