Как работают эти две простые SQL-инъекции? - PullRequest
0 голосов
/ 09 ноября 2019

Я - разработчик программного обеспечения, начинающий изучать безопасность приложений, и у меня есть следующие вопросы, связанные с SQL-инъекцией.

Я слежу за видеокурсом, и есть два примера:

1) Iиметь небезопасный SQL-запрос, подобный следующему:

txtSql = "SELECT * FROM Users WHERE UserId = " + txtUserId

Хорошо, если переданное значение txtUserId имеет значение, подобное 99 ИЛИ 1 = 1

Я получу запрос, подобный этому

SELECT * FROM Users WHERE UserId = 99 OR 1 = 1

, который вернет мне весь список записей, содержащихся в таблице Users , поскольку 1 = 1 всегда верно иИЛИ конкатенация вернет true, так что это как этот запрос:

SELECT * FROM Users WHERE TRUE

возвращает мне весь список записей. Правильно ли это рассуждение?

2) Тогда у меня есть второй, более сложный пример:

Существует форма входа пользователя (имя пользователя и пароль). За этой формой находится небезопасная реализация запроса:

sql = 'SELECT * FROM USERS WHERE Name = "' + uName + '" AND Pass = "' + uPass + '"'

Хорошо, если пользователь вставит в форму входа следующие данные:

uName = " OR ""="
uPass = " OR ""="

Результат запроса будет:

SELECT * FROM Users WHERE Name = "" OR ""="" AND Pass = "" OR ""=""

Таким образом, он выбирает записи, где

  • Имя поле пустое ("") или равно "=" (и это условие всегда должно быть ложным, потому что довольно странно иметь пустое имя пользователя или имя пользователя, например "=").

  • Pass поле пусто("") или равно "=" (и это условие всегда должно быть ложным, потому что довольно странно иметь пустой пароль или пароль типа "=").

Итак, у нас есть такое условие:

WHERE FALSE AND FALSE

И вот мое сомнение: ЛОЖЬ И ЛОЖЬ = ЛОЖЬ

Почему он говорит, что этот запрос возвращает мне весь список записейпользовательской таблицы?

Если я хорошо понимаю логику, предыдущий запрос должен быть переведен примерно так:

SELECT * FROM Users WHERE FALSE AND FALSE

Что не так в моих рассуждениях? Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Порядок приоритета для логической логики НЕ И-ИЛИ, поэтому вы запрашиваете

WHERE Name = "" OR (""="" AND Pass = "") OR ""=""

, и теперь вы получаете

WHERE FALSE OR FALSE OR TRUE

, что приводит к TRUE agian

0 голосов
/ 09 ноября 2019

Скажите, а "blank"="blank"? Если вы прокомментируете «да», то это ваш ответ.

...