文章目录
前言
只要稍加不防范,网站就有可能存在SSRF漏洞!
学习链接:SSRF漏洞讲解
一、SSRF原理
- SSRF(Server-side Request Forgery):服务端请求伪造。SSRF的形成大多是由于服务端提供了从其他服务器获取数据的功能,但是没有对目标地址进行过滤和限制。比如:从指定的url地址获取网络文本内容,加载指定地址的图片,或者下载等。
- 攻击的目标是从外网无法访问的内网系统,以服务端为跳板,攻击内网系统。
- 常利用的协议:http/s,dict,file,gopher,ftp等
- 相关 PHP函数:
file_get_contents(),fsockopen(),curl_exec()等 - 攻击的内网应用:redius、mysql、smtp等
- ssrf利⽤存在缺陷的web应用作为代理,攻击远程和本地的服务器。
二、SSRF漏洞利用
1、SSRF漏洞挖掘
从Web功能上寻找(那些需要向服务器发起请求的地方):
图片查看、下载
文件加载、下载
转码服务:通过url地址,把原网页的内容优化为适合手机屏幕浏览
图片、文章收藏功能
在线翻译
通过url地址分享网页内容
未公开的API实现及调用URL的功能等
从URL关键字中寻找:Share、wap、url、link、src、source、target、u、3g、display、sourceURL、imageURL、domain等
漏洞探测工具:burpsite等
2、SSRF危害
1.对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
2.攻击运行在内网或者本地的应用程序。
3.对内网的web应用进行指纹识别(通过请求默认文件得到特定的指纹),对资产信息进行识别。
4.利用file协议读取本地文件。
5.攻击内外网的web应用,主要是使用HTTP GET请求就可以实现的攻击等。
3、SSRF漏洞相关php协议
3.1 file_get_contents() :
file_get_contents():把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
语法:file_get_contents(path,include_path,context,start,max_length)
3.2 fsockopen():
开启这个函数需要php.ini中的allow_url_fopen = On
- fsockopen是用于打开网络的 Socket 链接。
- 语法:fsockopen($host, $port, $errno, $errstr, $timeout)
- 在使用本函数之后会返回文件指针,供文件函数使用,包括 fgets()、fgetss()、fputs()、fclose() 与 feof()。参数 errno 及 errstr 也是可省略的,主要当做错误处理使用。
3.3 curl_exec():
curl_exec : 执行一个cURL会话
4、SSRF漏洞可利用的协议
4.1 http/s
靶场:pikachu
加载图片
查看虚拟机中的文件
探测端口3306
配置权限(否则会出现'xxx' is not allowed to connect to this MySQL server1
的提示)
以上,我们可以利用http协议对内网进行探测,探测整个内网的存活ip,和端口。
可利用burpsite或者脚本进行快速探测,由于回显的不同,脚本就需要按照回显的特征来写,那种回显是存在,哪种回显是不存在这样的ip或端口。
一般私网地址的ip地址都处于10.0.0.0、172.16.0.0、192.168.0.0这样的网段。
4.2 file协议
file协议可用于读取本地文件
访问虚拟机本地文件
4.3 dict协议
dict协议与http协议可用来探测内网的主机存活与端口开放情况
4.4 ftp协议
ftp(file transform protocol):文件传输协议
这里没有输入用户和密码,所以不显示ftp连接的地址下的文件
使用ftp协议查看虚拟机里的文件
ftp服务的安装可以参考这篇文章
ftp服务的搭建
这里我设置的ftp的站点就是虚拟机的ip地址
4.5 gopher协议
- Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,在构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
gopher在各个编程语言中的限制:
–wite-curlwrappers:使用curl工具打开url数据流
协议格式
URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
- 使用gopher协议时,回车换行输入%0d%0a,空格输入%20,问号输入%3f,结束符%0d%0a
- SSRF漏洞在真实环境常常去攻击redis、FastCGI等服务。
(我看网上都是在使用Linux操作系统作攻击实验的。所以以后有时间再研究清楚这个协议吧)
三、SSRF绕过
@绕过
从@后面开始解析。利用的原理:解析URL时的规则问题。
点分割号绕过
封闭字符符号
url十六进制转换
进制转换绕过
有些ssrf防护措施,会对输入的URL做正则匹配,限制内网地址,比如192、127这些地址,但如果转换成其他格式的ip地址,可能会绕过
利用30X重定向
可以使用重定向来让服务器访问目标地址,可用于重定向的HTTP状态码:300、301、302、303、305、307、308。
需要一个vps,把302转换的代码部署到vps上,然后去访问,就可跳转到内网中
DNS解析
配置域名的DNS解析到指定的目标地址
DNS重绑定
在网页浏览过程中,用户在地址栏中输入包含域名的网址。浏览器通过DNS服务器将域名解析为IP地址,然后向对应的IP地址请求资源,最后展现给用户。而对于域名所有者,他可以设置域名所对应的IP地址。当用户第一次访问,解析域名获取一个IP地址;然后,域名持有者修改对应的IP地址;用户再次请求该域名,就会获取一个新的IP地址。对于浏览器来说,整个过程访问的都是同一域名,所以认为是安全的。这就造成了DNS Rebinding攻击。
简而言之:当我们发起域名解析请求的时候,第一次访问会返回一个ip地址A,但是当我们发起第二次域名解析请求的时候,却会返回一个不同于A的ip地址B。可以通过DNS重绑定攻击绕过同源策略,进而攻击内网的其他设备。
DNS重绑定
协议绕过
http/s,file,ftp,dict,gopher等协议绕过
四、SSRF防御
SSRF漏洞的防御主要是保证用户请求的合法性、服务器行为的合规性两个方面。
1、禁止高危协议。限制请求端口只能为web端口,只允许访问HTTP和HTTPS的请求;
2、过滤返回的信息,验证远程服务器对请求的返回结果是否合法;
3、禁止不常使用的端口
4、限制不能访问内网的IP,防止对内网进行攻击;
5、禁止302跳转,或者每跳转一次都进行校验目的地址是否为内网地址或合法地址。
6、对于DNS重绑定,使用DNS缓存或者Host白名单。
7、统一错误信息,避免黑客通过错误信息判断端口对应的服务
关于SSRF还有很多需要学习的地方,这里我只是简单地了解了一下它的基本原理。具体的以后再做探讨。