MSSQL Injection
Перелік Active Directory
Можливо, ви зможете перелічити користувачів домену через SQL-ін'єкцію всередині сервера MSSQL, використовуючи наступні функції MSSQL:
SELECT DEFAULT_DOMAIN()
: Отримати поточне ім'я домену.master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))
: Якщо ви знаєте ім'я домену (DOMAIN у цьому прикладі), ця функція поверне SID користувача Адміністратор у шістнадцятковому форматі. Це буде виглядати як0x01050000000[...]0000f401
, зверніть увагу, що останні 4 байти - це число 500 у форматі big endian, яке є загальним ідентифікатором користувача адміністратора. Ця функція дозволить вам знати ідентифікатор домену (усі байти, крім останніх 4).SUSER_SNAME(0x01050000000[...]0000e803)
: Ця функція поверне ім'я користувача, вказаного ідентифікатором (якщо такий є), у цьому випадку 0000e803 у форматі big endian == 1000 (зазвичай це ідентифікатор першого звичайного користувача, створеного). Потім ви можете уявити, що ви можете перебрати ідентифікатори користувачів від 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
Ці трюки SSRF були взяті звідси
fn_xe_file_target_read_file
fn_xe_file_target_read_file
Для цього потрібен дозвіл VIEW SERVER STATE
на сервері.
fn_get_audit_file
fn_get_audit_file
Вимагає дозволу CONTROL SERVER
.
fn_trace_gettabe
fn_trace_gettabe
Для цього потрібен дозвіл CONTROL SERVER
.
xp_dirtree
, xp_fileexists
, xp_subdirs
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
Очевидно, ви також можете використовувати xp_cmdshell
для виконання чогось, що спричиняє SSRF. Для отримання додаткової інформації прочитайте відповідний розділ на сторінці:
MSSQL User Defined Function - SQLHttp
Створення CLR UDF (функції, визначеної користувачем Common Language Runtime), яка є кодом, написаним на будь-якій мові .NET та скомпільованим у DLL, для завантаження в MSSQL для виконання власних функцій, - це процес, який вимагає доступу dbo
. Це означає, що це зазвичай можливо лише тоді, коли підключення до бази даних виконується як sa
або з роллю адміністратора.
У цьому репозиторії Github надаються проект Visual Studio та інструкції щодо встановлення для спрощення завантаження бінарного файлу в 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
віддається за його лаконічність.
Ось як отримати схему, таблиці та стовпці з поточної бази даних:
Retrieving the Current Query
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:
https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@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--
Can be reduced to:
Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:
References
Last updated