技术社区
安全培训
技术社群
积分商城
先知平台
漏洞库
历史记录
清空历史记录
相关的动态
相关的文章
相关的用户
相关的圈子
相关的话题
注册
登录
Vite开发服务器任意文件读取漏洞分析复现(CVE-2025-31486)
MeteorKai
漏洞分析
481浏览 · 2025-04-10 11:33
返回文档
其实上文(CVE-2025-31125)中所说的未公开POC是此处31486的一种。
svg
这种是可以打CVE-2025-31486的。在上一篇CVE的复现中我已经提到了,这里就不说了。
6.2.5修补了上述漏洞。
但是这里还有一种方法:
bypass ensureServingAccess权限校验
这里先给出poc:
在修复CVE-2024-45811时有引入ensureServingAccess对传入的url进行校验,这个poc就绕过了
ensureServingAccess
的校验从而使用raw语法成功读取到了文件
接下来我们看看流程!跟进一下
ensureServingAccesss
,只要
ensureServingAccess
为true即可绕过!
那么我们要如何使其return一个true呢?发现只有一个isFileServingAllowed方法有机会!
此处的关键点其实在于:
跟进一下
fsPathFromUrl
看看
先清洗一下url再
fsPathFromId
一下。
cleanUrl
会使用正则处理url中的第一个
?
或者
#
开始的到结尾的部分进行移除。接着我们再看看
fsPathFromId
,它的作用是将一个模块 ID(通常来自 import 语句)转换为文件系统路径(filesystem path)。
这里解释一下
normalizePath
●
将路径中的反斜杠
\
替换为正斜杠
/
(Windows 兼容)。
●
移除多余的
/
(如
a//b
→
a/b
)。
●
解析相对路径符号(如
./
或
../
)。
接下来我们看看isFileLoadingAllowed函数,它主要用于
检查某个文件路径是否被允许加载
。
●
fs.strict
:若为
false
(非严格模式),
直接允许加载所有文件
(跳过后续检查)。
●
fsDenyGlob
:一个匹配函数,检查文件路径是否命中黑名单(如敏感文件
**/.env
、
**/node_modules/**
)。
●
safeModulePaths
:一个
Set
集合,存放明确允许加载的路径(如项目源码目录)。
●
fs.allow
:一个数组,包含允许的路径规则(如
['/src', '/public']
)。
●
isUriInFilePath
:辅助函数,检查
filePath
是否在某个允许的路径下(如
/src/utils.js
匹配
/src
)。
我们便是在此处返回true的!因为我们自己的根目录是被允许的!
但是通过目录验证后,后续的处理逻辑却又是使用我们原始的url进行处理。
跟一边poc
这里什么都没remove掉,继续跟
然后进入到if判断中:
这里在
rawRE.test
便已经为
true
,那么就会进入
ensureServingAccess
判断。这时我们的url为
/@fs/usr/src/node_modules/vite/?/../../../../../etc/passwd?import&?raw
经过
fsPathFromUrl
的
cleanurl
后url变成了
/@fs/usr/src/node_modules/vite/
。
fsPathFromId
可以理解为一种规范化,url还是上面那样。
接着进入了
isFileLoadingAllowed
方法,我们关注下面这段代码:
检查某个文件路径是否被允许加载,我们跟进
allow
看看:
继续跟进
allow
看这段
allow: raw?.fs?.allow ?? [searchForWorkspaceRoot(root)]
定义允许访问的文件系统路径列表(安全限制)。
●
raw?.fs?.allow
:如果用户显式配置了
raw.fs.allow
,则直接使用。
●
默认值
[searchForWorkspaceRoot(root)]
:若未配置,则自动搜索工作区根目录并设为唯一允许路径。
○
searchForWorkspaceRoot(root)
:Vite 内部函数,从项目根目录(
root
)向上查找包含
pnpm-workspace.yaml
或
lerna.json
的目录(适用于 monorepo)。
○
返回的路径会被添加到
fs.allow
数组中(例如
['/Users/your/project']
)。
那么网站的路径就是默认允许的!这也是我们的poc需要用网站路径的原因,他不能是随机的!!!
然后我们就通过了
ensureServingAccess
,url以最初的poc继续往下走:
http://192.168.79.128:5173/@fs/usr/src/node_modules/vite/?/../../../../../etc/passwd?import&?raw
毋庸置疑,通过了
isImportRequest
,然后进入:
去除掉了
import
变成了
/@fs/usr/src/node_modules/vite/?/../../../../../etc/passwd??raw
然后进入了
这里没有变化,继续往下看。接着进入了
transformRequest
,再进入
doTransform
,然后又进行了一次
removeTimestampQuery
,没有变化。
获得了id
接着进入
loadAndTransform
然后我们进入
load()
通过了
rawRE.test
,没有防御目录穿越,导致了任意文件读取!
0
人收藏
0
人喜欢
转载
分享
0
条评论
某人
表情
可输入
255
字
评论
发布投稿
热门文章
1
契约锁电子签章系统 pdfverifier 远程代码执行漏洞分析(补丁包逆向分析)
2
COFF文件解析 | CoffLdr
3
Java内存马篇——WebSocket内存马及GodZilla二开
4
从零掌握java内存马大全(基于LearnJavaMemshellFromZero复现重组)
5
突破网络限制,Merlin Agent助你轻松搭建跳板网络!
近期热点
一周
月份
季度
1
契约锁电子签章系统 pdfverifier 远程代码执行漏洞分析(补丁包逆向分析)
2
COFF文件解析 | CoffLdr
3
Java内存马篇——WebSocket内存马及GodZilla二开
4
从零掌握java内存马大全(基于LearnJavaMemshellFromZero复现重组)
5
突破网络限制,Merlin Agent助你轻松搭建跳板网络!
暂无相关信息
暂无相关信息
优秀作者
1
T0daySeeker
贡献值:41700
2
一天
贡献值:24800
3
Yale
贡献值:24000
4
1674701160110592
贡献值:21800
5
1174735059082055
贡献值:16000
6
手术刀
贡献值:14000
7
Loora1N
贡献值:13000
8
bkbqwq
贡献值:12800
9
lufei
贡献值:11000
10
xsran
贡献值:10600
目录
bypass ensureServingAccess权限校验
跟一边poc
转载
标题
作者:
你好
http://www.a.com/asdsabdas
文章
转载
自
复制到剪贴板