Вопрос или проблема
Я наткнулся на задачу CTF, которая включает часть с SQL-инъекцией (БД MySQL). Я её выполнил, но не понимаю, почему или как работает инъекция. Запрос в PHP-приложении, вероятно, выглядел бы так:
SELECT * FROM users WHERE email="[email protected]" AND password = md5('1234');
А код инъекции, который я ввёл в текстовое поле:
[email protected]' OR 1 = 1 LIMIT 1 -- ' ]
Вероятно, привёл бы к запросу, как этот:
SELECT * FROM users WHERE email="[email protected]" OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
Это не работает без ]
, но я не понимаю, как здесь используется ]
. Пожалуйста, объясните мне!
Ответ или решение
Символ ]
в вашем SQL-инъекционном коде выполняет важную функцию, которая связана с корректным завершением строки комментария и предотвращением синтаксических ошибок в запросе.
Давайте разберемся с тем, как работает ваша инъекция. В исходном запросе:
SELECT * FROM users WHERE email='[email protected]' AND password=md5('1234');
Вы добавляете инъекцию:
'[email protected]' OR 1 = 1 LIMIT 1 -- '
При подстановке, результат получается следующим:
SELECT * FROM users WHERE email='[email protected]' OR 1 = 1 LIMIT 1 -- ' AND password = md5('1234');
Это изменяет логику запроса так, что условие (1 = 1) всегда истинно, что позволяет обойти проверку пароля и получить доступ к учетной записи.
Теперь о символе ]
. В большинстве SQL-серверов символ --
начинает комментарий, который влияет на всё, что следует за ним в той же строке. Ваша инъекция использует символ ]
для завершения строки или контекста, чтобы избежать синтаксических конфликтов. Если в запросе отсутствует ]
, то сервер может неверно интерпретировать -- '
, и синтаксис может оказаться испорченным, вызывая ошибку.
Подводя итог, ]
здесь используется для того, чтобы правильно завершить строку и избежать ошибок, возможных в случае продолжения комментария после символа --
. Более того, это помогает безопасно завершить обработку строки, чтобы SQL сервер правильно интерпретировал инъекцию и выполнил её без изменений в оригинальном запросе, которые могли бы вызвать сбой.
Таким образом, инъекции SQL, подобные вашей, могут использовать различные символы для манипуляции с внутренним синтаксисом SQL и достижения желаемого результата.