[Sql-labs] Registro de entrada 21 ~ 25

[Sql-labs] Registro de entrada 21 ~ 25


[Less-21] Inyección basada en cookies (cifrado base64)

1. Proceso de prueba

Este nivel es muy similar al nivel 20

Inicie sesión primero

imagen-20210310210828806

Haga clic en eliminar para capturar paquetes con eructo:

imagen-20210310211029663

Descubrí que el campo de la cookie parece estar cifrado. Vi% 3D (= en hexadecimal), que debería estar cifrado en base64.

Luego construye la carga útil:1' and 1=2 union select user(),database(),version()#

Codificar con base64 como:MScgYW5kIDE9MiB1bmlvbiBzZWxlY3QgdXNlcigpLGRhdGFiYXNlKCksdmVyc2lvbigpIw==

Insertar carga útil Reportó un error y descubrió que se cerró con ')
imagen-20210310212201360 imagen-20210310212256136

Así que cambia la carga útil:1') and 1=2 union select user(),database(),version()#

Codificar con base64 como:MScpIGFuZCAxPTIgdW5pb24gc2VsZWN0IHVzZXIoKSxkYXRhYmFzZSgpLHZlcnNpb24oKSM=

Vuelva a insertar la carga útil ¡éxito!
imagen-20210310212517706 imagen-20210310212547410

2. Análisis del código fuente

La diferencia con el nivel anterior es que el campo de la cookie está codificado en base64. La solución es codificar directamente en base64 la carga útil y luego reemplazar la cookie. Otro es que el método de cierre es diferente, el nivel anterior usa comillas simples, este nivel usa ')


[Less-22] Inyección basada en cookies (cifrado base64)

Comparado con less-21, solo la forma de cierre es diferente, less-22 usa "cerrado", y los demás son los mismos que less-21.

imagen-20210311202734147

A juzgar por el informe de error, el modo de cierre de back-end es "

Inserte la carga útil codificada Rompió con éxito la información de la base de datos
imagen-20210311203118406 imagen-20210311203104721

[Menos-23] Filtrado de caracteres de comentario

1. Proceso de prueba

Ingrese una comilla simple primero y busque un error:

imagen-20210311211840012

Desde el mensaje de error, el backend usa comillas simples para cerrar

1' and 1=1--+

imagen-20210311212035005

Todavía informa un error, lo que indica que lo siguiente - + no funciona.

Entonces pensé en el truco de la contraseña universal:1' and 1='1

imagen-20210311212201891

¡Realmente funciona, jaja! ¡Avanzar!

  • Prueba la inyección de error:?id=1' and updatexml(1,concat(0x7e,user()),1) and 1='1

imagen-20210311212506179

¡éxito!

  • Prueba la inyección sindical

    Primero orden por para consultar el número de campos en la consulta principal

    imagen-20210311212652910

    Como resultado, el pedido llega a 10000, pero no se informa de ningún error. ? ?

    Leer el artículo de los jefes , muy gratificante. Es el problema del orden de procesamiento de select * from users where id=1 order by 100 and 1=1back-end de la instrucción de selección . El back-end ejecutará la instrucción que sigue a donde primero id=1, y luego ejecutará el order by 100resultado y encontrará que no se encuentra 100, devolverá un falso al principal oración, y luego continuar con la ejecución and 1=1para volver a la oración principal. Si es verdadero, el falso original se completa, por lo que la declaración se ejecuta normalmente.

    Parece que ordenar por no funciona, solo puede adivinar manualmente

    imagen-20210311214332106

    Sigue intentándolo hasta las 3 y el eco es normal. Resulta que el campo de contraseña no refleja el 3, sino el 1. Después de cambiar varios campos e intentarlo muchas veces, el campo de la contraseña siempre muestra 1 o 0.

    Así que ve a la base de datos para echar un vistazo:

    imagen-20210311214815144

    Resulta que sql se '5' and 1='1'tratará como un campo, por lo que solo dos valores son verdaderos o falsos, es decir, 0 o 1.

    Pero aún puede usar el segundo campo para ir a la biblioteca

    imagen-20210311215047611

    El método de biblioteca violento es similar al anterior, así que no lo repetiré aquí.

2. Análisis del código fuente

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");

// take the variables 
if(isset($_GET['id']))
{
    
    
$id=$_GET['id'];

//filter the comments out so as to comments should not work
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);  //这里对sql注释符进行了过滤
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);

