Actualizando las Propiedades de un Objeto
En esta tarea exploraremos un ejemplo práctico en PHP, usando una aplicación simple de compartir notas. Nuestra aplicación permite a los usuarios crear, guardar y compartir notas fácilmente. Los usuarios pueden introducir sus notas en la aplicación que son guardadas para referencias futuras. Además, los usuarios pueden compartir sus notas con otros, facilitando la colaboración y el intercambio de información. La aplicación también incluye funcionalidades basadas en suscripción, asegurando que sólo los usuarios suscritos tengan acceso a ciertas funcionalidades como compartir las notas. Puedes acceder a la web en http://IP/case1.

Vamos a ver cómo se ha construído la aplicación.
Definiendo la Clase Notes
La aplicación tiene una clase Notes, representando una nota en nuestra aplicación. Esta clase tiene tres propiedades privadas: user, role y isSubscribed. También tenemos métodos setter y getter para manipular la propiedad isubscribed.
class Notes { private $user; private $role; private $isSubscribed; public function __construct($user, $role, $isSubscribed) { $this->user = $user; $this->role = $role; $this->isSubscribed = $isSubscribed; } public function setIsSubscribed($isSubscribed) { $this->isSubscribed = $isSubscribed; } public function getIsSubscribed() { return $this->isSubscribed; } }
Guardando la Información de Usuario en Cookies
Cuando un usuario visita niuestra aplicación web por primera vez, configura una cookie serializada que contiene su información. Esto incluye su nombre de usuario, rol y estado de subscripción (isSubscribed). Si el usuario es un miembro suscripto (isSubscribed = true), se les permite compartir notas.

Explotando la Vulnerabilidad
En este paso ilustraremos cómo un atacante puede explotar la vulnerabilidad modificando la cookie serializada para ganar acceso no autorizado a compartir notas.
- Serialised cookie: Después de decodear el valor base64 encodeado de la cookie, obtenemos la siguiente representación serializada del objeto Notes.
O:5:"Notes":3:{s:4:"user";s:5:"guest";s:4:"role";s:5:"guest";s:12:"isSubscribed";b:0;}
O:5:"Notes":3: Esto representa un objeto (O) con la clase Notes, la cual tiene 3 propiedades.s:4:"user";s:5:"guest": Esto indica una string (s) con una longitud de 4 caracteres representando a la propiedadusercon el valor "guest".s:4:"role";s:5:"guest": Esto similar al de arriba indica que la propiedadroletiene el valor "guest".s:12:"isSubscribed";b:0: Representa un booleano (b) llamadoisSubscribedcon el valor falso (0).
Explotando la Vulnerabilidad
El el escenario actual, cuando el usuario intenta compartir una nota, le sale el siguiente pop-up:

Y bien, ¿qué está pasando en el backend? El código PHP del backend valida la cookie entrante, la deserializa, y luego valida si el usuario está o no suscrito. Nuestra tarea principal es bypassear eso.
Supón que un atacante intercepta esta cookie serializada y modifica el valor de la propiedad isSubscribed de falso (0) a verdadero (1). El atacante puede manipular el estado de suscripción sin autorización legítima cambiando el valor booleano en la información serializada.

Después de modificarlo, el atacante vuelve a base64 encodearlo y listo.
