inyección SQL con nombres de columna filtrados

0

Tengo la siguiente consulta de MySQL susceptible a una inyección y necesito extraer la contraseña de un usuario determinado:

SELECT * FROM users WHERE login='$login' and password='$password'

Sin embargo, a partir de la inyección, puedo ver que antes de que se publique la solicitud, los campos $login y $password se filtran. En particular, los scripts PHP detectan el uso de "OR" en la siguiente inyección:

login => ' || ''='
password => ' || login='bobby' && passwORd LIKE 'A%'
SELECT * FROM users WHERE login='' || ''='' && password='' || login='bobby' && passwORd LIKE 'A%''

Se detecta el "OR" que aparece en $password y la inyección falla.

¿Hay alguna forma conocida de evitar esto?

    
pregunta Hans F. 24.06.2018 - 12:38
fuente

3 respuestas

2

No es necesario inyectar en la variable $password . Solo comente el resto de la consulta con la variable $login . La configuración de $login a bobby' -- le dará esta consulta:

SELECT * FROM users WHERE login='bobby' -- ' and password='foobar'
    
respondido por el Anders 24.06.2018 - 18:12
fuente
0

Claro. Uno puede usar otro SELECT como contraseña. Es muy propenso a errores utilizar el filtrado.

Utilice declaración preparada en su lugar. Entonces no te importa en absoluto lo que el usuario ha ingresado.

    
respondido por el mentallurg 24.06.2018 - 18:18
fuente
0

Exploit

Puedes comentar la variable $password como dicen anders.

Si desea averiguar las contraseñas, utilice sqlmap para volcar la base de datos. Hacer este manual lleva mucho tiempo.

Corrección

Para corregir la inyección SQL, simplemente use una declaración preparada.

La segunda debilidad es que las contraseñas se almacenan en texto sin formato. Debe almacenarlos como un hash de la contraseña.

    
respondido por el trietend 24.06.2018 - 23:08
fuente

Lea otras preguntas en las etiquetas