记一次不小心写出的路径遍历漏洞

366 字
2 分钟
记一次不小心写出的路径遍历漏洞

依旧前言:#

警告

nodejs及其他运行时 的大部分库都可以处理../跳转到父目录

代码经验不足(是我了) 容易在文件操作时忽略此问题 直接将路径拼接

导致路径遍历漏洞(Directory traversal) 攻击者可以传入带../的参数引导后端读取任何路径下的文件(理论可以实现 只是时间问题)

Upload Higher Fps项目起初完全由后端服务器(api.ysone.top)处理转换代码 前端通过/low2high?mode=download&id=???访问直接返回转换后的视频文件

代码直接拼接将patched_url.query.id与目的路径进行拼接 没考虑到../的情况 这就导致了路径遍历漏洞

复现#

原处理代码:

const file_path = path.resolve(output_f, patched_url.query.id + ".mp4")
if (!fs.existsSync(file_path)) {
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.end(`无文件! 可能是服务器自动删除 请重新上传下载`)
return;
}
//跳过一些代码
const fs_stream = fs.createReadStream(file_path)
fs_stream.pipe(res)

直接将patched_url.query.id + ".mp4"output_f拼接 还好处理逻辑不公开并且限定mp4后缀 这样写很危险

举个例子:

//正常用法:
const a = "filename.txt" //外来可变变量
const target_path = path.resolve("/home/username/server/target_f/", a)
//target_path为"/home/username/server/target_f/filename.txt"
//被滥用:
const a = "../../filename.txt" //外来可变变量
const target_path = path.resolve("/home/username/server/target_f/", a)
//target_path为"/home/username/server/target_f/../../filename.txt"
//等效为/home/username/filename.txt

这样就获取到了原定路径之外的文件

如下:

解决#

  1. 做边界校验
  2. 将传入的参数转换后再进行读写操作

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

记一次不小心写出的路径遍历漏洞
https://ysone.top/posts/dir-traversal-record/
作者
YS_One
发布于
2026-07-13
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
YS_One
正在
获取
公告
博客已恢复!
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
5
分类
4
标签
13
总字数
3,242
运行时长
0
最后活动
0 天前
站点信息
站点域名
ysone.top
文章许可
CC BY-NC-SA 4.0

文章目录