0x01、SSRF
服务器端请求伪造,也称XSPA(跨站端口攻击),它是由攻击者构造形成由服务端发起请求的一个安全漏洞。
原因:大部分都是由于服务器端提供了从其他服务器应用获取数据的功能且没有对目标地址进行过滤与限制。比如指定的URL获取网页文本内容,加载指定地址图片,下载等等,这个功能如果被恶意使用,可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
0x02、SSRF产生过程
网站访问大致步骤:
用户在地址栏输入网址 — 向目标网站发送请求 — 目标网站接受请求并在服务器端验证请求是否合法,然后返回用户所需要的页面 — 用户接收页面并在浏览器中显示
例如此处访问URL:www.xxx.com/a.php?image=(地址)
产生的原因:服务器端的验证并没有对其请求获取图片的参数(image=)做出严格的过滤以及限制,导致可以从其他服务器的获取一定量的数据
访问www.xxx.com/a.php?image=http://www.abc.com/1.jpg
如果我们将http://www.abc.com/1.jpg换为与该服务器相连的内网服务器地址会产生什么效果呢?
如果存在该内网地址就会返回1xx 2xx 之类的状态码,不存在就会其他的状态码
SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有发现在这个请求是合法的,然后服务器以他的身份来访问其他服务器的资源。
0x03、常见的从服务端获取其他服务器信息的的功能
1、通过URL地址分享页面内容
2、转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3、在线翻译:通过URL地址翻译对应文本的内容。提供此功能的国内公司有百度、有道等
4、图片加载与下载:通过URL地址加载或下载图片
5、图片、文章收藏功能
6、未公开的api实现以及其他调用URL的功能
0x04、SSRF攻击的利用方式和危害
利用方式
1、可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2、攻击运行在内网或本地的应用程序(比如溢出);
3、对内网web应用进行指纹识别,通过访问默认文件实现;
4、攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5、利用file协议读取本地文件等。
危害
1、URL为内网IP或域名,攻击者将可以通过SSRF漏洞扫描目标内网,查找内网内的漏洞,并想办法反弹权限
2、URL中包含端口,攻击者将可以扫描并发现内网中机器的其他服务,再进一步进行利用
3、当请求方法允许其他协议的时候,将可能利用gophar、file等协议进行第三方服务利用,如利用内网的redis获取权限、利用fastcgi进行getshell等
0x05、SSRF挖掘
1、从上述所说的6个web功能上进行查找;
2、从URL关键字中查找
share、wap、url、link、src、source、target、u、3g、display、surceURL、imageURL、damain....
利用Google语法加上关键字寻找ssrf漏洞。
0x06、SSRF验证
在大部分web服务器架构中,web服务器自身都可以访问互联网和服务器所在的内网。下图展示了web服务器的请求可以到达的地方。
1、排除法
例如:http://www.douban.com/***/service?image=http://www.baidu.com/img/bd_logo1.png
排除法一:
直接右键图片,在新窗口打开图片,如果是浏览器上URL地址栏是http://www.baidu.com/img/bd_logo1.png,说明不存在SSRF漏洞。
排除法二:
使用burpsuite等抓包工具来判断是否不是SSRF,首先SSRF是由服务端发起的请求,因此在加载图片的时候,是由服务端发起的,所以在我们本地浏览器的请求中就不应该存在图片的请求,在此例子中,如果刷新当前页面,有如下请求,则可判断不是SSRF。(前提设置burpsuite截断图片的请求,默认是放行的)
2、实例验证
经过简单的排除后,我们验证次URL是否可以来请求对应的内网地址
找存在HTTP服务的内网地址:
一、从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
二、通过二级域名暴力猜解工具模糊猜测内网地址
1)因为SSRF漏洞是构造服务器发送请求的安全漏洞,所以我们就可以通过抓包分析发送的请求是否是由服务器的发送的来判断是否存在SSRF漏洞
2)在页面源码中查找访问的资源地址 ,如果该资源地址类型为 http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞
0x07、SSRF中URL地址过滤的绕过
1、http://www.baidu.com@10.10.10.10 与http://10.10.10.10 请求是相同的
2、ip地址转换成进制来访问(利用八进制、十六进制、十进制、IP地址的省略等写法绕过)
ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS] [-r count] [-s count] [[-j host-list] : [-k host-list]] [-w timeout] target_name
附上SSRF漏洞导图一张