SSRF

0x00原理

一般的请求:客户端发起请求,服务器响应。

另外一种请求:客户端发起请求(向服务端提供一个URL),服务端向客户端提供的URL发起请求,然后把获得的响应内容返回给客户端。如:


SSRF_第1张图片

服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,下载等等,就可能存在这种服务端请求伪造的缺陷。Google,Facebook,Adobe,baidu,tencent等知名公司都被发现过这种漏洞。

0x01危害

攻击者利用ssrf可以实现的攻击主要有5种:

1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;

2.攻击运行在内网或本地的应用程序(比如溢出);

3.对内网web应用进行指纹识别,通过访问默认文件实现;

4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);

5.利用file协议读取本地文件等。


常用的利用思路:

内网探测->应用识别->攻击Payload->Payload Result

1.内网探测: 内网主机信息收集

2.应用识别: 主机应用识别(可以通过Barner和应用指纹进行识别)

3.攻击Payload: 根据应用识别的应用,加载不同的攻击Payload(最常用莫属于Struts2)

4.Payload Result: 返回相应Payload的执行信息


为什么通过http协议访问可以同其它协议的端口进行数据交互呢?

跨协议通信技术利用:http://www.freebuf.com/articles/web/19622.html

0x02漏洞挖掘

一切从客户端提交的含有URL的参数都可能存在SSRF漏洞。

常见存在漏洞的场景如下:

1、分享功能:通过URL地址分享网页内容。

2、在线转码服务:把网页内容(URL)在线转码为适合手机浏览的样式。

3、在线翻译:通过URL地址翻译对应文本内容。

4、远程图片加载、下载:通过URL加载图片或者下载图片。如:http://www.example.com/picture?url=http://image.example.com/1.jpg

5、图片、文章收藏功能:类似于场景1,通过URL收藏到在线收藏夹

6、未公开的api实现以及其他调用URL的功能:此处类似的功能有360提供的网站评分,以及有些网站通过api获取远程地址xml文件来加载内容。

常见的存在漏洞的参数:

share、wap、url、link、、src、source、target、u、3g、display、sourceURl、imageURL、domain...

可以结合google语法及上述关键字进行搜索验证。

常见的容易出问题的函数:

PHP : file_get_contents()、fsockopen()、curl_exec()

JAVA : Request类,URL类的openStream,HttpClient类,URLConnection和HttpURLConnection类

漏洞验证

1、排除法

确认目标参数中的URL请求是从客户端发起还是从服务端发起的。

如: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截断图片的请求,默认是放行的)


SSRF_第2张图片

2、实例验证

首先要进行信息收集,以获得目标内网地址,收集途径:

a.敏感信息泄露

b.漏洞平台历史信息中存在目标内网信息

c.通过二级域名等暴力猜解工具模糊猜测内网地址

收集到内网地址后,就可以进行实例验证,是否可以请求内网地址、端口、资源等。

批量验证某个ip地址段端口开放情况可以用burp的爆破功能或者自己写py脚本。

0x03绕过方法

下文出现的192.168.0.1,10.0.0.1全部为服务器端的内网地址。

1、更改IP地址写法

一些开发者会通过对传过来的URL参数进行正则匹配的方式来过滤掉内网IP,如采用如下正则表达式:

^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$

^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$

^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$

对于这种过滤我们可以采用改编IP的写法的方式进行绕过,例如192.168.0.1这个IP地址我们可以改写成:

(1)、8进制格式:0300.0250.0.1

(2)、16进制格式:0xC0.0xA8.0.1

(3)、10进制整数格式:3232235521

(4)、16进制整数格式:0xC0A80001

还有一种特殊的省略模式,例如10.0.0.1这个IP可以写成10.1

2、利用解析URL所出现的问题

在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。

http://[email protected]/

当后端程序通过不正确的正则表达式(比如将http之后到com为止的字符内容,也就是www.baidu.com,认为是访问请求的host地址时)对上述URL的内容进行解析的时候,很有可能会认为访问URL的host为www.baidu.com,而实际上这个URL所请求的内容都是192.168.0.1上的内容。

3、利用302跳转

如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用302跳转的方式来进行绕过。

(1)、在网络上存在一个很神奇的服务,http://xip.io当我们访问这个网站的子域名的时候,例如192.168.0.1.xip.io,就会自动重定向到192.168.0.1。

(2)、由于上述方法中包含了192.168.0.1这种内网IP地址,可能会被正则表达式过滤掉,我们可以通过短地址的方式来绕过。经过测试发现新浪,百度的短地址服务并不支持IP模式,所以这里使用的是http://tinyurl.com所提供的短地址服务,如下图所示:

SSRF_第3张图片

同样的,我们也可以自行写一个跳转的服务接口来实现类似的功能。

4、通过各种非HTTP协议:

如果服务器端程序对访问URL所采用的协议进行验证的话,可以通过非HTTP协议来进行利用。

(1)、GOPHER协议:通过GOPHER我们在一个URL参数中构造Post或者Get请求,从而达到攻击内网应用的目的。例如我们可以使用GOPHER协议对与内网的Redis服务进行攻击,可以使用如下的URL:

(2)、File协议:File协议主要用于访问本地计算机中的文件,我们可以通过类似file:///文件路径这种格式来访问计算机本地文件。使用file协议可以避免服务端程序对于所访问的IP进行的过滤。例如我们可以通过file:///d:/1.txt 来访问D盘中1.txt的内容

(3)、DICT协议

5DNS Rebinding

对于常见的IP限制,后端服务器可能通过下图的流程进行IP过滤:

SSRF_第4张图片

对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就pass掉。

但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间查,利用这个时间差,我们可以进行DNS 重绑定攻击。

要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。这样就可以进行攻击了,完整的攻击流程为:

(1)、服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP

(2)、对于获得的IP进行判断,发现为非黑名单IP,则通过验证

(3)、服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。

(4)、由于已经绕过验证,所以服务器端返回访问内网资源的结果。

0x04实战案例

wooyun漏洞库案例

weblogic的uddiexplorer,这个好像比较常见一些

其它待收集补充

0x05防御思路

通常有以下5个思路:

1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。

3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。

4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。

5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。

6、禁止302跳转

7、使用gethostbyname()判断请求是否为内网ip。 要结合6来使用

其中3、4、5可以通过网络防火墙或者主机防火墙来实现。

0x06参考

SSRF攻击实例解析:http://www.freebuf.com/articles/web/20407.html

SSRF漏洞的挖掘经验:http://bobao.360.cn/learning/detail/240.html

跨协议通信技术利用:http://www.freebuf.com/articles/web/19622.html

关于SSRF攻击:http://evilcos.me/?p=221

SSRF的新纪元:在编程语言中利用URL解析器:http://bobao.360.cn/learning/detail/4183.html

你可能感兴趣的:(SSRF)