Як зламати сайт?
Для початку визначимося з тим, що цією статтею я ні в якому разі не закликаю кого-небудь зламувати чиї-небудь інтернет-ресурси, використовуючи описані нижче методи.
Основна мета статті - продемонструвати користувачеві важливість теми захисту даних в Інтернеті на прикладі сайту, не захищеного належним чином. В якості способу атаки на сайт буде використовуватися, мабуть, найпоширеніший метод злому сайту - SQL-ін'єкція.
Для початку визначимося з тим, що всі без винятку сучасні об'ємні, складні сайти будуються на основі бази даних. Робота з даними, що зберігаються в базі даних вашого сайту, здійснюється за допомогою структурного мови запитів SQL.
SQL-ін'єкція - техніка впровадження у вихідний SQL-запит певного коду (не порушує структури самого запиту) з метою отримання доступу до даних, що містяться в БД.
Таким чином за певних умов, пов'язаних, як правило, з відсутністю в коді і запитах сайту функцій, спрямованих на захист даних, зломщик може за допомогою SQL-ін'єкції прочитати вміст будь-яких таблиць, а також видалити, змінити або додати дані, отримати можливість читання та / або запису локальних файлів і виконання довільних команд на атакується сервері. Не будемо довго зупиняти на теорії і перейдемо до дій.
Отже, для початку познайомимося з таким поняттям, як передача даних методом GET. Чи не помічали ви, подорожуючи по сторінках нескінченного Інтернету, що посилання, за якими ви подорожуєте, часто мають вигляд типу:
www.хххххх.ru / index.php? щось = чогось тоеще_что-то = еще_чему-то,
де на місці моїх умовних «щось» і «чогось» стоять всілякі значення.
Так от, знайте, що url, що виглядають подібним чином, містять в собі певну інформацію, а саме: за знаком питання слід спочатку змінна (її ім'я), а потім = її значення. Знак відокремлює змінні один від одного.
А робиться це все лише для того, щоб сторінка, до якої ви звертаєтеся, могла змінюватися залежно від цих змінних, тобто їх значення передаються тим самим методом GET в код сторінок сайту, там ці значення обробляються, а на основі отриманих результатів і виходить наша веб-сторінка.
Але тільки вдумайтеся! Адже ніхто не може вам заборонити взяти і вручну підправити цей url, зробити його таким, як потрібно вам, натиснути після цього клавішу enter і відправити дані цього url-а на обробку серверу БД !! Саме тут і виникає можливість впровадження SQL-ін'єкції.
Отже, почнемо. Ми маємо сайт, який на підставі параметра id, переданого методом GET, виймає певні дані з БД і формує на їх основі нашу сторінку. Ось код цього SQL-запиту, який обробляє наші дані з url-а:
$ Result3 = mysql_query ('SELECT * FROM raspisanie WHERE cat = $ id').
Якщо перекласти на російську мову, запит виконує вибірку всіх даних з бази даних raspisanie, де поле cat = $ id. По суті все, що в запиті йде за нашою змінної $ id, яку ми передаємо з url-а, нам вже не важливо, і пізніше я поясню чому. Тепер розберемося з самим url-му. Нехай спочатку він виглядає так:
www.хххххх.ru / index.php? id = 3.
Тобто ми передаємо цим url-запитом параметр id = 3, і сторінка формується на основі цього параметра, значить він поміщається в наш SQL-запит і виходить, що з бази даних витягуються всі дані з таблиці raspisanie, де поле cat = $ id = 3. А тепер перейдемо до найцікавішого. Припустимо, ми знаємо, що в базі даних атакується сайту в таблиці users зберігаються логін і пароль від адміністраторській зони сайту - в полях login і password відповідно. І тоді, просто змінивши наш url наступним чином:
www.хххххх.ru / index.php? id = 3 + union + select + 1,2, login, password, 5,6,7 + from + user / *
- Сторінка помістить всю цю велику змінну в наш запит, який стане виглядати як
$ Result3 = mysql_query ('SELECT * FROM raspisanie WHERE cat = 3 union select 1,2, login, password, 5,6,7 from user / *').
І, обробивши такий новий запит, який ніяк не порушує структуру таблиць БД, сервер сам поверне нам, крім звичайної інформації, що відповідає значенню id = 3, ще й логін з паролем від сайту!
Щоб було зовсім зрозуміло, я переведу наш новий «чарівний запит»:
«Вибрати всі дані з таблиці raspisaniе, де поле cat = 3, а також зробити інший запит: вивести, крім отриманих даних, значення логіна і пароля з таблиці users».
Числа 1, 2 і т.д. є довільними і використовуються для збереження структури запиту, і число таких значень визначається підбором - до тих пір, поки число таких значень стане рівним числу значень, які виводяться з бази даних за замовчуванням.
Імена таблиці users і значення полів для логіна і пароля також визначаються підбором, адже погодьтеся, скрізь вони мають приблизно однакові назви. І, нарешті, символи в кінці нашого url-а «/ *» служать для відкидання хвоста початкового запиту в разі його присутності, щоб він не порушив структуру запиту впровадженого.
Отже, ми наочно, на прикладі успішного впровадження SQL-ін'єкції, ознайомилися з одним із можливих способів злому сайту.
Не нехтуйте питаннями захисту інформації свого сайту і спіть спокійно!