记一次不小心写出的路径遍历漏洞
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这样就获取到了原定路径之外的文件
如下:

解决
- 做边界校验
- 将传入的参数转换后再进行读写操作
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
记一次不小心写出的路径遍历漏洞
https://ysone.top/posts/dir-traversal-record/







