Después de probar la inyección SQL exitosa, ¿por qué el resultado no se muestra en la página web?

2
  1. A continuación se muestra el código PHP que escribí que permite la inyección de SQL con un parámetro, es decir, 'id' en este caso.

  2. Al intentar la inyección de SQL mediante la colocación de este 2 'ORDER BY 1; -' en el parámetro (campo de identificación), solo obtengo errores de SQL en la página.

  3. Al ejecutar la consulta directamente en el servidor mysql, es decir, SELECT * FROM users WHERE id = '2' ORDER BY 1; - ''; Obtengo el siguiente resultado que es 1 fila junto con el error.

mysql> SELECT * FROM users WHERE id = '2' ORDER BY 1;--'';
+----+----------+-----------+------------------+
| id | username | password  | creditcard       |
+----+----------+-----------+------------------+
|  2 | John     | password! | 3123456769384659 |
+----+----------+-----------+------------------+
1 row in set (0.00 sec)
     

ERROR 1064 (42000): Tiene un error en su sintaxis SQL; Consulte el manual que corresponde a la versión de su servidor MySQL para la   sintaxis correcta para usar cerca de '-' '' en la línea 1

código PHP

<?php

require_once 'login.php';
if (!isset($_GET['id']))
{
    echo <<<_END
    <pre>            <h1>WELCOME to the KINGDOM</h1>
    <form action = 'si2.php' method = 'GET'>
    id <input type = 'text' name = 'id'>

        <input type = 'submit' value = 'cl1ck M3'></pre></form>
 _END;

}

if(!get_magic_quotes_gpc())
{
    $id = stripslashes($_GET['id']);

}
$connection = mysql_connect($db_hostname,$db_username,$db_password);
if(!$connection) die ("Unable to connect with MySql " . mysql_error());

 mysql_select_db($db_database,$connection) or die('Could not connect with the database');

$query = "SELECT * FROM users WHERE id = '$id'";

$result = mysql_query($query);
if($result)
{
    $rows = mysql_num_rows($result);
}
else { echo "Could not execute the Query:  <br>" . mysql_error();}


if($rows >= 1)
    {

        for ($j=0 ; $j < $rows; ++$j)
            {
                $row = mysql_fetch_row($result);
                echo "Hello $row[1]"."<br>";
                echo "Your Credit Card Number is  $row[3]"."<br><br>";
                echo $query."<br>";
                //echo $row[3];

            }
    }           
else
{
    echo "<br><br><br>Sorry no rows/results could be fetched on query execution <br><br><br>";
    //echo $query;
}
?>

Mi pregunta es ¿por qué mi código no puede recuperar el conjunto de filas y mostrar las entradas de la tabla? Y en caso de que quiera entonces, ¿qué cambios debo intentar?

    
pregunta harveyD 25.03.2015 - 18:33
fuente

2 respuestas

2

Errores y problemas en su inyección

El problema es que no puede ejecutar varias consultas con mysql_query y, al inyectar un ; , tiene múltiples consultas. El primero es SELECT * FROM users WHERE id = '2' ORDER BY 1 y el segundo es --'' .

El primero es el que te da el resultado real en la línea de comandos y el segundo te da un error (porque no es una consulta válida).

Tenga en cuenta también que su inyección: 2' ORDER BY 1;--' no tiene mucho sentido. ¿Por qué tienes el ; ? Realmente no quieres ejecutar dos consultas, solo una. ¿Y qué se supone que debe hacer el último ' ? Ya te ocupaste de las sobras ' comentando a través de -- (al menos en teoría).

Solución

Lo que desea inyectar es 2' ORDER BY 1-- , o, si eso no funciona, intente usar # (url codificada como %23 si usa un navegador) en lugar de -- como carácter de comentario para cortar del resto de la consulta (el ' ), porque no requiere un espacio en blanco adicional. En algunos casos, también puede generar la consulta de manera que se use el ' restante, como OR '1' = '1 (aunque probablemente esto no funcione para el pedido).

    
respondido por el tim 25.03.2015 - 19:38
fuente
1

Es posible que haya dos problemas con su intento que hagan que falle:

  • La sintaxis de los comentarios de MySQL al final de la línea --  requiere una espacios en blanco o caracteres de control después del doble guión:

      

    Desde una secuencia de " --  " hasta el final de la línea. En MySQL, el estilo de comentario “ --  ” (doble guión) requiere que al segundo guión le siga al menos un espacio en blanco o un carácter de control (como un espacio, una pestaña, una nueva línea, etc.). Esta sintaxis difiere ligeramente de la sintaxis estándar de comentarios SQL, como se explica en Sección 1.8.2.4, "' -- ' como el inicio de un comentario" .

  • función mysql_query de PHP solo permite una sola declaración:

      

    mysql_query () envía una consulta única (no se admiten varias consultas) [...]

respondido por el Gumbo 25.03.2015 - 19:05
fuente

Lea otras preguntas en las etiquetas