MSSQL Injection
Active Directory enumeration
Можливо, перерахувати користувачів домену через 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()
:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2Fswarm.ptsecurity.com%2Fwp-content%2Fuploads%2F2020%2F11%2F6.png&width=768&dpr=4&quality=100&sign=4cb6db8a&sv=1)
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. Ці процедури часто використовуються в Out of Band Data exfiltration, як показано в різних прикладах та постах.
Збережена процедура 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 (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
віддають перевагу за її стислість.
Ось як отримати схему, таблиці та стовпці з поточної бази даних:
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:
Little tricks for WAF bypasses
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--
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:
References
Last updated