Agregar condiciones después de LIMIT en MySQL

0

¿Hay alguna forma de agregar alguna condición después de LIMIT, por ejemplo, OR o AND ?

Me pregunto si podemos agregar alguna consulta después de LIMIT que no devuelva nada.

por ejemplo, la consulta es:

SELECT * FROM table WHERE email = '$email' AND pwd = MD5('$pwd');

y después de la inyección de SQL, la consulta sería:

SELECT * FROM table WHERE email = '$email' AND pwd = MD5('') or 1 limit 1;
    
pregunta Innocent 30.06.2016 - 14:18
fuente

1 respuesta

1

Esta pregunta ha sido respondida en la sección de comentarios, pero esta es una respuesta explicativa para cualquier persona que quiera ver. Entonces, mirando el fragmento de código que realmente pudimos ver

$login = "SELECT fName,lName FROM great WHERE email= '$email' AND pwd = MD5('$pwd')";

Como puede ver en el pwd = MD5('$pwd') al final, el Código en realidad toma una contraseña ingresada por el usuario, la convierte en MD5 y luego se compara en la base de datos. Ahora, el plan es desglosar el pwd en la consulta MYSQL. Para eso, el ') podría suministrarse por lo que parecería que pwd = MD5('')') en este caso, el último ') no tiene uso y daría un error de sintaxis SQL ya que la consulta no identificará dos ')') . El siguiente plan es comentar el último ') de la consulta, ya que he usado los dos guiones típicos -- - . Ahora, el Magia aquí es si solo proporciona -- de lo que la Consulta al final no se comentará porque resultaría en --') ¡Dándole un error de sintaxis! Por esa razón, proporcioné espacio intencional después de -- y agregué otro guión para la demostración. Debido a que en muchos casos de Inyección de Blackbox SQL, no se pudo predecir, el error de sintaxis exacta es la única esperanza, por lo que en este comentario -- - el último guión realmente no tiene importancia, pero el ESPACIO entre ellos tiene el clave para comentar ') desde la parte posterior.

Ahora, la consulta funcionaría como de costumbre y, debido a la falta de desinfección de entrada, siempre podemos VERIFICAR la consulta mediante or '1'='1' . Pero, eso solo no solucionará el problema ya que or '1'='1' seleccionaría Cada ROW de la base de datos y el fragmento de código que se muestra a continuación hace una Verificación adicional aquí

            if($exe){
            $num = mysqli_num_rows($exe);
            if($num == 1){
                  //You are in
                }

Aha, ahora mysqli_num_rows > 1 Lo que no le permitiría ir a la parte if y no se omitiría. Por lo tanto, en la Carga útil inicial, esa es la única razón por la que estamos agregando LIMIT 1 para evitar nuestras filas > 1. El LIMIT 1 seleccionaría la primera fila de su base de datos back-end y VOILA por la que está.

Así que uniendo todas estas piezas pequeñas, podríamos construir nuestra Carga útil final como ') or '1'='1' LIMIT 1-- - Por lo tanto, la consulta final sería

 $login = "SELECT fName,lName FROM great WHERE email= '$email' AND pwd = MD5('') or '1'='1' LIMIT 1-- -')";

Eso es todo ..! :)

    
respondido por el Gerorge Timber 01.07.2016 - 05:11
fuente

Lea otras preguntas en las etiquetas