Кількість сайтів і сторінок в Мережі неухильно зростає. За розробку беруться всі, хто тільки може. І початківці веб-програмісти дуже часто використовують небезпечний і старий код. А це створює безліч лазівок для зловмисників і хакерів. Чим вони і користуються. Одна з найбільш класичних вразливостей — SQL-ін'єкція.
Трохи теорії
Багато хто знає, що більшість сайтів та сервісів в мережі використовують для зберігання бази SQL. Це такий мова структурованих запитів , який дозволяє керувати і адмініструвати сховища даних. Відомо багато різних версій систем управління базами даних Oracle, MySQL, Postgre. Незалежно від імені і типу, вони однаково використовують запити до даних. Саме тут і криється потенційна уразливість. Якщо розробник не зміг правильно і безпечно обробити запит, то зловмисник може скористатися цим і застосувати особливі тактики для отримання доступу до бази, а звідти - і до управління всім сайтом.
Для уникнення таких ситуацій потрібно грамотно оптимізувати код і уважно стежити за тим, який запит яким способом обробляється.
Перевірка на SQL-ін'єкції
Для встановлення наявності уразливості в мережі є маса готових автоматизованих програмних комплексів. Але можна здійснити просту перевірку і вручну. Для цього потрібно перейти на один з досліджуваних сайтів і в адресному рядку спробувати викликати помилку бази даних. Наприклад, скрипт на сайті може обробляти запити і не обрізати їх. Наприклад, є некий_сайт/index.php?id=25 Найлегший спосіб — поставити після 25 лапки і відправити запит. Якщо ніякої помилки не виникло, то або на сайті фільтруються всі запити і правильно обробляються, або в налаштуваннях відключений їх висновок. Якщо сторінка перезавантажилась з проблемами, значить, вразливість для SQL-ін'єкції є.
Після того як вона виявлена, можна спробувати позбутися від неї. Для реалізації даної уразливості потрібно знати трохи про командах SQL-запитів. Одна з них — UNION. Вона об'єднує кілька результатів запиту в один. Так можна обчислити кількість полів в таблиці. Приклад першого запиту виглядає так: некий_сайт/index.php?id=25 UNION SELECT 1. У більшості випадків такий запис повинен видати помилку. Це означає, що кількість полів не дорівнює 1. Таким чином, підбираючи варіанти від 1 і більше, можна встановити їх точну кількість: некий_сайт/index.php?id=25 UNION SELECT 123456. То є, коли помилка перестане з'являтися, значить, кількість полів вгадано. Є також і альтернативний варіант вирішення цієї проблеми. Наприклад, коли число полів велике — 3060 або 100. Це команда GROUP BY. Він групує результати запиту за будь-якою ознакою, наприклад id: некий_сайт/index.php?id=25 GROUP BY 5. Якщо помилок не було отримано, значить, полів більше, ніж 5. Таким чином, підставляючи варіанти з доволі обширного діапазону, можна вирахувати, скільки ж їх насправді. Даний приклад SQL-ін'єкції для новачків, які хочуть спробувати себе в тестуванні свого сайту. Важливо пам'ятати, що за несанкціонований доступ до чужого є стаття Кримінального кодексу.
Основні типи ін'єкцій
Реалізувати уразливості допомогою SQL-ін'єкції можна декількома варіантами. Далі йдуть найбільш популярні методики: UNION SQL query injection. Простий приклад даного типу було вже розглянуто вище. Реалізується він за рахунок помилки в перевірці приходять даних, які ніяк не фільтруються. Error-based SQL injection. Як зрозуміло з назви, даний тип також використовує помилки, посилаючи вирази, складені синтаксично неправильно. Потім відбувається перехоплення заголовків відповіді, аналізуючи які, можна провести згодом SQL-ін'єкцію.
Stacked запити SQL injection. Дана уразливість визначається виконанням послідовних запитів. Він характеризується приєднанням наприкінці знака «;». Цей підхід найчастіше реалізується для доступу до реалізації читання і запису даних або ж управлінням функціями операційної системи, якщо привілеї це дозволяють.
Програмні комплекси для пошуку SQL-вразливостей
Наявні для проведення SQL-ін'єкцій, програми зазвичай мають дві складових — сканування сайту на можливі уразливості та їх використання для отримання доступу до даних. Існують такі утиліти практично для всіх відомих платформ. Їх функціонал значною мірою полегшує перевірку сайту на можливість злому SQL-ін'єкцією.
Sqlmap
Дуже потужний сканер, що працює з більшістю відомих СУБД. Підтримує різні методики впровадження SQL-ін'єкцій. Має можливість автоматичного розпізнавання типу хеш пароля і його злому за словником. Присутній і функціонал завантаження і вивантаження файлів з сервера.
Установка в середовищі Linux виконується за допомогою команд: git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev, cdsqlmap-dev/, ./sqlmap.py --wizard.
Для Windows є як варіант з командним рядком, так і з графічним інтерфейсом користувача.
jSQL Injection
jSQL Injection — багатоплатформовий інструмент для тестування використання SQL вразливостей. Написаний на Java, тому в системі повинен бути встановлений JRE. Здатний обробляти запити GET, POST, header, cookie. Володіє зручним графічним інтерфейсом.
Установка цього програмного комплексу відбувається так: wget https://github.com/`curl -s https://github.com/ron190/jsql-injection/releases| grep-E -o '/ron190/jsql-injection/releases/download/v[0-9]{12}.[0-9]{12}/jsql-injection-v[0-9]{12}.[0-9]{12}.jar'| head-n 1`
Запуск здійснюється за допомогою команди java -jar ./jsql-injection-v*.jar Для того щоб почати перевірку сайту на SQL-вразливість, потрібно ввести його адресу у верхнє поле. Вони є окремі для GET і для POST. При позитивному результаті в лівому вікні з'явиться список доступних таблиць. Їх можна переглянути і дізнатися якусь конфіденційну інформацію. Для пошуку адміністративних панелей використовується вкладка «Admin page». На ній з допомогою спеціальних шаблонів виконується автоматичний пошук системних записів привілейованих користувачів. З них можна отримати лише хеш пароля. Але і він є в інструментарії програми.
Після знаходження всіх вразливостей і ін'єктування потрібних запитів, утиліта дозволить залити на сервер файл або ж, навпаки, завантажити його звідти.
SQLi Dumper v.7
Дана програма — простий у використанні інструмент для пошуку і реалізації вразливостей в SQL. Виробляє оон це на основі так званих дорков. Їх список можна знайти в інтернеті. Дорки для SQL-ін'єкцій — це спеціальні шаблони пошукових запитів. З їх допомогою можна знайти потенційно уразливий сайт через будь-який пошуковик.
Інструменти для тренування
На сайті itsecgames.com є спеціальний набір інструментарію, який дозволяє на прикладі показує як зробити SQL ін'єкцію і протестувати її. Для того щоб скористатися, її потрібно завантажити і встановити. Архів містить у собі набір файлів, який представляє собою структуру сайту. Для його установки знадобиться наявний у системі набір веб-сервера Apache, MySQL та PHP.

