Подумайте о том, каким может быть SQL-запрос в приложении.
Вероятно, что-то вроде select * from users where username="<<username>>" and password=md5("<<password>>")
, как вы заметили.
После введения <<username>>
и <<password>>
вам все еще нужночтобы иметь действительный запрос SQL, в противном случае приложение завершится с ошибкой.
Используя <<username>>
для внедрения, кавычка после admin
закрывает строку имени пользователя, or "1"="1
делает запрос следующим образом:
select * from users where username="admin" or "1"="1" and password=md5("<<password>>")
Это допустимо, и, поскольку and
имеет более высокий приоритет, чем or
, он получает пользователя с именем «admin» ИЛИ с паролем, в котором вы ввели пароль.другое поле - не имеет значения.
Если бы в конце вставленной строки была кавычка, запрос был бы select * from users where username="admin" or "1"="1"" and password=md5("<<password>>")
, что является недопустимым SQL из-за двух кавычек (легко увидеть, потому чтоколичество кавычек нечетное).