目录遍历漏洞分析:cURL通过Content-Disposition头处理的安全风险
漏洞描述
src/tool_cb_hdr.c文件中的parse_filename函数未能充分验证和清理从HTTP Content-Disposition头提取的文件名,当同时使用-O(远程名称)和-J(远程头名称)选项时,允许目录遍历攻击。
漏洞代码位置
文件: src/tool_cb_hdr.c
函数: parse_filename(约230-300行)
受影响代码路径:
|
|
攻击场景
- 用户运行:
curl -O -J http://malicious-server/file -o "/intended/output/dir" - 恶意服务器响应头:
Content-Disposition: attachment; filename="../../../etc/passwd" - cURL在
/etc/passwd创建文件,而不是在/intended/output/dir/etc/passwd
概念验证
恶意服务器设置: 创建返回恶意Content-Disposition头的简单HTTP服务器
|
|
漏洞利用命令:
|
|
修复建议
|
|
影响
直接影响
- 任意文件写入:攻击者可以在预期输出目录外写入文件
- 文件覆盖:可以覆盖现有系统文件
- 权限提升:以提升的权限运行时,可以修改关键系统文件
攻击向量
- 恶意Web服务器:任何被入侵或恶意的服务器都可以利用此漏洞
- 中间人攻击:在未加密的连接中
- 缓存投毒:如果CDN或代理缓存被入侵
项目响应
oliverkremer 关闭报告并将状态改为"不适用" - 6天前
fandrich (curl staff) 发表评论 - 6天前
“-J的文档说明:如果服务器提供的文件名包含路径,在使用文件名之前会被剥离。因此这个报告听起来确实像是错误行为。不过文档也警告:请谨慎使用此选项,但这不能否定前面的陈述。我也找不到验证此路径剥离的测试。 但是,我无法复现此问题,无论是在git HEAD版本还是7.88.1版本。注意-o选项与-J冲突,最新版本的curl会对此发出警告。用–output-dir替换该选项会导致curl按预期将pwned_file写入该目录;它会忽略Content-Disposition中的路径。你在哪个版本上复现的?”
bagder (curl staff) 请求公开此报告 - 6天前
“根据项目的透明度政策,我们希望所有报告都被公开并公之于众。”
oliverkremer 同意公开此报告 - 6天前
报告详情
- 报告时间: 2025年11月1日 20:40 UTC
- 报告者: oliverkremer
- 报告对象: curl
- 报告ID: #3408126
- 严重程度: 中等(4~6.9)
- 公开时间: 2025年11月1日 21:22 UTC
- 弱点类型: 路径遍历
- CVE ID: 无
- 赏金: 无