Найти в Дзене
CodeQuartz | Ёжик в IT

Как сайты взламывают на самом деле? | SQL-инъекции для чайников

Представьте, что весь интернет — это огромный город. В этом городе есть здания — это сайты. А в каждом здании есть сейфы — это базы данных. В этих сейфах хранятся все сокровища: ваши логины, пароли (часто в зашифрованном виде), номера карт, личные переписки — всё. Сейчас мы откроем замочную скважину одного из самых хитрых и элегантных способов, которым воры вскрывают эти сейфы, не взламывая дверь, а просто попросив её открыться. Это метод называется SQL-инъекция. Вы заходите на сайт интернет-магазина, чтобы купить кроссовки. На сайте есть форма поиска. Вы вводите Nike Air Force и нажимаете «Найти». Что происходит «за кулисами»? Сайт, как хорошо обученный швейцар, относит вашу просьбу в «сейфовую комнату» (базу данных) и говорит ей на особом языке, языке баз данных — SQL. Фраза звучит примерно так: «Эй, база! Дай мне все товары, где название = 'Nike Air Force'» База данных слышит эту чёткую команду, находит нужные кроссовки и отдаёт их швейцару, который показывает их вам. Всё честно. А
Оглавление

Представьте, что весь интернет — это огромный город. В этом городе есть здания — это сайты. А в каждом здании есть сейфы — это базы данных. В этих сейфах хранятся все сокровища: ваши логины, пароли (часто в зашифрованном виде), номера карт, личные переписки — всё.

Сейчас мы откроем замочную скважину одного из самых хитрых и элегантных способов, которым воры вскрывают эти сейфы, не взламывая дверь, а просто попросив её открыться. Это метод называется SQL-инъекция.

Сцена 1: Вежливый посетитель и доверчивый швейцар

Вы заходите на сайт интернет-магазина, чтобы купить кроссовки. На сайте есть форма поиска. Вы вводите Nike Air Force и нажимаете «Найти».

Что происходит «за кулисами»? Сайт, как хорошо обученный швейцар, относит вашу просьбу в «сейфовую комнату» (базу данных) и говорит ей на особом языке, языке баз данных — SQL. Фраза звучит примерно так:

«Эй, база! Дай мне все товары, где название = 'Nike Air Force'»

База данных слышит эту чёткую команду, находит нужные кроссовки и отдаёт их швейцару, который показывает их вам. Всё честно.

Сцена 2: Посетитель с отмычкой в улыбке

А теперь представьте, что вы — хакер. Вы подходите к тому же швейцару. Но вместо «Nike Air Force» вы вводите в строку поиска странную, на первый взгляд, бессмыслицу:

Nike Air Force'; DROP TABLE Users; --

Вы нажимаете «Enter». Швейцар, будучи машиной без собственного мнения, честно несёт ЭТУ фразу в сейфовую комнату и, ни капли не сомневаясь, повторяет её дословно. И вот что слышит база данных:

«Эй, база! Дай мне все товары, где название = 'Nike Air Force'; DROP TABLE Users; -- »

Давайте разберем эту взрывную фразу по косточкам:

  1. Nike Air Force' — Первая часть команды. База данных её понимает и начинает искать кроссовки.
  2. ; — Точка с запятой. Для базы данных это как команда «КОНЕЦ ПРЕДЛОЖЕНИЯ!». Она завершает первую инструкцию и готова слушать следующую.
  3. DROP TABLE Users; — А это уже новая, смертельная команда. DROP TABLE означает «УДАЛИ ТАБЛИЦУ». Users — это имя таблицы, где хранятся все логины и пароли пользователей. База данных послушно выполняет: раз — и таблицы Users больше нет. Удалена. Безвозвратно.
  4. -- — А это — комментарий. В SQL всё, что следует за этими символами, игнорируется. Хакер использует это, чтобы «закомментировать» хвост оригинальной команды сайта, который мог бы испортить его злодейский план.
-2

Всё. Сайт «упал». База данных уничтожена. Хакер, не взламывая замки, просто сказал волшебные слова, и сейф сам себя уничтожил.

Сцена 3: Не вор, а призрак, который подглядывает

Но красть или удалять данные — не всегда цель. Чаще хакеру нужно просто подглядеть. Вернемся к форме входа на сайт, куда вы вводите логин и пароль.

В норме сайт отправляет запрос:

«Эй, база! Есть ли у тебя пользователь с логином = 'ivan' и паролем = '12345'?»

Если есть — добро пожаловать.

Хакер же в поле логина может ввести: ' OR 1=1 --

И вот какой запрос получает база данных:

«Эй, база! Есть ли у тебя пользователь с логином = ' ' OR 1=1 -- ' и паролем = '??? '»

Расшифруем магию:

  • ' — Закрывает кавычку от оригинального запроса.
  • OR — Логическое «ИЛИ». Золотой ключик хакера.
  • 1=1 — Это выражение всегда истинно. Всегда. Это закон математики.
  • -- — И снова комментарий, который «отменяет» проверку пароля.

База данных слышит эту логику: «Найди пользователя, где логин пустой... ИЛИ... 1=1». Поскольку 1=1 — это всегда правда, условие выполняется для КАЖДОГО пользователя в базе! База в замешательстве возвращает первого пользователя в списке (часто это администратор), и хакер заходит на сайт под его именем!

-3

Эпилог: Как от этого защищаются?

Вы наверняка спросите: «Неужели всё так хрупко?». Раньше — да. Сейчас — нет.

Спасение от этой магии простое и гениальное: разделение команды и данных.

Представьте, что теперь наш швейцар не зачитывает записку вслух, а отдает её в запечатанном прозрачном конверте. Человек в сейфовой комнате видит текст, но понимает, что это просто данные для поиска, а не команда. Он сам, по безопасному шаблону, подставляет эти данные в запрос. Какой бы текст вы ни написали, он никогда не станет исполняемой командой. Этот метод называется prepared statements (подготовленные выражения) — и это золотой стандарт безопасности.

Так что в следующий раз, когда будете вводить свой логин в форму на сайте, помните: под капотом разворачивается целая битва между доверчивостью и бдительностью. К счастью, сегодня почти все современные сайты научились быть бдительными.

Но знать о старых трюках стоит — хотя бы для того, чтобы осознавать, какая магия происходит каждый раз, когда вы просто кликаете кнопку «Войти».