一、SSRF简介
服务器端请求伪造(SSRF)是指攻击者能够从易受攻击的Web应用程序发送精心设计的请求,对其他网站进行攻击,简单地说,就是利用一个可发起网络请求的服务当作跳板来攻击其他服务。
攻击者A利用服务器B,访问服务器C。
一种简单的方法 :攻击者要求服务器为其访问URL
#在这里,example.com从其服务器再去访问http://google.com
#假设谷歌的内网有许多内网服务器,我们就可以访问其内网了,可以探测内网的信息
GET /?url=http://google.com/ HTTP/1.1
Host:example.com
翻译的流程:
方案A:
(1)用户请求目标站点
(2)翻译网站会获取用户浏览器上的目标站点的数据
(3)翻译网站返回翻译后的数据
方案B:
(1)用户提供网址给翻译网站
(2)翻译网站代替用户访问,得到目标数据
(3)翻译网站返回翻译后的数据
网址翻译
有道翻译
方案B就像肉鸡。
公网IP:任何人都可以访问
内网IP:处于同一内网的用户才可以访问
外紧内松,内网极度脆弱,例如在内网渗透中,弱密码很常见
二、SSRF示例
#以下代码有SSRF漏洞,开设在80端口
#81端口也有网站,但防火墙没有打开81端口,只有内网能够访问
#使用SSRF漏洞,突破外网边界
#http://172.2.5.1/?url=http://127.0.0.1:81
$URL = $_GET['url'];
$CH = CURL_INIT();
CURL_SETOPT($CH, CURLOPT_URL, $URL);
CURL_SETOPT($CH, CURLOPT_HEADER, FALSE);
CURL_SETOPT($CH, CURLOPT_RETURNTRANSFER, TRUE);
CURL_SETOPT($CH, CURLOPT_SSL_VERIFYPEER, FALSE);
CURL_SETOPT($CH, CURLOPT_FOLLOWLOCATION, TRUE);
$RES = CURL_EXEC($CH);
CURL_CLOSE($CH);
echo $RES;
SSRF的核心是攻击内网
SSRF的用处:
(1)扫描内部网络(FingerPrint)
(2)向内部任意主机的任意端口发送精心构造的数据包(Payload)
(3)DOS(请求大文件,始终保持连接Keep-Alive Always)
(4)暴力穷举(users/dirs/files)
SSRF的危害:
(1)作为跳板
(2)攻击内网网站
(3)攻击内网服务
假设得到了一个SSRF漏洞,就可以攻击内网服务器,如果内网服务器存在远程代码执行,就可以直接访问地址getshell,而且在访问127.0.0.1时有些防火墙不拦截。
网站使用已知漏洞组件的原因:
(1)使用的时候无漏洞
(2)爆发漏洞,管理员不知道
(3)漏洞修复可能影响业务
(4)内网本身不会被黑客访问
三、SSRF漏洞防御
1、正则匹配
#不允许在http后添加内网IP地址,即http://内网IP不被允许
#www.baidu.com只是掩饰,内网IP地址59.5.20.78:81才是重点
http://www.baidu.com@59.5.20.78:81
#不允许在http后添加内网IP地址,不允许出现@IP
#DNS域名解析服务器
#DNS域名,其实是访问127.0.0.1
#通过访问DNS域名,绕过
http://p6qc5i.dnslog.cn
#不允许在http后添加内网IP地址,不允许出现@IP
#访问其余内网IP
#第一种方法是搭建域名
#第二种方法是使用xip.io网站
http://59.5.20.78.xip.io
CSRF:控制受害者的浏览器发起网络请求
SSRF:控制目标服务器发起网络请求
四、其他协议
file协议:本地文件读取
file:///E:/phpStudy2016/WWW/1.html
http://172.2.5.1/?url=file:///E:/phpStudy2016/WWW/1.html
dict协议:原本为字典协议,可以探测端口
#探测有无80端口
dic://127.0.0.1:80
可以使用Burp探测服务器开放了什么端口
在现实中,SSRF遇到的概率较小
gopher协议:可以构建数据包发送
Redis安装好之后,默认情况下,缓存数据库没有密码,但是只有本机可以反问
五、如何挖掘SSRF
能够对外发起网络请求的地方,就可能存在SSRF漏洞。
出现SSRF的原因,很有可能是存在高危传参:
1、传参出现协议,http
2、传参出现文件名,x.后缀
(1)文件读取
baidu.com/?id=1.php
(2)文件包含
(3)任意文件下载