一、漏洞描述
SSRF(Server-Side Request Forgery,服务器端请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的,所以服务端能请求到与自身相连而与外网隔离的内部系统)。
二、漏洞原理
SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制。
例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。SSRF利用存在缺陷的web应用作为代理攻击远程和本地的服务器。
==一句话就是:利用一个可以发起网络请求的服务当做跳板来攻击内部其他服务。==
主要攻击方式如下所示:
- 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
- 攻击运行在内网或本地的应用程序。
- 对内网WEB应用进行指纹识别,通过访问默认文件实现(如:readme文件)
- 攻击内外网的web应用,主要是使用GET参数就可以实现的攻击(如:Struts2,sqli)
- 下载内网资源(如:利用file协议读取本地文件等)
- 进行跳板
- 无视CDN
- 利用Redis未授权访问,HTTP,CRLF注入实现getshell。
三、漏洞种类
1、显示对攻击者的响应(Basic)
它显示对攻击者的响应,因此在服务器获取攻击者要求的URL后,它将把响应发送回攻击者,返回结果到客户端,如传送一个网址,会返回这个网址的界面和对应的html代码。
2、不显示响应(Blind)
和上面正好相反,不会返回结果到客户端,当你从未从初始请求中获取有关目标服务的任何信息时,就会发生这种ssrf。通常,攻击者将提供url,但是该url中的数据将永远不会返回给攻击者。要在这种情况下确认漏洞,攻击者必须使用Burp,DNSbin等类似工具,这些工具可以通过强制服务器向攻击者控制的服务器发出DNS或HTTP请求来确认服务器是易受攻击的,这种ssrf通常易于验证,但难以利用。
3、Semi-ssrf
与Blind相似,这种ssrf不会返回相关结果请求的所有详细信息,但是会暴露一些数据,这可能是部分数据或错误信息,他们为攻击者提供了更多信息。
有时,关于请求的元数据(例如响应时间)也可以视为Semi-ssrf,因此它们允许攻击者验证请求是否成功,这种ssrf通常足以验证漏洞,但并不总是能提取敏感数据。
四、漏洞寻找
能够对外发起网络请求的地方,就可以存在SSRF漏洞。
- 转码服务
- 在线翻译
- 图片加载与下载(通过URL地址加载或下载图片)
- 图片、文章收藏功能
- 网站采集、网页抓取的地方
- 头像的地方(远程加载头像)
- 一切要你输入网址的地方和考研输入ip的地方
- 从URL关键词中找,share、wap、url、link、src、source、target等
简单说说关于SSRF漏洞验证,可以尝试
1、排除法:查看是否是在本地进行了请求
2、使用dnslog等平台进行测试,看是否有ip
3、burpsuite抓包,分析发送的请求是不是通过服务端发送的,因为SSRF要求是从服务端发起的请求,本地请求中不应该包含存在对资源的请求。
五、漏洞相关函数
file_get_contents()、fsockopen()、curl_exec()、fopen()、readfile()等函数使用不当会造成SSRF漏洞。
1、file_get_contents()
这个函数的作用是将整个文件读入一个字符串中,并且次函数是用于把文件的内容读入到一个字符串中的首选方法。
从用户指定的url获取图片,保存在电脑上
2、fsockopen()
fsockopen()函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器简历tcp连接,传输数据。变量host为主机名,errstr表示错误信息将以字符串的信息返回,30为时限。
3、curl_exec()
curl_exec()函数用于执行指定的cURL会话
==注意==
1.一般情况下PHP不会开启fopen的gopher wrapper
2.file_get_contents的gopher协议不能URL编码
3.file_get_contents关于Gopher的302跳转会出现bug,导致利用失败
4.curl/libcurl 7.43 上gopher协议存在bug(%00截断)经测试7.49可用
5.curl_exec()
6.file_get_contents()
六、协议
1、file://
在有回显的情况下,利用file协议可以读取任意文件内容
file:///etc/passwd
2、dict://
字典服务器协议,访问字典资源,泄露安装软件版本信息,查看端口,操作内网redis服务等
dict:///ip:6739/info
3、gopher://
4、http/s
探测内网主机存活
七、curl
curl是常用的命令行工具,用来请求web服务器,它的名字就是客户端的URL工具的意思。
curl -V查看curl支持的协议列表
-v参数输出通信的整个过程
八、远程利用
1、利用file协议
2、利用dict协议
3、利用gopher协议
4、利用http/s协议
九、redis未授权+ssrf
redis常见的SSRF攻击方式大概有以下三种:
1.绝对路径写webshell
2.写ssh公钥
3.写contrab计划任务反弹shell
绝对路径写webshell
这个方法比较常用,也是用的最多的。
构造payload
十、相关绕过
1、攻击本地
2、利用【::】
3、利用@
4、利用短地址
5、利用特殊域名
6、利用DNS解析
7、利用进制转换
8、句号
十一、总结与后记
本篇文章是关于SSRF的学习笔记,请勿用作违规。