// connectivity 


$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
    
    
  	echo '<font color= "#0000ff">';	
  	echo 'Your Login name:'. $row['username'];
  	echo "<br>";
  	echo 'Your Password:' .$row['password'];
  	echo "</font>";
  	}
	else 
	{
    
    
	echo '<font color= "#FFFF00">';
	print_r(mysql_error());
	echo "</font>";  
	}
}
	else {
    
     echo "Please input the ID as parameter with numeric value";}

?>

preg_replace()Función: realiza una búsqueda y reemplazo de expresiones regulares.

$reg1 = "/--/": Las dos barras / al principio y al final son los calificadores de las expresiones regulares.Este es el estándar de las expresiones regulares de Perl, y las expresiones regulares soportadas por php son el estándar de las expresiones regulares de Perl. Significa que entre dos barras está el contenido normal, y el modo de coincidencia se puede activar después de la barra al final, por ejemplo: / - / i, y la siguiente i significa ignorar la coincidencia de mayúsculas y minúsculas.

Como se puede ver en el código anterior, el backend filtra los caracteres de comentario SQL, que se pueden omitir aquí mediante el uso de una contraseña universal.


【Menos-24】 Inyección secundaria

1. Proceso de prueba

Intenté varias veces en cada interfaz, pero fallé

Mirando el código fuente de back-end, encontré que todos los parámetros se habían escapado. Las ideas generales de ataque parecen no tener ningún efecto.

Después de consultar el artículo del jefe, encontré una nueva idea:

Inyección secundaria : En términos generales, el atacante construye cuidadosamente la declaración SQL para insertarla en la base de datos. Cuando la carga útil insertada en la base de datos es llamada por otros tipos de declaraciones SQL, el ataque se desencadenará. Porque la primera vez que el atacante se inserta en la base de datos no desencadena la nocividad, pero el ataque se desencadenará cuando se invoquen otras declaraciones. Esta es la segunda inyección.

Primero cree un nombre de usuario que admin'#comience con un usuario similar a admin'#333, admin'#pikay así sucesivamente.

imagen-20210312164152668

Después de que el registro sea exitoso, el fondo se admin'#hackerinsertará en la base de datos en este momento , vaya a la base de datos para verificar:

imagen-20210312162908288

Luego iniciamos sesión con la cuenta recién registrada y modificamos la contraseña después de iniciar sesión con éxito:

imagen-20210312164719079

Para esta operación, la lógica de empalme en la base de datos back-end es así:

UPDATE users SET PASSWORD='$pass' where username='admin'#hacker' and password='$curr_pass'

Por lo que equivale a modificar directamente la contraseña del usuario administrador.

Revisemos la base de datos:

imagen-20210312162947291

Descubrí que de hecho ha sido modificado.

2. Análisis del código fuente

  • index.php no tiene código sensible

    Detecta la sesión, si hay un parámetro de nombre de usuario en la sesión y un parámetro de autenticación en la cookie, saltará a log-in.php

    Hay un formulario a continuación para enviar a login.php

    Hay un cuadro de entrada login_user y un cuadro de entrada login_password en el formulario. Uno de los dos hipervínculos es saltar a la contraseña olvidada.php si se olvida la contraseña, y el otro es saltar a new_user.php para los usuarios registrados.

//index.php
<?PHP
session_start();
if (isset($_SESSION['username']) && isset($_COOKIE['Auth'])) {
    
    
   header('Location: logged-in.php');
}
?>
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
?>
  • log-in.php

    Se usa para cambiar la contraseña

    Detección de sesión: si no hay un parámetro de nombre de usuario en la sesión o no hay un parámetro de nombre de usuario en la cookie, la página saltará a index.php

    Envíe un formulario a pass_change.php:

    Hay caja de entrada current_password contraseña actual, caja de entrada de contraseña nueva contraseña, caja de entrada re_password confirmar contraseña en el formulario

  • pass_change.php

    Se usa para actualizar la contraseña de la base de datos.

    Detección de sesión: si no hay un parámetro de nombre de usuario en la sesión o no hay un parámetro de nombre de usuario en la cookie, la página saltará a index.php

    Utilice mysql_real_escape_string()el valor del parámetro de entrada del usuario para escapar y luego realice la operación de actualización de la contraseña de la base de datos

    if 更新成功{
          
          
    echo "Password successfully updated";
    }
    else{
          
          
    header('Location: failed.php');  //如果更新失败则重定向到failed.php
    }
    
  • Fail.php

    Detección de sesión: si no hay un parámetro de nombre de usuario en la sesión o no hay un parámetro de nombre de usuario en la cookie, la página saltará a index.php

  • new_user.php

    Se utiliza para registrar usuarios.

    Envíe un formulario a login_create.php

    Hay tres casillas de entrada para nombre de usuario, contraseña y re_password en el formulario

  • login_create.php

    Primero verifique si el nombre de usuario ya existe, si existe, regrese a El nombre de usuario ya existe, elija un nombre de usuario diferente

    Si el nombre de usuario no entra en conflicto, juzgue si las contraseñas ingresadas dos veces son consistentes

    Si son consistentes, se insertan en la base de datos y la parte del parámetro de usuario se ha \ escapado


