¿Son los métodos mágicos de PHP realmente necesarios para la inyección de objetos PHP?

4

Estoy tratando de entender la falla de la Inyección de Objetos de PHP en vBulletin 5.1.x (CVE 2015-7808) y me topé con los requisitos para la Inyección de Objetos como lo indica OWASP:

  

La aplicación debe tener una clase que implemente un método mágico de PHP   (como __wakeup o __destruct) que puede usarse para llevar a cabo   ataques maliciosos, o para iniciar una "cadena POP".   
Fuente: enlace

Sin embargo, en este informe sobre la vulnerabilidad de vbulletin no veo un método mágico siendo explotado, en su lugar, se llama a la función rewind() de la clase vB_dB_Result debido a foreach() :

public function decodeArguments($arguments){
        if ($args = @unserialize($arguments)){
            $result = '';
            foreach ($args AS $varname => $value){
                $result .= $varname;
...
class vB_dB_Result implements Iterator{
...
    public function rewind(){
        //no need to rerun the query if we are at the beginning of the recordset.
        if ($this->bof){
            return;
        }
        if ($this->recordset){
            $this->db->free_result($this->recordset);
        }
...
abstract class vB_Database{
... 
    function free_result($queryresult){
        $this->sql = '';
        return @$this->functions['free_result']($queryresult);
    }

¿Me falta algo o la declaración OWASP es simplemente falsa en este caso?

    
pregunta Tomas 07.01.2016 - 13:09
fuente

1 respuesta

3

La declaración en esa forma es falsa. Puede utilizar cualquier método para la inyección de objetos PHP. El punto importante es que el método debe llamarse realmente .

La ventaja de los métodos mágicos es que todos tienen el mismo nombre, y __wakeup y __destruct se llaman automáticamente .

En este caso específico, rewind funciona como se llama como parte del iterador en el bucle foreach.

Pero funciona también en otros ejemplos más simples. Imagina, por ejemplo, que tienes dos clases, las cuales tienen un método con el mismo nombre:

class Foo {
    public function bar() {
        echo "everything is safe here";
    }
    [other methods...]
}

class BadFoo {
    public $command = "something";
    public function bar() {
        echo exec($this->command);
    }
}

Ahora desea deserializar un objeto de la clase Foo segura y llamar a la función de barra en él:

$foo = unserialize($_GET['foo']);
$foo->bar();

Obviamente, un atacante podría simplemente enviar un objeto de la clase BadFoo , lo que llevaría a la ejecución del código:

O:6:"BadFoo":1:{s:7:"command";s:2:"id";}

Esto muestra que funciona con cualquier método, no solo con métodos mágicos, siempre y cuando el método se llame y haga algo en lo que esté interesado un atacante.

    
respondido por el tim 07.01.2016 - 16:33
fuente

Lea otras preguntas en las etiquetas