大部分web应用都提供了从其他的服务器上获取数据的功能,如使用用户指定的URL,web应用可以获取图片,下载文件,读取文件内容等。如果服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制,就可以可以利用存在缺陷的web应用作为代理攻击远程和本地的服务器。这种形式的攻击称为服务端请求伪造攻击SSRF。
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统,也就是把目标网站当中间人。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。
前言:SSRF漏洞导图

一、危害
目标:从外网无法访问的内网系统
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。
二、理解
首先我们要知道网站访问的步骤:
①用户在地址栏输入网址
②向目标网站发送请求
③目标网站接受请求并在服务器端验证请求是否合法,然后返回用户所需要的页面
④用户接收页面并在浏览器中显示
这里我们以加载图片为例
设访问网址为:http://www.xxx.com/a.php?image=???
SSRF形成原因:目标网站(http://www.xxx.com)接受请求后在服务器端验证请求是否合法,如果服务器端的验证并没有对其请求获取图片的image参数做出严格的过滤以及限制,导致可以从其他服务器的获取一定量的数据。
例如: A网站是一个所有人都可以访问的外网网站,B网站是一个 A网站公司的内部的网站。
访问网址:http://www.a.com/a.php?image=http://www.yyy.com/1.jpg
这个网址是向A网站请求一张其他服务器的一张图片。
Q:如果我们将http://www.yyy.com/1.jpg换为与该服务器相连的内网服务器地址,也就是B网站,会产生什么效果呢?
A:如果存在该内网地址(http://www.b.com)就会返回1xx 2xx 之类的状态码,不存在就会其他的状态码
总结:SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有发现在这个请求是合法的,然后服务器以他的身份来访问其他服务器的资源。
三、挖掘、验证及绕过
1.从web功能上寻找
①分享:通过URL地址分享网页内容
②转码服务:通过URL地址翻译对应文本的内容
③在线翻译:通过URL地址加载或下载图片
④图片、文章收藏功能
⑥未公开的api实现以及其他调用URL的功能
2.从URL关键字中寻找
share wap url link src source target u 3g display sourceURL imageURL domain
3.验证
①因为SSRF漏洞是构造服务器发送请求的安全漏洞,所以我们就可以通过抓包分析发送的请求是否是由服务器的发送的来判断是否存在SSRF漏洞。
②在页面源码中查找访问的资源地址 ,如果该资源地址类型为 http://www.xxx.com/a.php?image=的就可能存在SSRF漏洞。
4.绕过
1、利用解析URL所出现的问题(@)
在某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。这时候可能会出现对URL参数解析不当,导致可以绕过过滤。
例:http://www.baidu.com@192.168.0.1/
当后端程序通过不正确的正则表达式(比如将http之后到com为止的字符内容,也就是www.baidu.com,认为是访问请求的host地址时)对上述URL的内容进行解析的时候,很有可能会认为访问URL的host为www.baidu.com,而实际上这个URL所请求的内容都是192.168.0.1上的内容。
2、利用302跳转
如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用302跳转的方式来进行绕过。
①在网络上存在一个很神奇的服务,http://xip.io 当我们访问这个网站的子域名的时候,例如192.168.0.1.xip.io,就会自动重定向到192.168.0.1。
②由于上述方法中包含了192.168.0.1这种内网IP地址,可能会被正则表达式过滤掉,我们可以通过短地址的方式来绕过。经过测试发现新浪,百度的短地址服务并不支持IP模式,所以这里使用的是http://tinyurl.com所提供的短地址服务。
3、更改IP地址写法
一些开发者会通过对传过来的URL参数进行正则匹配的方式来过滤掉内网IP。
对于这种过滤我们可以采用改编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
四、容易造成漏洞的php函数
1.file_get_contents() //从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。
2.fsockopen() //获取用户指定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。
3.curl_exec() //主要是配合其他协议一起使用curl支持file、dict、gopher、ftp、telnet、http等协议通常攻击中用到的是file,dict,gopher这几个协议。
五、防御
1,过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
2, 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
3,限制请求的端口为http常用的端口,比如,80,443,8080,8090。
4,黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
5,禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp:// 等引起的问题。
引用:http://www.cnblogs.com/s0ky1xd/p/5859049.html
http://www.freebuf.com/articles/web/135342.html
浙公网安备 33010602011771号