Введение в практическую безопасность (2019)/Эксплуатация SQL injection: различия между версиями
Asterite (обсуждение | вклад) (→UNION SELECT) |
Asterite (обсуждение | вклад) |
||
Строка 2: | Строка 2: | ||
Краткое введение в то что такое SQL injection было в [[Введение_в_практическую_безопасность_(2019)/HTTP,_инструменты_%26_SQL_injection#SQL_injection|предыдущей статье]], теперь о некоторых вещах которые может делать атакующий. | Краткое введение в то что такое SQL injection было в [[Введение_в_практическую_безопасность_(2019)/HTTP,_инструменты_%26_SQL_injection#SQL_injection|предыдущей статье]], теперь о некоторых вещах которые может делать атакующий. | ||
+ | |||
+ | === SQL-комментарий === | ||
+ | |||
+ | Супер простой трюк. В конце своей инъекции можно добавить символы однострочного SQL-комментария, тогда всё что идет дальше (как правило, остаток исходного SQL-запроса) будет считаться комментарием и проигнорируется. В разных БД символы комментария могут разными, см. документацию, чаще всего это двойной минус <code>--</code> и/или решетка <code>#</code>, также бывает классический двойной слеш <code>//</code>. Фактически, этот трюк уже был использован в примере в [[Введение_в_практическую_безопасность_(2019)/HTTP,_инструменты_%26_SQL_injection#SQL_injection|предыдущей статье]], двойной минус в конце там заставил базу данных проигнорировать оставшуюся от исходного запроса одинарную кавычку в конце. | ||
=== UNION SELECT === | === UNION SELECT === |
Версия 12:38, 15 марта 2019
Эксплуатация SQL injection
Краткое введение в то что такое SQL injection было в предыдущей статье, теперь о некоторых вещах которые может делать атакующий.
SQL-комментарий
Супер простой трюк. В конце своей инъекции можно добавить символы однострочного SQL-комментария, тогда всё что идет дальше (как правило, остаток исходного SQL-запроса) будет считаться комментарием и проигнорируется. В разных БД символы комментария могут разными, см. документацию, чаще всего это двойной минус --
и/или решетка #
, также бывает классический двойной слеш //
. Фактически, этот трюк уже был использован в примере в предыдущей статье, двойной минус в конце там заставил базу данных проигнорировать оставшуюся от исходного запроса одинарную кавычку в конце.
UNION SELECT
Очень полезным может быть UNION
(вики,доки postgres,курс "Основы современных БД"), который позволяет присоединить к результу одного SELECT
запроса результат еще одного. Если инъекция в операторе SELECT
(что в реальности довольно часто), с помощью UNION
можно добавить в его результат вывод нового, полностью написанного атакующим SELECT
- запроса из друой таблицы, с другими колонками, условиями и т. д.
Чтобы UNION
сработал, требуется чтобы количество и типы колонок совпадали. Помочь с этим может то что в SQL можно писать на месте колонок просто константы (и тогда они просто проставятся на эти места в каждой из строк результата запроса) и то что чаще всего можно использовать вместо любого значения NULL
. Если количество колонок в исходном запросе неизвестно, можно просто подбирать его.
Для такого кода
если параметр login
будет иметь значение admin' UNION SELECT * FROM users WHERE login = 'Kobzon'