SSRF服务器端请求伪造漏洞漏洞
一、SSRF介绍
SSRF(Server-Side Request Forgery,服务器端请求伪造):可以通过伪造服务器端发起的请求,从而获取客户端所不能得到的数据。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
原因:
SSRF漏洞形成的原因主要是服务器端所提供的接口中包含了所要请求的内容的URL参数,并且未对客户端所传输过来的URL参数进行过滤,利用存在缺陷的WEB应用作为代理攻击远程和本地的服务器。
类型
SSRF也区分为回显型SSRF和非回显型SSRF,回显型可以将访问到的信息返回给攻击者,非回显型则需要通过dns log或者访问开放/未开放的端口导致的延时来判断
二、SSRF危害
信息泄露
对外网、服务器所在内网、服务器本地进行端口扫描,获取一些服务的banner信息等。
对内网Web应用进行指纹识别,识别企业内部的资产信息。
利用file协议读取服务器本地文件等。
内网穿透
进行跳板攻击等
攻击运行在内网或服务器本地的其他应用程序,如redis、mysql等
攻击内外网的Web应用,主要是使用HTTP GET/POST请求就可以实现的攻击,如sql注入、文件上传等
三、SSRF容易出现的地方
1.社交分享功能:获取超链接的标题等内容进行显示
2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3.在线翻译:给网址翻译对应网页的内容
4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
8.数据库内置功能:数据库的比如mongodb的copyDatabase函数
9.邮件系统:比如接收邮件服务器地址
10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞 一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……
12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)
四、SSRF相关函数利用
函数
在PHP中经常出现ssrf的函数curl、file_get_contents和fsockopen
协议
cURL支持的协议也如下几种:
http:// (访问HTTP网址,用于探测内网主机存活)
file:/// (本地文件传输协议,用于读取本地计算机中的文件)
dict:// (泄露安装软件版本信息,查看端口,操作内网redis服务)
gopher:// (gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求)
//gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
sftp:// (文件传输协议,会把数据加密后进行传输)
tftp:// (基于UDP数据报文件传送协议,不支持交互)
其中gopher协议和dict协议就是我们需要的。利用gopher,dict协议,我们可以构造出相应payload直接攻击内网的redis服务。
查看curl的版本和该版本支持的协议
注意点
1. file_get_contents的gopher协议不能 UrlEncode
2. file_get_contents关于Gopher的302跳转有bug,导致利用失败
3. curl/libcurl 7.43上gopher协议存在bug(截断),7.45以上无此bug
4. curl_exec()默认不跟踪跳转
5. file_get_contents() 支持php://input协议
五、靶场练习
curl
1.利用file协议读取任意文件内容
file:///var/www/html/index.php
file:///etc/passwd
2.利用http协议进行内网访问
url=http://127.0.0.1/vul/xss/xss.php
3.利用dict协议进行端口、主机扫描、执行命令
命令格式:
ditc://ip:port
ditc://ip:port/命令
端口:dict://127.0.0.1:22
内网主机:dict://192.168.175.100:80
服务指纹:dict://127.0.0.1:6379/info
然后用burp上的爆破模块扫描端口或者主机
4.利用gopher协议发送GET、POST请求包
命令格式:
gopher://ip:port/_TCP/IP数据流
注意:
gopher协议数据流中,url编码使用%0D%0A替换字符串中的回车换行
数据流末尾使用%0D%0A代表消息结束
先将数据包转换URL编码
将编码中的%0A转换成%0D%0A
再进行一次URL编码
使用gopher协议