thinkphp5.0.X deserialización usando auditorías cadena

prefacio

Después de leer thinkphp5.1.X deserialización usando la cadena, y por ahora thinkphp5.0.X deserialización usando la cadena, entonces la dificultad es mayor que una, 233 este divertido, siempre permanece en la zona de confort demasiado a quejarse lo que significa.

0x01

Instalación componer un servicio de transporte

composer create-project topthink/think=5.0.14 tp5.0.14

Medio Ambiente:
PHP + los Apache-7.0.12-NTS

En la versión 5.1 nos pop cadena de exportación es __call método de la clase de solicitud se puede llamar directamente, pero en 5.0
$ Hook [$ Método,] en la redacción no es la misma, esto es $ en el 5.1.x -> $ gancho [ $ método], esto es para nosotros, controlable, escrito en 5.0.x es el self :: $ gancho [$ método] aquí es de tipo const, no es controlable. Así que no podemos utilizar la clase como se exportó un rquest, se tendría que encontrar otros métodos __call disponible.
Aquí se utiliza
ThinkPHP / biblioteca / pensar / consola / Output.php, salida de métodos de clase puede ser posteriormente __call trampolín.

método de la clase de salida opcional __call
POP punto de entrada de la cadena todavía
 pensar \ Process \ tuberías: __ destruct Método

Por último artículo había aprendido a
ver unlink tener una función, si podemos controlar $ archivo, se puede llegar a cualquier eliminación de archivos.
exp:

<?php
namespace think\process\pipes;
class Pipes{
}

class Windows extends Pipes
{
    private $files = [];

    public function __construct()
    {
        $this->files=['D:\PHPSTUDY2018\PHPTutorial\WWW\tp5\shell.php'];
    }
}

echo base64_encode(serialize(new Windows()));

Naturalmente, empezamos a buscar el punto de vista file_exists esta función RCE.

Aquí escribir de nuevo directamente en el proceso:

__toString -> toJson -> toArrary

Tenga en cuenta que la clase de conversión no contiene __toString método en el 5.0.x,
donde elegimos pensar clase \ Modelo se dispara. Puesto que la clase es una clase abstracta, por lo que tenemos que seguir para utilizar su subclase en EXP construcción cuando, por ejemplo: pensar en la clase \ Model \ Pivote

En el método toArray que podemos utilizar para encontrar un $ parecido a-> función ($ b) método, y $ a, deben ser controlados $ b, que nos permite ejecutar __call.
Al igual que antes, analizar la clase toArray código de aplicación específica

Método toArray Modelo clase abstracta, hay tres lugares para realizar __call.
métodos aquí _call que utilizamos han sido identificados,
de piensa \ Console \ Output: __ método Call ()
tenemos que ser activado por un tercer método __call ()

$item[$key] = $value ? $value->getAttr($attr) : null;

Aquí requiere $ $ attr valor y se controlan
con el fin de seguimiento para ver.
Dolor de cabeza, brevemente lo largo de sus pensamientos mañana nuevo juicio
en primer lugar que una copia de $ $ attr valor y son controlados
a realizar $ de valor> getAttr ($ attr)
y luego ir a la clase de salida seleccionada por el retroceso
encontrado
la ejecución de código a $ item [$ clave] = $ valor $ de valor> getAttr ($ attr) :? nulo; es capaz de realizar métodos mágicos clase de salida __call
a cáscara de escritura por _call método método

Supongo que te gusta

Origin www.cnblogs.com/wangtanzhi/p/12663572.html
Recomendado
Clasificación