Розпакувавши архів в папку веб-сервера, треба перейти за адресою, введеному при установці даного програмного продукту. Відкриється сторінка з реєстрацією користувача. Тут потрібно ввести свої дані і натиснути «Create». Перевівши користувача в нове вікно, система запропонує вибрати один з варіантів тестування. Серед них є як описувані ін'єкції, так і багато інших тестових завдань. Варто розглянути приклад SQL-ін'єкції типу GET/Search. Тут потрібно вибрати її і натиснути «Hack». Перед користувачем з'явиться рядок пошуку і імітація якогось сайту з фільмами. Перебирати фільми можна довго. Але їх всього 10. Наприклад, можна спробувати ввести Iron Man. Виведеться фільм, значить, сайт працює, і таблиці в ньому є. Тепер треба перевірити, фільтрує чи скрипт особливі символи, зокрема лапки. Для цього в рядок адреси потрібно додати '». Причому, зробити це треба після назви фільму. Сайт видасть помилку Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%" at line 1 яка свідчить про те, що символи все-таки обробляються неправильно. Отже, можна пробувати підставити свій запит. Але потрібно спочатку обчислити кількість полів. Для цього використовується order by, який вводиться після лапки: http://testsites.com/sqli_1.php?title=Iron+Man' order by 2 --&action=search. Дана команда просто виведе інформацію про фільм, тобто кількість полів більше 2. Подвійний дефіс повідомляє серверу, що інші запити потрібно відкинути. Тепер треба перебирати, підставляючи всі великі значення до тих пір, поки не з'явиться помилка. У підсумку вийде, що полів буде 7.

