Rompiendo el nombre de usuario y contraseña de mysql [cerrado]

1

Tengo dos versiones de un sitio web. El primero no tiene precauciones de seguridad contra las inyecciones de SQL. Así que si intento algo como:

Username: hello_world
Password: ' or ' 1=1

Iniciaré sesión como usuario hello_world .

La segunda versión del sitio web escapa de comillas simples a dos comillas simples. Así que el primer ataque que usé en la primera versión no funciona. Cuando obtengo un inicio de sesión exitoso en la primera versión, recibo una respuesta que dice:

username = hello_world & password = %27%20or%20%27%201%3D1

Entonces, todos los caracteres especiales están siendo reemplazados por su valor hexadecimal. Cuando intento algo como esto:

Username = hello_world
Password = %27%20or%20%27%201%3D1

En la segunda versión del sitio, no funciona (porque el % se está cambiando a su valor hexadecimal).

¿Hay alguna manera de iniciar sesión como usuario hello_world ?

NOTA: De hecho, tengo permiso para realizar pruebas en este sitio.

    
pregunta Bob John 09.02.2015 - 03:02
fuente

2 respuestas

3
  

La segunda versión del sitio web escapa de comillas simples a dos comillas simples.

     

¿Hay alguna forma de iniciar sesión como usuario hello_world?

Sí, porque este tipo de protección no es segura en absoluto (tampoco lo llamaría escapar).

Ataque

Imagina un ataque como este:

Username: hello_world
Password: \' OR 1=1 #

Que se transformaría en:

Password: \'' OR 1=1 #

Lo que probablemente se vería así en una consulta:

SELECT * FROM users WHERE username='hello_world' AND password='\'' OR 1=1 #'

Luego se ejecuta de esta manera, porque el comentario ( # ) se corta del resto de la consulta:

SELECT * FROM users WHERE username='hello_world' AND password='\'' OR 1=1 

Por lo tanto, comprueba si su contraseña es \' o si 1=1 (lo que hace) para autenticar al usuario hello_world .

Más daños

Tenga en cuenta que la omisión de inicio de sesión no es el único ataque que se puede realizar aquí.

Los datos también se pueden recuperar a través de inyección ciega de SQL (true = conectado), false = no conectado):

SELECT * FROM users WHERE username='hello_world' AND password='\'' OR ascii(substring((SELECT password FROM mysql.user LIMIT 0,1),1,1))<100
[ etc. ]

Es un ataque ruidoso en una página de inicio de sesión, pero aún así, podría causar daños graves.

Prevention

El filtrado es el peor tipo de protección contra las inyecciones de SQL. Escapar (por ejemplo, a través de mysqli_real_escape_string ) es mejor, y usar declaraciones preparadas es mejor (son más difíciles de desordenar que escapar).

    
respondido por el tim 09.02.2015 - 12:52
fuente
0

Esto depende de su comprensión de los "caracteres especiales". Si filtra todos los caracteres que no son alfanuméricos, puede estar seguro, pero no puedo responder con un "sí" a esta pregunta.

En general, no es una buena idea implementar sus propios controles de seguridad para consultas de base de datos.
En su lugar, use funciones integradas como mysql_real_escape_string () (si está usando PHP por ejemplo).
Además, debe usar declaraciones preparadas . Esas son consultas de SQL con marcadores de posición para la entrada del usuario. Esto garantiza que la entrada del usuario no se interpreta como una palabra clave / función / separador de SQL.

    
respondido por el rbialon 09.02.2015 - 08:43
fuente

Lea otras preguntas en las etiquetas