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
curl -X GET "https://example.com" -H "Secure-Header: XYZ" -H " new-header: value" --proxy 127.0.0.1:8080

结果分析

当第一个头部本身包含空格时,行为会再次附加到前一个头部:

1
curl -X GET "https://example.com" -H " new-header: value" --proxy 127.0.0.1:8080

正常行为对比

不使用代理参数时,行为正常,头部会以新行发送:

1
curl -X GET "https://example.com" -H " new-header: value"

文件输入方式

该漏洞同样适用于通过文件输入头部的情况:

1
curl -X GET "https://example.com" -H @file.txt --proxy 127.0.0.1:8080

其中file.txt文件内容以空格开头。

潜在攻击场景

虽然暂无具体的利用场景,但由于curl的广泛使用,可以想象在某些情况下:

  1. 通过@file.txt方式输入头部
  2. 单个头部名称输入可能被攻击者控制
  3. 导致向服务器发送格式错误的请求

严重请求示例

1
curl -X GET "https://example.com" -H " new-header: value" -H @headers2.txt -H 'User-Agent:' -H 'Accept:' --proxy 127.0.0.1:8080

这种情况下,头部会直接附加到Host头部,可能导致:

  • 不正确的日志记录
  • 根据程序逻辑引入其他问题

技术细节

  • 仅影响HTTPS请求
  • 头部字段名不能包含空格
  • 建议解决方案:去除空格并始终添加到新行

官方回应

curl团队认为这是文档记录的行为,man页面中明确指出:

  • curl会原样传递给定的字符串,不进行任何过滤或安全保护
  • 包括空白字符和控制字符
  • 在HTTP/1中,可以通过代理传递"折叠"头部

影响评估

通过-H选项实现的前一头部/前一行的注入漏洞,评级为中等严重性(4-6.9分)。

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