Тепер настав час отримати щось корисне з бази. Доведеться трохи модифікувати запит в адресному рядку, привівши її до такого виду: http://testsites.com/sqli_1.php?title=Iron+Man' union select 1 database(),user(),4password,67 from users --&action=search. В результаті її виконання виведуться рядки з хэшами паролів, які можна легко перетворити в зрозумілі символи з допомогою одного з онлайн сервісів. А трохи повороживши і підібравши ім'я поля з логіном, можна отримати доступ до чужого запису, наприклад адміна сайту. У продукті є маса різновидів типів ін'єкцій, на яких можна попрактикуватися. Варто пам'ятати, що застосування даних навичок в мережі, на реальних сайтах може виявитися кримінально караним.
Ін'єкції і PHP
Як правило, саме PHP-код і відповідає за необхідну обробку запитів, що надходять від користувача. Тому саме на цьому рівні потрібно вибудовувати захист від SQL-ін'єкцій в PHP. Для початку варто дати кілька простих рекомендацій, на основі яких потрібно це робити. Дані завжди повинні бути оброблені перед приміщенням в базу. Це можна реалізувати або використовуючи вже наявні вирази, або організовуючи запити вручну. Тут теж варто враховувати, що числові значення перетворюються до того типу, який необхідний; Уникати у запиті появи різних керуючих конструкцій. Тепер трохи про правила складання запитів для MySQL для захисту від SQL-ін'єкцій. При складанні будь-яких виразів для запиту важливо відокремлювати дані від ключових слів SQL. SELECT * FROM table WHERE name = Zerg. У даній конструкції система може подумати, що Zerg — це ім'я якогось поля, тому потрібно укласти його в лапки. SELECT * FROM table WHERE name = 'Zerg'. Проте, бувають ситуації, коли значення сама по собі містить лапки. SELECT * FROM table WHERE name = 'кот-д'івуар'. Тут буде опрацьовано лише частина кот-д, а решта може бути сприйнята як команда, якої, природно, немає. Тому виникне помилка. Значить треба такого роду дані екранувати. Для цього використовується зворотний слеш - . SELECT * FROM table WHERE name = 'кот-д'івуар'. Все вищезазначене відноситься до рядків. Якщо дія відбувається з числом, то йому не потрібні ні лапки ні слеш. Однак їх треба обов'язково в примусовому порядку приводити до необхідного типу даних. Існує рекомендація, за якою ім'я поля повинна бути укладена у зворотний лапки. Цей символ знаходиться в лівій частині клавіатури, разом зі знаком тильда «~». Це потрібно для того, щоб MySQL могла точно відрізнити ім'я поля від свого ключового слова.
Динамічна робота з даними
Дуже часто для отримання будь-яких даних з бази використовуються запити, сформовані динамічно. Наприклад: SELECT * FROM table WHERE number = '$number'. Тут змінна $number передається як визначення значення поля. Що ж буде, якщо в неї потрапить 'кот-д'івуар'? Помилка. Уникнути цієї неприємності, звичайно, можна включивши «чарівні лапки» в налаштуваннях. Але тепер дані будуть екрануватися там, де треба і не треба. До того ж якщо код пишеться вручну, то можна витратити трохи більше часу на те, щоб створити стійку до злому систему самому. Для самостійного додавання слеша можна використовувати mysql_real_escape_string. $number=mysql_real_escape_string($number); $year=mysql_real_escape_string($year); $query="INSERT INTO table (number,year,class) VALUES ('$number','$year',11)". Хоча код і виріс в обсязі, все ж, потенційно він буде працювати набагато безпечніше.
Плейсхолдеры
Плейсхолдеры — своєрідні маркери, за якими система дізнається що в це місце потрібно підставити спеціальну функцію. Наприклад: $sate = $mysqli->prepare("SELECT District Number FROM WHERE Name=?"); $sate->bind_param("s", $number); $sate->execute(); Даний фрагмент коду здійснює підготовку шаблону запиту, потім прив'язує змінну number, і виконує його. Даний підхід дозволяє розділити обробку запиту та його реалізацію. Таким чином, можна вберегтися від використання впровадження шкідливого коду SQL-запити.
Що може зробити зловмисник
Захист системи - дуже важливий чинник, яким не можна нехтувати. Звичайно, простенький сайт-візитку буде простіше відновити. А якщо це великий портал, сервіс, форум? Які наслідки можуть бути, якщо не думати про безпеку? По-перше, хакер може порушити цілісність бази, так і видалити її цілком. І якщо адміністратор сайту або хостер не зробили бекап, то доведеться несолодко. Крім усього, зловмисник, зламавши один сайт, може перейти на інші, розміщені на цьому ж сервері. Далі йде розкрадання особистих даних відвідувачів. Як їх використовувати — тут все обмежено лише фантазією хакера. Але в будь-якому випадку наслідки будуть не дуже приємними. Тим більше якщо містилася фінансова інформація. Також зловмисник може злити базу собі, а потім вимагати гроші за її повернення. Дезінформація користувачів від імені адміністратора сайту, особою їм не є, також може нести негативні наслідки, так як можливі факти шахрайства.
Висновок
Вся інформація в даній статті надана виключно в ознайомлювальних цілях. Використовувати її потрібно тільки для тестування власних проектів при виявленні недоліків та їх усунення. Для більш поглибленого вивчення методики того, як провести SQL-ін'єкцію, потрібно почати власне з дослідження можливостей і особливостей мови SQL. Як складаються запити, ключові слова, типи даних і застосування всього цього. Також не обійтися без розуміння функцій PHP і елементів HTML. Основними уразливими точками для використання ін'єкцій — адресна рядок, пошук і різні поля. Вивчення функцій PHP, спосіб їх реалізації і можливості дозволять зрозуміти, як можна уникнути помилок. Наявність безлічі готових програмних інструментів дозволяють провести глибокий аналіз сайту на відомі уразливості. Один з найбільш популярних продуктів — kali linux. Це образ операційної системи на базі Linux, який містить в собі велику кількість утиліт і програм, здатних провести всебічний аналіз сайту на міцність. Для чого потрібно знати, як зламати сайт? Все дуже просто — це треба для того, щоб мати уявлення про потенційно уразливих місцях свого проекту або сайту. Особливо якщо це який-небудь інтернет-магазин з можливістю оплати онлайн, де платіжні дані користувача можуть бути скомпрометовані зловмисником. Для професійного дослідження існують служби інформаційної безпеки зможуть перевірити сайт за різними критеріями і глибині. Починаючи від простої HTML-ін'єкції і до соціальної інженерії і фішингу.