Laboratorio: Desarrollo de una cadena de gadget personalizada para la deserialización de Java
Last updated
Last updated
Lo primero será buscar el codigo fuente de la app, a ver donde lo encontramos:
Aqui está en el endpoint /backup/AccessTokenUser.java
También encontré /backup/ProductTemplate.java
que tiene otra parte super importante:
Parece que el ataque lo debo llevar por el ID que está serializado por la cookie ahí creo que debo meter un SQL Injection para que me retorne la contraseña de admin o algo por el estilo, ya que analizando bien la consulta SQL que se hace no está sanitizada el comando ID que se pasa en la consulta se concatena y además de ello no está sanitizado se interpreta directamente con la entrada del usuario, asi que usaremos el productTemplate para llamarlo en el main y crear un objeto de tipo ProductTemplate que tenga como parametro la SQL Injection.
rO0ABXNyACNkYXRhLnByb2R1Y3RjYXRhbG9nLlByb2R1Y3RUZW1wbGF0ZQAAAAAAAAABAgABTAACaWR0ABJMamF2YS9sYW5nL1N0cmluZzt4cHQAXycgVU5JT04gU0VMRUNUIE5VTEwsIE5VTEwsIE5VTEwsIENBU1QocGFzc3dvcmQgQVMgbnVtZXJpYyksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgRlJPTSB1c2Vycy0t
' UNION SELECT NULL, NULL, NULL, CAST(password AS numeric), NULL, NULL, NULL, NULL FROM users--
Compruebo la comilla simple, apostrofe '
1' UNION SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL--
Con null’s hasta comprobar cual no me retorna errores, en este caso 8 null’s pero junto con UNION efectivamente, el 1 es para crear una tabla de consulta.
' UNION SELECT NULL, NULL, NULL, password, NULL, NULL, NULL, NULL FROM users--
Verificar que se puede seleccionar la columna password de la tabla users e insertarla en el resultado de la consulta original, y en la posición correcta, ya que el orden de las columnas es muy importante.
' UNION SELECT NULL, NULL, NULL, CAST(password AS VARCHAR), NULL, NULL, NULL, NULL FROM users--
Intentar convertir la columna password a VARCHAR, que suele ser el tipo de dato correcto, pero es posible que no nos deje pasar alguna validación de tipo de datos por como se muestra por pantalla.
' UNION SELECT NULL, NULL, NULL, CAST(password AS numeric), NULL, NULL, NULL, NULL FROM users--
→ displays the password in the error message.
Pareciera que esa pudiese ser la contraseña de Administrator.
Efectivamente la contraseña es: v12bt7itoymlt0u98ou4
Normalmente luego de un rato si uno no se está moviendo en el lab se retorna un 500 error, así que toca esperar, al rato cuando volví a ingresar al lab la contraseña de administrator no me funcionó esto es porque basicamente el lab genera una nueva en cada ingreso al lab, eso es lo que parece, el error de ahora me retornó otra contraseña, así que siempre se mantiene actualizando →
0d8em1q8i71zyolir6xw
En esencia lo importante de este laboratorio es poder comprender como un código funcional en una aplicación uno como atacante lo puede abstraer para que su misma funcionalidad pueda ser parte de un ataque encadenado de uno como atacante, en este caso aprovechamos el atributo id
de la clase ProductTemplate; para llamarlo e instanciarlo como un nuevo objeto pasandole el parametro de la consulta SQL que es la que ibamos a inyectar porque como sabiamos que la consulta SQL legitima concatenaba el atributo id
era cuestión de simplemente entonces crear el payload SQL, todo ocasionado por esta parte de aqui:
Y aprovechabamos y lo instanciabamos en el main con su parametro malicioso: *
Ruby:
Github Mio con el código: