Diga que había una página web de acceso público con el siguiente código PHP:
<?php
class NotInteresting
{
public function noExploits() {
echo "Whatever.";
}
}
$unsafe = unserialize($_GET['data']);
$unsafe->noExploits();
?>
El código esperaría que el parámetro data
URL contenga una instancia serializada de NotInteresting
, pero, por supuesto, el parámetro data
puede ser manipulado. Cuando se utiliza unserialize()
en los datos proporcionados por el usuario, a menudo lleva a PHP Object Injection .
Sin embargo, todos los ejemplos de Inyección de Objetos PHP que he visto hasta ahora ( 1 , 2 , 3 ) ha sido peligroso por una de dos razones:
- Hubo algunas clases explotables con métodos peligrosos (que solo estaban destinadas a ser llamadas internamente) que se aprovecharon para ejecutar código arbitrario, a menudo el caso de un CMS.
- La versión de PHP era antigua u obsoleta y se explotaron las vulnerabilidades en el código PHP.
Dado que la versión de PHP es actual, es decir, no existen vulnerabilidades conocidas en la función unserialize()
- y que no hay clases personalizadas definidas (solo las predeterminadas - Exception
, stdClass
etc.), ¿Es posible aprovechar el código anterior para un ataque exitoso en una instalación predeterminada de PHP?
Información adicional:
Por lo que sé, solo hay cuatro métodos mágicos explotables al construir una clase arbitraria a partir de una llamada unserialize()
: __call()
, __wakeup()
, __destruct()
y __toString()
:
- __wakeup () se llama cuando un objeto no está serializado.
- Se llama a __call () cuando se invocan métodos inaccesibles (o que no existen).
- __destruct () siempre se llama después de que no existen más referencias al objeto.
- Se llama a __toString () cuando un objeto se trata como una cadena.
Así que escribí un script PHP para generar rápidamente una lista de las clases que contienen estos métodos "interesantes": Consulte aquí para obtener un pastebin . Algunos de estos se ven muy 'interesantes':
- Las clases XML (podrían llevar a XXE )
- Las clases
Phar
Sin embargo, hasta el momento no puedo construir un ataque solo con estos: necesitaré a alguien más experimentado para que participe.