SSRF的原理
SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
SSRF的成因
file_get_contents造成的SSRF
<?php
$url=$_GET['cmd'];
file_get_contents($url);
?>
fsockopen造成的SSRF
SSRF原理
产生的危害:
- 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
- 攻击运行在内网或本地的应用程序(比如溢出);
- 对内网web应用进行指纹识别,通过访问默认文件实现;
- 攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sali等);
- 利用file协议读取木地文件等。
寻找SSRF漏洞
从WEB功能上寻找
1)分享:通过URL地址分享网页内容:
2)转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览3)在线翻译:通过URL地址翻译对应文本的内容。提供此功能的国内公司有百度、有道等
4)图片加载与下载:通过URL地址加载或下载图片
5)图片、文章收藏功能
6)未公开的api实现以及其他调用URL的功能从URL关键字中寻找
一些的url中的关键字:share,wap,url、link,src,source,target,u,3g、display,sourceURI,imageURL,domain Google doking:inurl:imageURL=验证SSRF漏洞
- 排除法:浏览器f12查看源代码看是否是在本地进行了请求
- 利用Ceye等平台进行测试,查看访问的回显。
- 抓包分析发送的请求是不是由服务器的发送的,如果不是客户端发出的请求,则有可能是,接着找存在HTTP服务的内网地址
- 从漏洞平台中的历史漏洞寻找泄漏的存在web应用内网地址
- 通过二级域名暴力猜解工具模糊猜测内网地址
- 留意直接返回的Banner、title、content等信息
-
利用SSRF漏洞
让服务端去访问相应的网址
- 让服务端去访问自己所处内网的一些指纹文件来判断是否存在相应的cms
- 可以使用file,dict、gopher[11]、ftp协议进行请求访问相应的文件
- 攻击内网web应用(可以向内部任意主机的任意端口发送精心构造的数据包[payload))
- 攻击内网应用程序(利用跨协议通信技术)
- 判断内网主机是否存活:方法是访问看是否有端口开放
DoS攻击(请求大文件,始终保持连接keep-alive always)
本地利用
SSRF的绕过技巧
一些常见的绕过方式:
利用@
- 利用特殊的域名
- 利用Enclosed alphanumerics
- 利用句号
- 利用进制转换
- 利用协议
更多:https://www.secpulse.com/archives/65832.html
SSRF的审计实战
一道审计CTF题
进行解析
修复建议
过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态。
限制请求的端口为http常用的端口,比如,80,443,8080,8090。
黑名单内网ip。避免应用被用来获取获取内网数据,攻击内网。
禁用不需要的协议。仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://等引起的问题。