¿La inyección de SQL no funciona en mi sitio?

1

He configurado una página y una base de datos para poder practicar la inyección SQL. He intentado algunos ejemplos y no parece funcionar. Parece que agrega el nombre de usuario y la contraseña a esa base de datos, aunque ingrese una inyección en el campo de nombre de usuario. Aquí está mi código:

include "Connection.php";

<form method="post" action="sqltest.php">
<fieldset>
    <label for="username">Username: </label>
    <input type="text" name="username"/>
    <label for="passwd">Password: </label>
    <input type="password" name="passwd"/>
</br>
    <input type="submit" value="Submit" />
    <input type="reset" value="Clear" />
</fieldset>
</form>
            </div>

        </div>



$username = $_POST["username"];
$password = $_POST["passwd"];

if (!empty($_POST)){
if (empty($username) || !isset($username)) {
echo "Please enter a valid username";
   } else if (empty($password) || !isset($password)) {
echo "Please enter a valid password";
} else {
if (strlen($password) >= 6 && strlen($password) <= 8)
    {
        if (is_numeric($password))
        {
            echo "Password cannot be a number<br/>";
        }
        else{
                $encrypted_mypassword=md5($password);
                $query =  "INSERT INTO sqltest (name,password) VALUES ('$username', '$password')";
                $result = mysqli_query($connection,$query);

                echo "You have successfully registered";
        }
    }
    else {
        echo "Password must be between 6 and 8 characters in length<br/>";
    }

 }
}

¿Alguien puede decirme algunos ejemplos que podrían quitar la tabla o insertar un usuario? Acabo de darme cuenta de que se está escapando automáticamente de los personajes. Seguramente esto no impide toda la inyección de SQL. ¿Hay algo que pueda inyectar que supere esto? Gracias!

    
pregunta user3511462 18.04.2014 - 16:53
fuente

2 respuestas

3

En este ejemplo en particular, hay muy poco que podrías hacer, incluso si no tuvieras magic_quotes .

Esto se debe a que una inyección SQL normalmente solo puede agregar a la cadena de consulta. Dado que la cadena es un comando INSERT , solo puedes INSERT algo.

En teoría, si el servidor SQL detrás de los "comandos encadenados" compatibles, podría transformar un comando en dos:

INSERT INTO ... VALUES ('...','...'); DROP TABLE Students; -- ');
                               |<--- injected code --------->|

Pero para hacer esto, el código original debe usar mysqli_multi_query , no mysqli_query .

Una cosa que puedes hacer es modificar tu secuencia de comandos para mostrar la consulta en lugar de ejecutarla. Para que pueda comprobar más fácilmente lo que está pasando.

Y una cosa que puedes probar con mysqli (por lo que deberías usar declaraciones preparadas y parámetros enlazados) es jugar con la codificación. Las citas mágicas mostrarán comillas simples, pero se pueden frustrar con secuencias UTF8 incorrectas (y en ocasiones correctas ), o escapes dobles.

Además, las citas mágicas no son perfectas.

Por ejemplo, si lo intentaste

username:      hello\
password:      ,XXX); --

y la consulta se convirtió en

INSERT INTO sqltest (name,password) VALUES ('hello\', ',XXX);--')

que realmente trataría de insertar

username:      "hello', "
password:      XXX

Ahora XXX no puede contener comillas ni; . Pero podría contener una función, como SLEEP() , que todavía permite cierta medida de "ataque" contra un sitio (bloquea una conexión SQL).

En algunas circunstancias, puedes construir una cadena usando CONCAT y CHR : en lugar de 'foo' (contiene comillas), puedes usar CONCAT(CHAR(102),CHAR(111),CHAR(111)) que no lo hace.

También es posible (pero debe poder ejecutar sentencias arbitrarias , como PREPARE y EXECUTE , no solo el secuestro de un INSERT ) para crear una consulta entre comillas y ejecutarlo sin usar comillas:

PREPARE bobby FROM CONCAT(CHAR(68),CHAR(82),CHAR(79),CHAR(80),CHAR(32)...)
EXECUTE bobby; -- D,R,O,P, ,T,A,B,L,E, ,S,t,u,d,e,n,t,s,...
    
respondido por el LSerni 18.04.2014 - 18:53
fuente
1

La inyección de SQL no funciona en su servidor puede deberse a magic quotes , que Escape ciertos caracteres en los datos entrantes con secuencias de escape de barra invertida:

  

[…] todos los caracteres ' (comillas simples), " (comillas dobles), \ (barra diagonal inversa) y NULL se escapan con una barra invertida automáticamente. Esto es idéntico a lo que hace addslashes() .

Estos son exactamente los caracteres que necesitarías para escapar de la cadena literal de MySQL.

Aunque esta mitigación puede funcionar en su ejemplo, uno no debe confiar en ella como comillas mágicas puede estar deshabilitado o incluso dejar de estar disponible:

  

Advertencia Esta función se DEPRECTA a partir de PHP 5.3.0 y se ELIMINA a partir de PHP 5.4.0.

En su lugar, utilice técnicas conocidas para evitar las inyecciones de SQL en PHP .

    
respondido por el Gumbo 18.04.2014 - 17:54
fuente

Lea otras preguntas en las etiquetas