🧅Laboratorio: Modificar los tipos de datos en serie

Con base a lo que aprendimos sobre la serialización insegura de objetos basados en la derivación de tipo de datos, podemos entonces proceder a intentar realizar alguna modificación del objeto serializado que está en la cookie de sessión:

Pista:

Como pequeña pista nos dan la peculiaridad de PHP, justo lo que estabamos estudiando, así que con ello en mente vamos a ver la SESSION

  • Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjY6IndpZW5lciI7czoxMjoiYWNjZXNzX3Rva2VuIjtzOjMyOiJnb2R6c2MycTY2bTBzOWw0bWJ2NXBxZnlmMXlrdTY0ZyI7fQ%3d%3d

Decodificamos la cookie como el anterior Lab. (Decode URL→Decode Base64)

  • Le metimos un 0 a la cookie en la parte tokenSession, devolvió esto:

Encontré el error de porque no me había estado funcionando, basicamente porque si analizamos la estructura de la cookie decodificada:

O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"godzsc2q66m0s9l4mbv5pqfyf1yku64g";}

La key ”s” es la longitud del valor, en este caso si yo le agrego un numero al access_token para bypassear los controles de acceso como administrador, estoy añadiendo un nuevo elemento el cual es un numero y debo o añadirle s:33 o s:1 porque todo se va a tomar como un entero, una de las dos.

Tal cual como lo dice la pagina de portswigger →

Entonces modifiquemos pues:

O:4:"User":2:{s:8:"username";s:6:"wiener";s:12:"access_token";s:32:"godzsc2q66m0s9l4mbv5pqfyf1yku64g";}
//Vamos a ponerle primero una longitud de 33 poniendo un 0 delante de todo el access token: y el administrator con la longitud 13
O:4:"User":2:{s:8:"username";s:13:"administrator";s:12:"access_token";s:33:"0godzsc2q66m0s9l4mbv5pqfyf1yku64g";}
//Vamos a ponerle de longitud s:1, por comprobar a ver si la teoría de que se lee el primer caracter y como es numero (vamos a poner el 0 de primero) todo lo demás por consiguiente se vuelve numero entero. y el administrator con la longitud 13
O:4:"User":2:{s:8:"username";s:13:"administrator";s:12:"access_token";s:33:"0godzsc2q66m0s9l4mbv5pqfyf1yku64g";}
//Aqui casí llego a la solución pero, faltaba algo. 
O:4:"User":2:{s:8:"username";s:13:"administrator";s:12:"access_token";s:1:"0godzsc2q66m0s9l4mbv5pqfyf1yku64g";}

La primer forma me está tirando un not found, le he estado cambiando el numero del primer valor del access_token pero de igual forma me tira el not found →

Sin embargo quité el directorio de var/www/index.php y recargué para que se fuera al directorio raiz y me devolvió esto:

  • Según lo que parece: el código parece estar intentando validar que el token actual del usuario coincide con el token esperado almacenado en $access_tokens (asociado a ese nombre de usuario). Si no coinciden, se lanza la excepción que indica que el token es inválido para el usuario wiener.

Encontré algo más válido → entendiendo la estructura del objeto:

Propiedades del objeto

  1. s:8:"username"

    • s indica una cadena (string).

    • 8 es la longitud del nombre de la propiedad username.

    • "username" es el nombre de la propiedad.

    • s:13:"administrator" es el valor de la propiedad username, siendo una cadena de longitud 13 que contiene el valor "administrator".

  2. s:12:"access_token"

    • s indica nuevamente una cadena (string).

    • 12 es la longitud del nombre de la propiedad access_token.

    • "access_token" es el nombre de la propiedad.

    • s:32:"godzsc2q66m0s9l4mbv5pqfyf1yku64g" es el valor de la propiedad access_token, siendo una cadena de longitud 32 que contiene el token "godzsc2q66m0s9l4mbv5pqfyf1yku64g".

S → Es string, ¿entonces que pasa si cambiamos s por un entero, como se representa?

Porque a fin de cuentas realmente nosotros estuvimos haciendo estaba bien sin embargo el token access no se validaba basicamente porque le pasabamos un 0 de primero está bien pero seguía siendo s:”0-CADENARESTANTE”, s como muy bien dice el analisis de las propiedades del objeto es string por lo tanto nunca coincidirá, tenía que hacerlo así: i:0

// ASÍ SI LLEGABAMOS A ALGO: 
O:4:"User":2:{s:8:"username";s:13:"administrator";s:12:"access_token";i:0;}

Ayudita de chatgpt →

Hacemos todo el proceso de codificación base64→urlEncode y pegamos en la cookie de session y:

Así fue como lo hicimos exitosamente, este laboratorio lo resolví escuchando Las piponas (remix)

Last updated