[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
Haga clic en eliminar para capturar paquetes con eructo:
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 ') |
---|---|
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! |
---|---|
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.
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 |
---|---|
[Menos-23] Filtrado de caracteres de comentario
1. Proceso de prueba
Ingrese una comilla simple primero y busque un error:
Desde el mensaje de error, el backend usa comillas simples para cerrar
1' and 1=1--+
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
¡Realmente funciona, jaja! ¡Avanzar!
- Prueba la inyección de error:
?id=1' and updatexml(1,concat(0x7e,user()),1) and 1='1
¡éxito!
-
Prueba la inyección sindical
Primero orden por para consultar el número de campos en la consulta principal
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=1
back-end de la instrucción de selección . El back-end ejecutará la instrucción que sigue a donde primeroid=1
, y luego ejecutará elorder by 100
resultado y encontrará que no se encuentra 100, devolverá un falso al principal oración, y luego continuar con la ejecuciónand 1=1
para 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
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:
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
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'#pika
y así sucesivamente.
Después de que el registro sea exitoso, el fondo se admin'#hacker
insertará en la base de datos en este momento , vaya a la base de datos para verificar:
Luego iniciamos sesión con la cuenta recién registrada y modificamos la contraseña después de iniciar sesión con éxito:
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:
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 datosif 更新成功{ 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:
Problema de cierre de comillas de prueba:
Prueba comillas simples | Prueba de comillas dobles |
---|---|
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--+
El eco es normal.
ingresar?id=1' aandnd 1=2--+
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
Luego es quitarse los pantalones:
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