Современные информационные технологии/ 4.Информационная безопасность
Воскобойніков А.О., Пархоменко
І.І.
Київський Національний
Авіаційний Університет
Фільтрація
вхідних даних як захист від атак типу SQL-Injections та XSS
Беручи до
уваги інтенсивність розвитку мережі Інтернет, проблема захисту web-ресурсів від атак SQL-Injections є досить актуальною на
сьогоднішній день. Для демонстрації цього достатньо здійснити пошук в Google за
запитом «inurl:.php?id=», що дасть нам список ресурсів, в яких передача параметрів
на сайт здійснюється відкрито через масив GET, тобто таких ресурсів, які є
потенційно вразливими для атаки SQL-injection.
Надалі, вже на перших сторінках результатів пошуку можна знайти вразливий
web-ресурсів. Для перевірки на вразливість
достатньо в якості параметра передати web-серверу
одинарну кавичку і отримавши у відповідь помилку представлену на рис. 1.
Query failed 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 ‘\’ ORDER
BYlastname’ at line 1 SELECT * FROM person_old
WHERE id=5\’ ORDER
BY lastname
Рис.1 Повідомлення від сервера про помилку в синтаксисі SQL
-
можна вважати, що даний ресурс рано чи пізно стане жертвою крекера чи хакера.
Постає питання, чим загрожує sql – injection?[4] Власне, знаючи sql та
розуміючи логіку його обробки в php зловмисник може досягнути будь-яких
результатів – від простого розкриття паролів користувачів до видалення всієї
бази даних.
Результатом
цієї роботи є рекомендації по захисту web-ресурсів від атак подібного роду
та готова функція фільтрації даних, що повинна спростити забезпечення такого
захисту.
Наразі ми
ознайомились з механізмом роботи SQL-injection, тепер перейдемо до наступного
типу атак – Cross Site Scripting або скорочено – XSS.
На відмінну від попередньої
атаки, ця спрямована на користувачів, тобто на клієнтів web-серверу, а не на
сам web-сервер.
Така атака
можлива, коли зловмисник може вставити в код сторінки свій код для виконання.
Відбувається це коли інформація, що виводиться на екран (наприклад, ім’я
користувача) береться з БД, куди заноситься попередньо самим же користувачем.
Якщо користувач зможе занести в БД наступний код [3]:
<iframe src=“test1.php” style=“display:none;” ></iframe>
Рис.2 HTML код підключення віддаленого файлу
То таким
чином за допомогою html-тегу <iframe> хакер зможе підключити до сторінки
вразливого сайту власний файл з шкідливим кодом. Даний файл буде
завантажуватись кожного разу при відкритті сторінки.
Вміст файлу
test1.php може бути будь-яким і залежити від фантазії зловмисника. Саме просте,
що він може робити це - зчитувати активну сесію користувача та записувати її
собі на сервері в файл.
Аналізуючи
наведену інформацію, можна зробити висновок, що загальною проблемою є
відсутність достатньої фільтрації вхідних даних.
Тепер ми
знаємо, захистом є проста фільтрація даних, проте треба розібратись, що саме
варто фільтрувати.
Ось основні
символи, які є небезпечними по відношенню до sql-injection [1]:
· Одинарні та подвійні
кавички. Їх небезпеку я вже згадував;
· Знак рівності =;
· Крапка з комою “;”.
· Символи коментарів “--”
та “/* */”.
По відношенню до xss,
основними даними, що потребують фільтрації є
[1]:
· Кутові дужки “<” та
”>”.
· Ключові слова такі як “script”
та “javascript”.
· Символи лапок “ та ‘,
слешів / та \, решітки #, відсотків %, амперсанта & та знаку рівності =.
В php є декілька функцій, які
забезпечують фільтрацію, проте вони не завжди є зручними у використанні [2]. Надалі я наведу код можливої фільтрації
даних на основі регулярних виразів:
function dataFilter($input , $type = 'alfa' , $sql = 'false'){
switch ($type) {
case 'alfa':
$input = preg_replace('/[^A-Za-z\']/','',$input);
break;
case 'num':
$input = preg_replace('/[^0-9]/','',$input);
break;
case 'alfa_num':
$input =
preg_replace('/[^A-Za-z0-9\']/','',$input);
break;
case 'alfa_num_ext':
$input =
preg_replace('/(\-{2})|[^A-Za-z0-9!@$_\-^*#\(\)\-\-\'\?]/','',$input);
break;
case 'text':
$input = preg_replace('/(\-{2})|[^A-Za-z0-9!@#$_^*\(\)\?\-\-\.,\'
]/','',$input);
break;
case 'key_op':
$input = preg_replace('/(insert)||(update)||(select)||(delete)|| (or)||(and)||(char\((.)+\))||(script)||(javascript)||(src)/i','',$input);
break;
default:
$input = preg_replace($type,'',$input);
break;
}
Рис.3 Функція фільтрації
Логіка
функції побудована на ідеї пропускання лише дозволених даних та блокуванні всіх
символів, що не є явно дозволеними в даному випадку.
Функція
приймає данні, які необхідно відфільтрувати і в залежності від обраного шаблону
забезпечує необхідний рівень фільтрації. Шаблони забезпечують існування
інформації п’яти рівнів критичності.
Даний скрипт
є простим та легким для розуміння, що робить можливим його подальше
масштабування. У випадку ж потреби, користувач зі знанням регулярних виразів
зможе легко модифікувати функцію під свої вимоги та завдання.
Отже,
нами було досліджено атаки виконання коду та можливість застосування функції
фільтрації вхідних даних на основі регулярних виразів, як спосіб протидії такій
атаці. Було показано актуальність захисту від подібного роду атак, в
особливості від SQL-ін’єкцій та XSS та наведено приклади їх реалізації, а також
приклади наслідків, до яких може призвести успішне виконання цих атак.
Література
1. Фленов М. Е. - PHP глазами хакера . – СПБ.: БХВ-Петербург, 2005. – 305с.
2. http://php.net/ -
Документація PHP
3. Матросов А., Сергеев А.,
Чаунин М. HTML 4.0 – Санкт-Петербург:
БХВ-Петербург, 1999. – 672с.
4. Фролов А.В. Базы данных в Интернете: Практическое
руководство по созданию Web-приложений с базами данных/ А.В. Фролов, Г.В.
Фролов. 2-е изд., перераб. – М.: Русская Редакция, 2000. – 448.