Anulación de inicio de sesión con inyección de SQL

2

Estoy aprendiendo sobre la inyección SQL, y estoy jugando en mi máquina local con una aplicación web vulnerable, que tiene un formulario de inicio de sesión.

La forma en que funciona el mecanismo de inicio de sesión es que primero busca si existe un usuario con el nombre de usuario ingresado en la base de datos; si existe, devuelve los datos del usuario desde la base de datos y luego verifica si se ingresó la contraseña. campo es igual a la contraseña de usuario real devuelta por la base de datos. Tenga en cuenta que no hay ningún hash de la contraseña involucrada.

La aplicación utiliza una consulta como la que se muestra a continuación para recuperar los datos del usuario de la base de datos: "SELECT * FROM accounts WHERE username = '" + username + "'" . Ya usé algo como esto para el campo de nombre de usuario en la forma: test' OR 1=1 LIMIT 1-- , y esto devuelve en la aplicación los datos del primer usuario de la base de datos (lo verifiqué en el modo de depuración). Pero, el inicio de sesión sigue fallando, porque como dije el valor de la contraseña que ingresé y la contraseña del usuario real no coincide, simplemente, cuando se trata de esta línea de código, falla:

if (enteredPasswordField.Equals(usersPassword, StringComparison.Ordinal)) return SUCCESS;
else return FAILURE;

Y como se puede ver, la contraseña del usuario no está involucrada en la consulta SQL. Estaba pensando en iniciar una nueva declaración SQL en el campo de nombre de usuario para cambiar la contraseña de los usuarios, pero eso socava el propósito. ¿Alguna idea de cómo puedo evitar esto?

    
pregunta ticket 31.03.2016 - 16:03
fuente

1 respuesta

6

Intente agregar un UNION SELECT a la consulta SQL.

Una selección de unión permite al atacante agregar una declaración de selección completamente nueva. Los resultados de esa segunda selección se adjuntan a los de la primera. Cuando la primera solicitud no devuelve ningún resultado, la selección de unión le permite al atacante el control completo sobre el conjunto de resultados. Recuerde que una declaración de selección ni siquiera necesita mencionar una tabla y puede devolver literales en su lugar. SELECT * FROM accounts WHERE username = '' UNION SELECT 'admin', 'TotalyTheAdminsPassword', 'dummy', 'dummy', 'dummy', 'dummy' es completamente válido.

Un UNION SELECT significa que el atacante debe averiguar el número de columnas solicitadas (el segundo SELECT debe coincidir con el recuento de columnas del primer SELECT, o la base de datos generará un error) y qué columna representa qué campo pero un atacante generalmente puede resolverlo a través de la experimentación.

    
respondido por el Philipp 31.03.2016 - 16:26
fuente

Lea otras preguntas en las etiquetas