Deserialización Insegura PHP
Pagina Vulnerable Deserialización Insegura en PHP
<?php
// Clase vulnerable: al deserializar el objeto se ejecuta el comando almacenado en $cmd
class Vulnerable {
public $cmd;
public function __construct($cmd) {
$this->cmd = $cmd;
}
public function __destruct() {
system($this->cmd);
}
}
// Función para verificar si las credenciales son correctas
function authenticate($username, $password) {
$valid_users = [
'admin' => 'admin',
'user' => 'user'
];
if (isset($valid_users[$username]) && $valid_users[$username] === $password) {
return true;
}
return false;
}
// Si el formulario es enviado
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Recuperamos las credenciales del formulario
$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';
// Si las credenciales son correctas
if (authenticate($username, $password)) {
// Creamos un payload malicioso (cookie) solo para usuarios válidos
$cmd = "echo 'Comando ejecutado exitosamente';"; // Cambia esto con el comando que desees
$vulnerable_object = new Vulnerable($cmd);
$serialized_object = serialize($vulnerable_object);
$encoded_payload = base64_encode($serialized_object);
// Establecemos la cookie con el payload
setcookie('session', $encoded_payload, time() + 3600, "/"); // La cookie durará 1 hora
// Redirigimos al usuario a panel.php después del login
header('Location: panel.php?username=' . urlencode($username));
exit;
} else {
echo "<p>Credenciales incorrectas. Por favor, inténtalo de nuevo.</p>";
}
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login - Deserialización Insegura</title>
</head>
<body>
<h1>Login de Usuario</h1>
<!-- Formulario de login -->
<form method="POST">
<label for="username">Nombre de usuario:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="password">Contraseña:</label>
<input type="password" id="password" name="password" required><br><br>
<button type="submit">Iniciar sesión</button>
</form>
</body>
</html>

Generar Payload Serializado en Base64
Enviar Payload al servidor

Last updated