MSSQL Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Можливо, перерахувати доменні користувачі через SQL-ін'єкцію всередині сервера MSSQL, використовуючи наступні функції MSSQL:
SELECT DEFAULT_DOMAIN()
: Отримати назву поточного домену.
master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))
: Якщо ви знаєте назву домену (DOMAIN в цьому прикладі), ця функція поверне SID користувача Administrator у шістнадцятковому форматі. Це виглядатиме як 0x01050000000[...]0000f401
, зверніть увагу, як останні 4 байти є числом 500 у форматі big endian, що є загальним ID користувача адміністратора.
Ця функція дозволить вам дізнатися ID домену (всі байти, крім останніх 4).
SUSER_SNAME(0x01050000000[...]0000e803)
: Ця функція поверне ім'я користувача вказаного ID (якщо є), в цьому випадку 0000e803 у big endian == 1000 (зазвичай це ID першого звичайного користувача). Тоді ви можете уявити, що можете перебрати ID користувачів з 1000 до 2000 і, ймовірно, отримати всі імена користувачів домену. Наприклад, використовуючи функцію, подібну до наступної:
Помилки на основі SQL-ін'єкцій зазвичай нагадують конструкції, такі як +AND+1=@@version--
та варіанти, засновані на операторі «OR». Запити, що містять такі вирази, зазвичай блокуються WAF. Як обхідний шлях, об'єднайте рядок, використовуючи символ %2b, з результатом конкретних викликів функцій, які викликають помилку перетворення типу даних на бажаних даних.
Деякі приклади таких функцій:
SUSER_NAME()
USER_NAME()
PERMISSIONS()
DB_NAME()
FILE_NAME()
TYPE_NAME()
COL_NAME()
Приклад використання функції USER_NAME()
:
Ці трюки SSRF були взяті звідси
fn_xe_file_target_read_file
Вимагає VIEW SERVER STATE
дозволу на сервері.
fn_get_audit_file
Вимагає дозволу CONTROL SERVER
.
fn_trace_gettabe
Це вимагає дозволу CONTROL SERVER
.
xp_dirtree
, xp_fileexists
, xp_subdirs
Збережені процедури, такі як xp_dirtree
, хоча й неофіційно задокументовані Microsoft, були описані іншими в Інтернеті через їхню корисність у мережевих операціях в MSSQL. Ці процедури часто використовуються в ексфільтрації даних поза каналом, як показано в різних прикладах та постах.
Збережена процедура xp_dirtree
, наприклад, використовується для виконання мережевих запитів, але вона обмежена лише TCP портом 445. Номер порту не підлягає зміні, але дозволяє читати з мережевих загальних папок. Використання демонструється в SQL-скрипті нижче:
Зазначимо, що цей метод може не працювати на всіх конфігураціях систем, таких як Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
, що працює на Windows Server 2016 Datacenter
з налаштуваннями за замовчуванням.
Крім того, існують альтернативні збережені процедури, такі як master..xp_fileexist
та xp_subdirs
, які можуть досягти подібних результатів. Додаткову інформацію про xp_fileexist
можна знайти в цій статті TechNet.
xp_cmdshell
Очевидно, ви також можете використовувати xp_cmdshell
для виконання чогось, що викликає SSRF. Для отримання додаткової інформації прочитайте відповідний розділ на сторінці:
Створення CLR UDF (User Defined Function для загального середовища виконання), що є кодом, написаним будь-якою мовою .NET і скомпільованим у DLL, для завантаження в MSSQL для виконання користувацьких функцій, є процесом, що вимагає доступу dbo
. Це означає, що зазвичай це можливо лише тоді, коли з'єднання з базою даних здійснюється як sa
або з роллю адміністратора.
Проект Visual Studio та інструкції з установки надані в цьому репозиторії Github для полегшення завантаження бінарного файлу в MSSQL як CLR збірки, що дозволяє виконувати HTTP GET запити зсередини MSSQL.
Основна функціональність цього процесу закладена у файлі http.cs
, який використовує клас WebClient
для виконання GET запиту та отримання вмісту, як показано нижче:
Перед виконанням SQL-команди CREATE ASSEMBLY
рекомендується виконати наступний SQL-фрагмент, щоб додати SHA512 хеш збірки до списку довірених збірок сервера (доступний через select * from sys.trusted_assemblies;
):
Після успішного додавання збірки та створення функції, наступний SQL код може бути використаний для виконання HTTP запитів:
Стисла методика для витягування повного вмісту таблиці за один запит полягає у використанні клаузи FOR JSON
. Цей підхід є більш стиснутим, ніж використання клаузи FOR XML
, яка вимагає специфічного режиму, такого як "raw". Клаузу FOR JSON
віддають перевагу за її стислість.
Ось як отримати схему, таблиці та стовпці з поточної бази даних:
For users granted the VIEW SERVER STATE
permission on the server, it's possible to see all executing sessions on the SQL Server instance. However, without this permission, users can only view their current session. The currently executing SQL query can be retrieved by accessing sys.dm_exec_requests and sys.dm_exec_sql_text:
To check if you have the VIEW SERVER STATE permission, the following query can be used:
Non-standard whitespace characters: %C2%85 или %C2%A0:
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
https://vuln.app/getItem?id=0xunion+select+null,@@version,null--
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
So for example, multiple queries such as:
Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)