1.什么是SSRF:
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要目标网站的内部系统。(因为他是从内部系统访问的,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当中间人),所以也叫中间人攻击。
2.SSRF形成原因:
SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档等等。
3.SSRF结构图:
如上图所示: A网站,是一个所有人都可以访问的外网网站,B网站是一个他们内部的OA网站,我们普通用户只可以访问a网站,不能访问b网站。但是我们可以同过a网站做中间人,访问b网站,从而达到攻击b网站需求。我们正常访问A网站的时候:输入A网站URL --> 发送请求 --> A服务器接受请求(没有过滤)并处理 -->返回用户响应,此时,有一个网站请求:www.xxx.com/xxx.php?image=URL,如果是安全的网站应接收请求后,会检测请求的合法性,如果是一个不安全的网站,比如对请求没有过滤或安全检测的网站,服务器端的验证并没有对其请求获取图片的参数(image=)做出严格的过滤以及限制,导致A网站可以从其他服务器的获取数据。
简单的解析SSRF:SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法的,然后服务器以他的身份来访问其他服务器的资源。
4.SSRF的用途:
4.1可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
4.2攻击运行在内网或本地的应用程序(比如溢出);
4.3对内网web应用进行指纹识别,通过访问默认文件实现;
4.4攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
4.5利用file协议读取本地文件等。
5.SSRF出现的位置:
个人觉得所有调用外部资源的参数都有可能存在SSRF漏洞,但是这里还是要书面化总结一下:
5.1分享:通过URL地址分享网页内容
5.2转码服务
5.3在线翻译
5.4图片加载与下载:通过URL地址加载或下载图片
5.5图片、文章收藏功能
5.6未公开的api实现以及其他调用URL的功能
5.7从URL关键字中寻找
5.7.1share
5.7.2wap
5.7.3url
5.7.4link
5.7.5src
5.7.6source
5.7.7target
5.7.8imageURL
5.7.9sourceURL
5.7.10domain
6.SSRF验证:(pikachu)漏洞验证平台
6.1url
这个时候,如果在url后更换为www.baidu.com
页面跳转到百度。
6.2读取对方文件
成功读取了对方盘符的txt文件,但是php文件在这里请求是无法读取的,这取决于php代码里面的过滤函数,已经过滤了php的尖括号,导致这个问题出现的原因是在源代码文件中,将接受进来的参数直接执行返回给前端,只做了简单的非空判断
6.3dict获取目标服务器端口上运行的服务版本信息
6.4探测对方3306端口
7.SSRF的防护方法
7.1黑名单
7.1.1过滤10.0.0.0/8 、172.16.0.0/12、192.168.0.0/16、localhost私有地址、IPv6地址
7.1.2过滤file:///、dict://、gopher://、ftp:// 、危险的schema函数
7.1.3对返回的内容进行识别
7.1.4内网服务开启鉴权(Memcached, Redis, Elasticsearch and MongoDB)
7.2最佳防护
7.2.1使用地址白名单
7.2.2对放回内容进行识别
7.2.3需要使用互联网资源但是又不能使用白名单的情况:首先禁用 CURLOPT_FOLLOWLOCATION,然后通过域名获取目标ip,并过滤内部ip;最后识别返回的内容是否与假定内容一致