PowerShell 内置curl别名意外执行JavaScript导致安全风险

报告揭示了在Windows PowerShell中使用内置curl别名时,当请求返回包含`<script>alert(1)</script>`的响应内容时,会意外执行其中的JavaScript代码,而非仅显示内容。此问题源于PowerShell对Invoke-WebRequest的别名实现,并非官方curl工具的安全漏洞。

报告 #3442024 - PowerShell 中的 curl 别名在不应执行时运行了 JavaScript

报告人: lim_e 提交日期: 8天前(相对于报告撰写时) 状态: 已公开

问题描述

在 Windows 系统中,当我在 PowerShell 中运行 curl 命令来获取一个本应返回 <script>alert(1)</script> 的脚本时,它却直接执行了该脚本,而这本不应该发生。

我未使用 AI 来发现或报告此漏洞。

受影响版本

在 CMD 中我运行了 curl --version

1
curl 8.16.0 (Windows) libcurl/8.16.0 Schannel zlib/1.3.1 WinIDN

在 PowerShell 中,--version 标志未被识别。我未在这台电脑上安装任何特定的 curl 版本,因此它应该是 Windows 11 自带并随系统更新的默认版本。

复现步骤

  1. 托管一个将返回 <script>alert(1)</script> 的端点(本例中为 ctf.eztfsp.lv:8009/test.js)。
  2. 打开 PowerShell。
  3. 在 PowerShell 中运行 curl ctf.eztfsp.lv:8009/test.js
  4. 会弹出一个窗口,显示“来自网页的消息 1”。

支持材料/参考文献

我已附上一个 .gif 文件,演示了它在 PowerShell 中的工作方式以及在 CMD 中的工作方式。

影响

摘要:

  • 在 PowerShell 的 curl 别名中运行了 JavaScript。
  • 该问题还会导致进程挂起。当警告窗口打开时,我无法使用 Control+C 来停止 curl 进程,因此这可能被用于挂起 PowerShell 脚本。

时间线与讨论

  • lim_e 将报告标题从“runs javascript on embedded browser when it shouldnt”改为“runs javascript on powershell when it shouldnt”。

  • dgustafsson (curl 项目成员) 发表了评论:“感谢你的报告。Curl 不会执行任何内容,这难道不是 PowerShell 的问题吗?”

  • lim_e 回复:“那么你的意思是这应该向微软报告?我理解可能是他们的实现有问题,因为我在工作电脑上测试了,通过 PowerShell 也出现了同样的情况。”

  • bagder (curl 项目成员) 关闭了报告并将状态改为“不适用”,并解释道:

    “在 PowerShell 中它没有识别 --version 标志。那么你运行的就不是 curl。你可能使用了 PowerShell 提供的、调用 Invoke-WebRequest 的 curl 别名。它们与‘真正的’ curl 毫无关系。相关链接:https://daniel.haxx.se/blog/2016/08/19/removing-the-powershell-curl-alias/ 这不是一个 curl 的安全问题。”

  • lim_e 回复:“好的,感谢提供信息,为误报道歉。”

  • bagder 根据项目的透明度政策,要求公开此报告,随后将其公开。

  • lim_e 最后请求:“能否出于安全原因删除此工单。我正在与微软沟通,希望澄清并缓解此漏洞。”

报告元数据

  • 报告 ID: #3442024
  • 报告时间: 2025年11月26日,UTC 上午7:35
  • 报告给: curl
  • 严重性: 未评级 (—)
  • 公开时间: 2025年11月26日,UTC 上午9:32
  • 弱点分类: 网页中脚本相关 HTML 标签的不当中和(基本 XSS)
  • CVE ID:
  • 赏金:
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计