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