概述
Server-Side Request Forgery即我们平常所说的SSRF攻击,翻译过来也就是服务器端请求伪造。漏洞的本质就是攻击者通过应用的正常功能(分享、转码、翻译、图片加载/下载、图片/文章收藏等)使服务器作为代理来访问到原本无法访问到的内网资源。
危害
为了更清楚的认识到SSRF可以干什么,我写了个存在SSRF漏洞的PHP小程序
|
|
代理访问
该漏洞的本质就是可以利用存在漏洞服务器作为跳板去访问服务器所在内网的资源,于是可以用这作为判断是否存在SSRF漏洞的第一步,为什么说是第一步呢,因为我们利用SSRF是要获取到内网的信息,可能服务器允许本身请求其他域名(比如此处的ssrftest域名),但是对内网地址全部黑名单了,利用该SSRF是探测不到内网信息的,那么这就不能算漏洞了,所以,接下来可以尝试访问一些通过前期收集的内网域名,记录下数据包返回内容、数据包返回延时等,最终判断是否存在该漏洞。
然后在cloudeye上收到了日志,ip是我本地的出口ip,而本地浏览器网络接口只发起了一次到服务器的请求,说明日志是服务器端发起访问ssrftest域名生成的。
[29/May/2016:00:18:31 +0800] 123.122.x.x - - ssrftest.xxxxx.dnslog.info POST / HTTP/1.1 200 “-“ “-“
攻击内网web应用(指纹识别、漏洞攻击)
指纹识别其实就是访问一些已知系统(cms等)的特有文件/路径,来达到识别系统的效果。我在内网50机器上部署了一个web服务,如果该web服务存在使用get参数就能实现的漏洞(struts,sqli,xss…),那么就可以通过SSRF漏洞直接对web服务进行攻击。
对服务器内网所在机器进行端口扫描
写了个py小程序,对目标机器的1-10000端口进行扫描
|
|
然后通过访问这些开放的端口,可以得到端口所部署的服务banner信息
本地文件读取
可以利用file协议去读取本地文件,这里我以读/etc/passwd为例
绕过技巧
利用URL特性
一个完整的URL格式如下
scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]
为了避免某些启用了BASIC认证的web服务弹出登录对话框,可以使用如下方式去访问URL,即将BASIC认证所需信息拼接到URL地址中
也就是说浏览器是支持something@domain这样格式的URL的,利用这个特性可以绕过服务器端对URL的简单过滤,可以看到,下图中实际访问的地址是ssrftest.xxx.dnslog.info。
xip.io
xip.io为任意ip地址提供了DNS泛解析
10.0.0.1.xip.io resolves to 10.0.0.1
www.10.0.0.1.xip.io resolves to 10.0.0.1
mysite.10.0.0.1.xip.io resolves to 10.0.0.1
foo.bar.10.0.0.1.xip.io resolves to 10.0.0.1
ip地址进制转换
比如127.0.0.1的8进制=017700000001
防御
- 如果业务不需要从内部拿资源,那么就黑名单内网ip吧
- 限制请求协议仅为HTTP
- 控制返回信息,若正常业务请求的文件类型是特定的,那么在返回给用户前先验证下,避免被用户利用。若有报错信息,请直接返回统一error样式。