curl -H 空格前缀导致代理模式下的头部注入漏洞分析

本文详细分析了curl在使用--proxy参数时,-H选项前导空格导致的HTTP头部注入漏洞。通过复现步骤和代码示例展示了攻击向量,并讨论了潜在的安全影响和修复建议。

curl -H 空格前缀导致代理模式下的头部注入

漏洞概述

在curl 8.11.0版本中,当使用--proxy参数时,-H选项如果包含前导空格,会导致HTTP头部被注入到前一个头部中,而不是作为新的独立头部发送。

环境信息

  • 操作系统:macOS Sequoia 15.1
  • curl版本:8.11.0 (aarch64-apple-darwin24.1.0)
  • 影响条件:必须使用--proxy参数

复现步骤

基本复现案例

1
2
3
4
curl -X GET "https://example.com" \
-H "Secure-Header: XYZ" \
-H " new-header-that-will-inject-to-previous-header: value" \
--proxy 127.0.0.1:8080

结果分析

带有前导空格的头部会被注入到前一个头部中,形成:

1
Secure-Header: XYZ new-header-that-will-inject-to-previous-header: value

无代理模式下的正常行为

1
2
curl -X GET "https://example.com" \
-H " new-header-that-will-inject-to-previous-header: value"

在无代理模式下,头部正常发送,每个头部占据独立行。

文件输入方式

该漏洞同样影响通过文件输入头部的情况:

1
curl -H @file.txt --proxy 127.0.0.1:8080

其中file.txt内容以空格开头时也会触发此行为。

安全影响

  1. 头部注入:攻击者可能通过控制输入文件或单个头部名称,构造畸形请求
  2. Host头部注入:特定情况下可能注入到Host头部,导致错误日志记录
  3. 服务器端解析问题:畸形请求可能导致服务器端解析异常

技术细节

  • 仅影响HTTPS请求
  • 需要代理参数存在
  • 空格的头部字段名会被curl移除,但格式为[space]something:something的头部会被保留并触发注入

解决方案建议

由于HTTP头部字段名不能包含空格,建议curl在处理时:

  1. 去除前导空格
  2. 始终将每个头部添加到新行

项目响应

curl团队认为此行为是文档化特性而非漏洞,HTTP/1协议允许代理进行头部折叠。该报告最终被标记为"Not Applicable"。


注意:虽然该问题被认定为预期行为,但开发人员在使用curl时应意识到这种空格处理特性可能带来的安全影响。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计