Правила використання SQL injection

Ціль яку ставить автор висвітлюючи даний матеріал полягає у організації кращого захисту розроблених веб проектів, а не способів їх взлому .
Це вразливість, яка існує через недосконалість чи відсутність механізму провірки даних отриманих від користувача. Наприклад, маючи наступну адресу http://site.ua/site.php?id=01 повинна завантажитись якась сторінка. Але якщо після знаку рівності користувач вкаже будь-які символи (наприклад ...php?id= test, .php?id=01’, .php?id=10 …) і в результаті все одно завантажиться дана сторінка, то сайт на 90% може бути взломаний через sql ін’єкцію, оскільки не проводиться фільтрування отриманого від користувача параметру. В гіршому випадку отримаєте повідомлення про помилку, в кращому - пустий результат. Наприклад, .php?id=10 – повинно би повернути пустий sql запит, а .php?id=10” – помилку. В основному, ціль яка ставиться при використанні sql ін’єкції полягає у отриманні доступу до бази даних (зазвичай це MYSQL, безкоштовна для не комерційних проектів та надійна СУБД). Для розуміння наступних дій необхідні деякі знання із побудови запитів до БД. Так для визначення який номер стовпця виводить на сторінку інформацію достатньо виконати запит типу /test.php?id=10+union+select+’test’,null,null/* чи /test.php?id=10+union+select+null,’test’,null/*. Якщо з бази читається кілька параметрів то необхідно знайти той, що має тип text . А ці запити потрібно виконувати доки не побачимо слово test у потрібному місці. Одною із цікавих властивостей MYSQL є перетворення числового типу даних до будь-якого іншого, без породження при цьому помилки. Це майже як у РНР, змінній не присвоюється певний тип даних, що можна можна використати при взломі сайту, простим перевизначенням цієї змінної ( наприклад, присвоїти їй якусь адресу скрипта) . Цю властивість можна використати при такому запиті, де лапки можуть фільтруватися .php?id=10+union+select+1,2,3/* . Ім’я таблиці можна отримати наступним запитом .php?id=01+union+select+null,null,null+from+table1/* . Так можна часом знайти таблицю з ім’ям users, passwords etc і працювати вже безпосереньо з нею. Назви стовпців в таблиці вичисляються так .php?id=10+union+select+null,row1,null+from+table1/* . Якщо користувач має права на select то в результаті запиту .php?id=10+union+select+null,mysql.user.password,null+from+mysql.user/* можна отримати хеш пароля, який потім розшифровується.
Одним із модулів Apache є mod_security. Його часто використовують як запобіжний захід проти sql ін’єкції. Але механізм цей можна обійти. По замовчуванню цей модуль не фільтрує значення cookie. Ну і відповідно значення змінних можна передати як cookie. У Apache є ще один модуль mod_rewrite . Він здійснює перетворення до GET параметра скрипта. Наприклад /site/01.html перетворюється до /site/site.php?id=01 за наступним правилом RewriteRule ^/site/(.*)\.html$ “/site/site.php?id=$1”. Це можна використати, наприклад, за наступною схемою /site/01-1.html . Якщо отримаєте повідомлення про помилку, можна дізнатися адресу скрипта та підібрати параметр. Ну а по способах захисту від sql ін’єкції написано достатньо багато. Після прочитання даного матеріалу крутим хакером не станеш. Є ще серія інших підходів до використання sql ін’єкцій, які я упустив. Це як у вічному питанні : «Відомо, що апетит приходить під час їди. Чому їда не приходить під час апетиту?»

© Інформаційні технології. Аналітика , Рідна Мережа