Deserialización Insegura Java (LAB)
Lab: Exploiting Java deserialization with Apache Commons
URL = Laboratorio de PortSwigger
Cuando estemos dentro del laboratorio tendremos que abrir BurpSuite para prepararlo para capturar las peticiones que se vaya a realizar dentro del laboratorio.
Para poder empezar con la vulnerabilidad tendremos que capturar la peticion con BurpSuite recargando la pagina una vez que nos hayamos logueado.
Deberemos de introducir las credenciales que nos da PortSwigger:
User: wiener
Pass: peterUna vez dentro, con BurpSuite capturaremos la peticion de login le daremos una vez a Forward y veremos lo siguiente:
GET /my-account?id=wiener HTTP/2
Host: 0a59004a03268b74811f8bb700ce0086.web-security-academy.net
Cookie: session=rO0ABXNyAC9sYWIuYWN0aW9ucy5jb21tb24uc2VyaWFsaXphYmxlLkFjY2Vzc1Rva2VuVXNlchlR/OUSJ6mBAgACTAALYWNjZXNzVG9rZW50ABJMamF2YS9sYW5nL1N0cmluZztMAAh1c2VybmFtZXEAfgABeHB0ACBoNXBwZWM4Yzd0ZDdycWNobXpycm53MHV2MzhtNXB5Y3QABndpZW5lcg%3d%3d
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Sec-Ch-Ua: "Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Referer: https://0a59004a03268b74811f8bb700ce0086.web-security-academy.net/login
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9
Priority: u=0, i
Vemos en la parte de Cookie: session= que esta nuestro codigo serializado en cual sabemos que es vulnerable, por lo que utilizaremos la siguiente herramienta para serializar el comando que queremos ejecutar de la siguiente forma:
Generar payload serializado
URL = Download ysoserial-all.jar
Info:
Codificar payload serializado en URLCode
Obtendremos este codigo en Base64 ahora para que no nos de ningun error lo pasaremos a URLCode viendose asi:
Y la peticion de BurpSuite deberia de quedar algo asi:
Ahora si la enviamos veremos lo siguiente:

Con este mensaje veremos que el comando se ejecuto de forma correcta, por lo que habremos aprovechado dicha vulnerabilidad.
Explicación detallada sobre la técnica
1. ¿Qué es la deserialización y cómo puede ser explotada?
La deserialización es el proceso de convertir datos serializados (generalmente en forma de una cadena de bytes o un archivo) de vuelta a un objeto en memoria en el servidor. Las aplicaciones web que usan Java suelen deserializar estos datos de objetos enviados por los clientes (en tu caso, probablemente una cookie de sesión).
Sin embargo, si este proceso no se maneja de forma segura, puede ser vulnerable a ataques. Un atacante puede manipular los datos serializados (como la cookie de sesión) para incluir un payload malicioso, que, al ser deserializado en el servidor, ejecuta código malicioso. Si el servidor no valida correctamente los datos deserializados, podría ejecutar un comando peligroso (por ejemplo, eliminar archivos, ejecutar programas, etc.).
2. ¿Por qué se considera vulnerable?
En este caso, el servidor está utilizando bibliotecas de deserialización inseguras, como las que se encuentran en Apache Commons (una de las más comunes). Si un atacante logra enviar un objeto malicioso como parte de la solicitud (por ejemplo, a través de una cookie), el servidor, al deserializar ese objeto, podría ejecutar código malicioso.
El payload que envías (como el comando rm /home/carlos/morale.txt) tiene como objetivo eliminar un archivo del sistema como prueba de que el código malicioso fue ejecutado con éxito. Aunque el servidor no haya ejecutado el comando completamente, el hecho de que haya intentado ejecutarlo indica que la vulnerabilidad fue explotada correctamente.
3. Generación del Payload:
Para explotar esta vulnerabilidad, utilizaste una herramienta llamada ysoserial, que está diseñada para generar objetos serializados maliciosos que aprovechan las vulnerabilidades de deserialización en bibliotecas populares. Específicamente, usaste CommonsCollections4, una de las clases más comúnmente afectadas.
El comando que ejecutaste fue:
Este comando genera un payload que, cuando se deserializa en el servidor, intenta ejecutar el comando de eliminación del archivo. El payload generado es un objeto Java serializado que se convierte en una cadena de texto en Base64 para que pueda ser transmitido de manera segura como parte de una URL.
El siguiente paso fue codificar el payload en URL encoding para asegurarse de que se pueda enviar correctamente en una solicitud HTTP:
Este es el payload codificado que se envía en la cookie de la sesión.
4. ¿Por qué ocurre el Internal Server Error (Error 500)?
Cuando el servidor recibe la solicitud con el payload malicioso y lo deserializa, se enfrenta al comando malicioso que le indicaste (rm /home/carlos/morale.txt). Si algo sale mal en este proceso, como un fallo en la ejecución del comando o problemas en la deserialización de objetos, el servidor podría devolver un Internal Server Error (HTTP 500).
Este error puede ocurrir por varias razones:
Fallo en la ejecución del comando: Si el comando
rmno tiene los permisos necesarios para ejecutarse, o si el archivomorale.txtno existe en el sistema, el comando podría fallar, lo que genera un error 500.Inestabilidad del servidor: Si la deserialización del payload afecta la estabilidad del servidor o la integridad de los objetos en memoria, esto podría llevar a un fallo del servidor, causando el error 500.
Excepciones internas: Si el servidor intenta acceder a recursos o ejecutar métodos en objetos deserializados de manera incorrecta, podrían producirse excepciones internas que desencadenan el error 500.
El hecho de que hayas obtenido un error 500 es importante porque confirma que el payload fue procesado por el servidor. Esto indica que el servidor intentó ejecutar el código malicioso, aunque no lo haya logrado con éxito. El error 500 es una señal de que la deserialización falló, pero la vulnerabilidad en el proceso de deserialización fue explotada correctamente.
Last updated