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?