【Menos-25】

1. Proceso de prueba

Primero ingrese un 1 para ver:

imagen-20210312190441859

Problema de cierre de comillas de prueba:

Prueba comillas simples Prueba de comillas dobles
imagen-20210312190548794 imagen-20210312190634256

A partir del análisis de eco anterior, debe ser una inyección de comillas simples.

El siguiente paso es considerar omitir:

1. Primero, determine si el filtrado es único o no:

Si es único y simplemente reemplaza el carácter de filtro con un carácter nulo, se puede omitir escribiendo doble:

o = oorr 、 y = anandd

Si no es desechable, se deben considerar algunas deformaciones:

Bypass de inflexión de caso ----- o = O = oR = O

Utilice el operador ------- o = || y = &&

Omisión de codificación de URL ------- # =% 23, codificación hexadecimal -------- ~ = 0x7e

Agregar comentario ------------ / * o * /

...

2. Luego, si está en la URL, los espacios y algunos caracteres especiales se codificarán en la URL, por ejemplo: # es% 23, el espacio es% 20

? id = 1 '# informará un error, no informará un error si está escrito como? id = 1'% 23, y también podemos usar - # o - + o - espacio más cualquier carácter que no sea espacio

ingresar?id=1' aandnd 1=1--+

imagen-20210312194029297

El eco es normal.

ingresar?id=1' aandnd 1=2--+

imagen-20210312194125857

El eco está vacío, lo que indica que el bypass de doble escritura (por supuesto, también puede elegir el bypass del operador) funcionó.

Número de mafiosos:?id=1' oorrder by 3--+

ordenar por probar el número de campos de consulta principales es 3

imagen-20210312194336102

Luego es quitarse los pantalones:

imagen-20210312194727396

El proceso es similar al anterior, así que no lo repetiré aquí.

2. Análisis del código fuente

<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");


// take the variables 
if(isset($_GET['id']))
{
    
    
	$id=$_GET['id'];
	//logging the connection parameters to a file for analysis.
	$fp=fopen('result.txt','a');
	fwrite($fp,'ID:'.$id."\n");
	fclose($fp);

	//fiddling with comments
	$id= blacklist($id);
	//echo "<br>";
	//echo $id;
	//echo "<br>";
	$hint=$id;

// connectivity 
	$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
	$result=mysql_query($sql);
	$row = mysql_fetch_array($result);
	if($row)
	{
    
    
	  	echo "<font size='5' color= '#99FF00'>";	
	  	echo 'Your Login name:'. $row['username'];
	  	echo "<br>";
	  	echo 'Your Password:' .$row['password'];
	  	echo "</font>";
  	}
	else 
	{
    
    
		echo '<font color= "#FFFF00">';
		print_r(mysql_error());
		echo "</font>";  
	}
}
else 
{
    
     
	echo "Please input the ID as parameter with numeric value";
}

function blacklist($id)
{
    
    
	$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
	$id= preg_replace('/AND/i',"", $id);		//Strip out AND (non case sensitive)
	
	return $id;
}
?>

En el código fuente, puede ver que la entrada del usuario se filtra mediante la coincidencia regular y se realiza el filtrado que no distingue entre mayúsculas y minúsculas de o y AND. Pero solo coincide una vez, por lo que se puede omitir mediante escritura doble.

Se puede omitir la escritura doble y los operadores se pueden omitir (&& requiere la codificación de URL como% 26% 26).

Consulte el artículo del jefe

Supongo que te gusta

Origin blog.csdn.net/qq_43665434/article/details/114704665
Recomendado
Clasificación