Автоматизація пошуку SQL Injection

Автор: Олексій Немиро http://aleksey.nemiro.ru Джерело: RSDN Magazine #2-2008
Постановка задачі Реалізація Висновок
знайти

SQL Injection - це досить поширена вразливість web-сайтів, що дозволяє зловмиснику виконувати свій SQL-код шляхом підстановки його в очікувані параметри сторінки. Таким чином, зловмисник може легко отримати доступ до секретних даних, додати, змінити або видалити дані.

У цій статті я розповім і покажу на прикладах мов PHP і C#, як написати програму, яка автоматично скануватиме задані сайти на предмет наявності в них уразливості типу SQL Injection. Звичайно, все це робиться з метою усунення таких уразливостей. :)

Постановка задачі

Насамперед необхідно визначитися із завданнями. Програма має вміти:

Виконати найпростіший HTTP-запит нескладно і в рамках цієї статті далі GET-запитів нам ходити не доведеться.

Як SQL-код, який буде додаватися до параметрів сторінки, можна використовувати звичайну одинарну лапку ('), цього цілком достатньо, щоб за наявності кривих рук у web-програмістів сервер видав якусь помилку. Досить часто web-програмісти роблять помилки саме з лапками, особливо часто подібні помилки допускаються в типах даних, коли параметр начебто є числом, але в той же час, за рахунок особливостей використовуваних технологій, може містити рядкові дані.

Подібними помилками часто страждають сайти, написані на класичному ASP і PHP, зазвичай через недосвідченість або банальну лінощі програмістів. Варто зауважити, що в ASP.NET ймовірність виникнення SQL Injection дорівнює практично нулю, і щоб створити подібну вразливість, руки упрограміста дійсно мають рости зовсім не звідти, звідки ростуть. З огляду на це намагатися знайти SQL Injection на сайті, написаному на ASP.NET, особливого сенсу немає.

Реалізація

Отже, завдання поставлене, приступимо до реалізації. Насамперед напишемо функцію, яка виконуватиме звичайний GET-запит.

Як я вже говорив раніше, пошук посилань буде здійснюватися за допомогою регулярних виразів. Слід зважити, що посилання можуть містити відносний шлях, тому такі посилання потрібно буде перетворити на звичайний вигляд. Також необхідно передбачити, що значення параметрів сторінки можуть змінюватися, і дублікати таких сторінок слід виключити з аналізу.

Насамкінець потрібно написати найголовнішу функцію, яка «скануватиме Інтернет» і шукатиме сторінки, які можуть містити вразливість типу SQL Injection.

Далі я підставляю одинарну лапку у параметри знайдених сторінок, роблю запит та аналізую вміст цих сторінок. У змінній errorMessages міститься список найчастіших слів і словосполучень, що зустрічаються в повідомленнях про помилки баз даних, саме ці слова я і шукатиму у відповідях сервера. До речі, сайти, що працюють на популярних двигунах, при отриманні незвичайного значення параметра можуть показати повідомлення про те, що була запобігла спробі злому, або просто віддаватимуть порожню сторінку.

Через пошуковик я знайшов пару сайтів із SQL Injection, не приховую, що шукати довелося задовго, в основному траплялися звичайні помилки БД, з яких нічого цікавого отримати не вдалося. Тим не менш, програма працює, і може спростити роботу з аналізу вразливості своїх проектів.

Висновок

Звичайно, код не ідеальний, але загальна ідея думаю зрозуміла. Якщо говорити про те, щонепогано було б реалізувати, це такі дрібниці, як аналіз заголовків, головним чином, обробка відповідей з кодом 301 і 302. У PHP для цього доведеться розібрати HTTP-заголовки, а в C # це можна зробити автоматично, за допомогою властивості AllowAutoRedirect. Також можна перевірити тип вмісту, який повертає сервер, щоб, наприклад, не намагатися знайти посилання у графічному файлі. Що стосується POST-запитів, в яких також можна знайти чимало дір, то тут необхідно отримати вміст з тегів form, знайти в цьому вмісті елементи управління і створити з них url, а в параметри підставити хоча б стару-добру одинарну лапку. З технічного боку це реалізувати нескладно, хоча комусь може здатися трохи нудно, т.к. доведеться врахувати багато різних факторів.