diff --git a/src/SUMMARY.md b/src/SUMMARY.md index ef5322f3e..d902fdb93 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -435,6 +435,7 @@ - [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md) - [Python](network-services-pentesting/pentesting-web/python.md) - [Rocket Chat](network-services-pentesting/pentesting-web/rocket-chat.md) + - [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md) - [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]() - [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md) - [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md) diff --git a/src/network-services-pentesting/pentesting-web/ruby-tricks.md b/src/network-services-pentesting/pentesting-web/ruby-tricks.md new file mode 100644 index 000000000..b3a7b3e29 --- /dev/null +++ b/src/network-services-pentesting/pentesting-web/ruby-tricks.md @@ -0,0 +1,9 @@ +# Ruby Tricks + +{{#include ../../banners/hacktricks-training.md}} + +## Dosya yükleme ile RCE + +[bu makalede](https://www.offsec.com/blog/cve-2024-46986/) açıklandığı gibi, `.rb` dosyasını `config/initializers/` gibi hassas dizinlere yüklemek, Ruby on Rails uygulamalarında uzaktan kod yürütmeye (RCE) yol açabilir. + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/clickjacking.md b/src/pentesting-web/clickjacking.md index b928bdf92..7b24d5ba4 100644 --- a/src/pentesting-web/clickjacking.md +++ b/src/pentesting-web/clickjacking.md @@ -8,11 +8,11 @@ Bir clickjacking saldırısında, bir **kullanıcı**, bir web sayfasında ya ** ### Formları Önceden Doldurma Hilesi -Bazen bir sayfa yüklenirken **GET parametrelerini kullanarak bir formun alanlarının değerini doldurmak** mümkündür. Bir saldırgan, bu davranışı kötüye kullanarak bir formu rastgele verilerle doldurabilir ve kullanıcının Gönder butonuna basması için clickjacking yükünü gönderebilir. +Bazen bir sayfa yüklendiğinde **GET parametrelerini kullanarak bir formun alanlarının değerini doldurmak** mümkündür. Bir saldırgan, bu davranışı kötüye kullanarak bir formu rastgele verilerle doldurabilir ve kullanıcının Gönder butonuna basması için clickjacking yükünü gönderebilir. ### Sürükle ve Bırak ile Form Doldurma -Kullanıcının bir **formu doldurmasını** istiyorsanız ancak ona bazı özel bilgileri (bilgisi olan e-posta veya şifre gibi) doğrudan yazmasını istemiyorsanız, ona sadece **Sürükle ve Bırak** yapmasını isteyebilirsiniz; bu, kontrol ettiğiniz verileri yazacaktır, tıpkı [**bu örnekteki**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/) gibi. +Kullanıcının bir **formu doldurmasını** istiyorsanız ancak ona bazı özel bilgileri (örneğin, bildiğiniz e-posta ve/veya özel şifre) yazmasını doğrudan istemek istemiyorsanız, ona sadece **Sürükle ve Bırak** yapmasını isteyebilirsiniz; bu, kontrol ettiğiniz verileri yazacaktır, tıpkı [**bu örnekteki**](https://lutfumertceylan.com.tr/posts/clickjacking-acc-takeover-drag-drop/) gibi. ### Temel Yük ```css @@ -89,21 +89,21 @@ background: #F00; ``` ### XSS + Clickjacking -Eğer bir **XSS saldırısını tetiklemek için kullanıcının bir öğeye tıklamasını gerektiren** bir durum tespit ettiyseniz ve sayfa **clickjacking'e karşı savunmasızsa**, bunu kullanarak kullanıcıyı butona/bağlantıya tıklamaya kandırabilirsiniz.\ +Eğer bir **kullanıcının tıklamasını gerektiren bir XSS saldırısı** tespit ettiyseniz ve sayfa **clickjacking'e karşı savunmasızsa**, bunu kullanarak kullanıcıyı butona/bağlantıya tıklamaya kandırabilirsiniz.\ Örnek:\ -Hesabın bazı özel detaylarında bir **self XSS** buldunuz (bu detayları **sadece sizin ayarlayıp okuyabileceğiniz**). Bu detayları ayarlamak için kullanılan **form** **Clickjacking'e karşı savunmasız** ve **formu** GET parametreleri ile **önceden doldurabilirsiniz**.\ -Bir saldırgan, bu sayfaya yönelik bir **Clickjacking** saldırısı hazırlayarak **formu** **XSS yükü** ile **önceden doldurup** **kullanıcıyı** formu **Gönder** butonuna tıklamaya kandırabilir. Böylece, **form gönderildiğinde** ve değerler değiştirildiğinde, **kullanıcı XSS'i çalıştıracaktır**. +Hesabın bazı özel detaylarında bir **self XSS** buldunuz (bu detayları **sadece sizin ayarlayıp okuyabileceğiniz**). Bu detayları ayarlamak için kullanılan **form** içeren sayfa **Clickjacking'e karşı savunmasız** ve **formu** GET parametreleri ile **önceden doldurabilirsiniz**.\ +Bir saldırgan, bu sayfaya **XSS yükü** ile **formu** **önceden doldurarak** bir **Clickjacking** saldırısı hazırlayabilir ve **kullanıcıyı** formu **göndermeye** **kandırabilir**. Böylece, **form gönderildiğinde** ve değerler değiştirildiğinde, **kullanıcı XSS'i çalıştıracaktır**. ### DoubleClickjacking -İlk olarak [bu yazıda açıklandığı gibi](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html), bu teknik, kurbanın belirli bir konumda yerleştirilmiş özel bir sayfadaki bir butona çift tıklamasını isteyecek ve mousedown ile onclick olayları arasındaki zaman farklarını kullanarak çift tıklama sırasında kurban sayfasını yükleyecek, böylece **kurban aslında kurban sayfasındaki geçerli bir butona tıklamış olacak**. +Öncelikle [bu yazıda açıklandığı gibi](https://securityaffairs.com/172572/hacking/doubleclickjacking-clickjacking-on-major-websites.html), bu teknik, kurbanın belirli bir konumda yerleştirilmiş özel bir sayfadaki bir butona çift tıklamasını isteyecek ve mousedown ile onclick olayları arasındaki zaman farklarını kullanarak kurban sayfasını çift tıklama sırasında yükleyecek, böylece **kurban aslında kurban sayfasındaki geçerli bir butona tıklamış olacak**. Bir örnek bu videoda görülebilir: [https://www.youtube.com/watch?v=4rGvRRMrD18](https://www.youtube.com/watch?v=4rGvRRMrD18) Bir kod örneği [bu sayfada](https://www.paulosyibelo.com/2024/12/doubleclickjacking-what.html) bulunabilir. > [!WARNING] -> Bu teknik, kullanıcının kurban sayfasında 1 yere tıklamasını sağlamak için clickjacking'e karşı her türlü korumayı aşar. Bu nedenle saldırganın **sadece 1 tıklama ile yapılabilecek hassas eylemleri bulması gerekir, örneğin OAuth izinlerini kabul eden istemler**. +> Bu teknik, kullanıcının kurban sayfasında 1 yere tıklamasını sağlarken clickjacking'e karşı her türlü korumayı aşar. Bu nedenle saldırganın **sadece 1 tıklama ile yapılabilecek hassas eylemleri bulması gerekir, örneğin OAuth izinlerini kabul eden istemler**. ## Clickjacking'i Azaltma Stratejileri @@ -119,14 +119,14 @@ Bir kod örneği [bu sayfada](https://www.paulosyibelo.com/2024/12/doubleclickja Ancak, bu çerçeve kırıcı betikler aşılabilir: - **Tarayıcıların Güvenlik Ayarları:** Bazı tarayıcılar, güvenlik ayarlarına veya JavaScript desteğinin eksikliğine bağlı olarak bu betikleri engelleyebilir. -- **HTML5 iframe `sandbox` Özelliği:** Bir saldırgan, `allow-top-navigation` olmadan `allow-forms` veya `allow-scripts` değerleri ile `sandbox` özelliğini ayarlayarak çerçeve kırıcı betikleri etkisiz hale getirebilir. Bu, iframe'in üst pencere olup olmadığını doğrulamasını engeller, örneğin, +- **HTML5 iframe `sandbox` Özelliği:** Bir saldırgan, `allow-top-navigation` olmadan `allow-forms` veya `allow-scripts` değerleri ile `sandbox` özelliğini ayarlayarak çerçeve kırıcı betikleri etkisiz hale getirebilir. Bu, iframe'in en üst pencere olup olmadığını doğrulamasını engeller, örneğin, ```html ``` -`allow-forms` ve `allow-scripts` değerleri, üst düzey navigasyonu devre dışı bırakırken iframe içindeki eylemleri etkinleştirir. Hedeflenen sitenin istenen işlevselliğini sağlamak için, saldırı türüne bağlı olarak `allow-same-origin` ve `allow-modals` gibi ek izinler gerekli olabilir. Tarayıcı konsol mesajları, hangi izinlerin verilmesi gerektiği konusunda rehberlik edebilir. +`allow-forms` ve `allow-scripts` değerleri, iframe içinde eylemleri etkinleştirirken üst düzey navigasyonu devre dışı bırakır. Hedeflenen sitenin beklenen işlevselliğini sağlamak için, saldırı türüne bağlı olarak `allow-same-origin` ve `allow-modals` gibi ek izinler gerekli olabilir. Tarayıcı konsol mesajları, hangi izinlerin verilmesi gerektiği konusunda rehberlik edebilir. ### Sunucu Tarafı Savunmaları @@ -141,7 +141,7 @@ sandbox="allow-forms allow-scripts"> #### İçerik Güvenlik Politikası (CSP) frame-ancestors yönergesi -**CSP'deki `frame-ancestors` yönergesi**, Clickjacking koruması için önerilen yöntemdir: +CSP'deki **`frame-ancestors` yönergesi**, Clickjacking koruması için önerilen yöntemdir: - `frame-ancestors 'none'` - `X-Frame-Options: deny` ile benzer. - `frame-ancestors 'self'` - `X-Frame-Options: sameorigin` ile benzer. @@ -153,7 +153,7 @@ sandbox="allow-forms allow-scripts"> Daha fazla ayrıntı ve karmaşık örnekler için [frame-ancestors CSP belgelerine](https://w3c.github.io/webappsec-csp/document/#directive-frame-ancestors) ve [Mozilla'nın CSP frame-ancestors belgelerine](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors) bakabilirsiniz. -### İçerik Güvenlik Politikası (CSP) ile `child-src` ve `frame-src` +### İçerik Güvenlik Politikası (CSP) `child-src` ve `frame-src` ile **İçerik Güvenlik Politikası (CSP)**, tarayıcının hangi kaynakların içerik yüklemesine izin vereceğini belirleyerek Clickjacking ve diğer kod enjeksiyon saldırılarını önlemeye yardımcı olan bir güvenlik önlemidir. @@ -173,7 +173,7 @@ Bu politika, aynı kökten (self) ve https://trusted-website.com adresinden gele ``` Content-Security-Policy: child-src 'self' https://trusted-website.com; ``` -Bu politika, aynı kökenden (self) ve https://trusted-website.com adresinden gelen çerçevelere ve işçilere izin verir. +Bu politika, aynı kökten (self) ve https://trusted-website.com adresinden gelen çerçevelere ve işçilere izin verir. **Kullanım Notları:** @@ -189,9 +189,9 @@ if (top !== self) { top.location = self.location } ``` -#### Anti-CSRF Tokenlarının Kullanımı +#### Anti-CSRF Token'ların Kullanımı -- **Token Doğrulama:** Web uygulamalarında, durum değiştiren isteklerin kullanıcının kasıtlı olarak yapıldığından emin olmak için anti-CSRF tokenları kullanın ve Clickjacked bir sayfa aracılığıyla yapılmadığını kontrol edin. +- **Token Doğrulama:** Web uygulamalarında anti-CSRF token'ları kullanarak, durum değiştiren isteklerin kullanıcının kasıtlı olarak yapıldığından emin olun ve Clickjacked bir sayfa aracılığıyla yapılmadığını kontrol edin. ## Referanslar diff --git a/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md b/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md index 3d2789c9b..6c1aa53de 100644 --- a/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md +++ b/src/pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md @@ -1,12 +1,12 @@ -# Iframes in XSS, CSP and SOP +# XSS, CSP ve SOP'da Iframe'ler {{#include ../../banners/hacktricks-training.md}} -## Iframes in XSS +## XSS'de Iframe'ler -Bir iframed sayfanın içeriğini belirtmenin 3 yolu vardır: +Iframe'li bir sayfanın içeriğini belirtmenin 3 yolu vardır: -- Bir URL belirten `src` aracılığıyla (URL, çapraz köken veya aynı köken olabilir) +- Bir URL belirten `src` aracılığıyla (URL, farklı kökenli veya aynı kökenli olabilir) - `data:` protokolünü kullanarak içeriği belirten `src` aracılığıyla - İçeriği belirten `srcdoc` aracılığıyla @@ -45,15 +45,15 @@ var secret = "child secret" alert(parent.secret) ``` -Eğer önceki html'ye bir http sunucusu (örneğin `python3 -m http.server`) aracılığıyla erişirseniz, tüm scriptlerin çalıştırılacağını göreceksiniz (çünkü bunu engelleyen bir CSP yok). **Ana sayfa, herhangi bir iframe içindeki `secret` değişkenine erişemeyecek** ve **sadece if2 ve if3 iframe'leri (aynı site olarak kabul edilen) orijinal penceredeki secret'a erişebilir**.\ -if4'ün `null` kökenine sahip olduğu not edilmelidir. +Eğer önceki html'ye bir http sunucusu (örneğin `python3 -m http.server`) aracılığıyla erişirseniz, tüm scriptlerin çalıştırılacağını göreceksiniz (çünkü bunu engelleyen bir CSP yok). **Ana sayfa, herhangi bir iframe içindeki `secret` değişkenine erişemeyecek** ve **sadece if2 ve if3 iframe'leri (aynı site olarak kabul edilenler) orijinal penceredeki secret'a erişebilir**.\ +if4'ün `null` kökenine sahip olduğu dikkate alın. ### CSP ile Iframe'ler -> [!NOTE] -> Lütfen, aşağıdaki bypass'lerde iframe'li sayfaya verilen yanıtın JS yürütümünü engelleyen herhangi bir CSP başlığı içermediğini not edin. +> [!TIP] +> Lütfen, aşağıdaki bypass'larda iframed sayfaya verilen yanıtın JS yürütümünü engelleyen herhangi bir CSP başlığı içermediğine dikkat edin. -`script-src`'nin `self` değeri, `data:` protokolü veya `srcdoc` niteliğini kullanarak JS kodunun yürütülmesine izin vermeyecektir.\ +`script-src`'nin `self` değeri, `data:` protokolü veya `srcdoc` niteliği kullanarak JS kodunun yürütülmesine izin vermeyecektir.\ Ancak, CSP'nin `none` değeri bile, `src` niteliğinde bir URL (tam veya sadece yol) koyan iframe'lerin yürütülmesine izin verecektir.\ Bu nedenle, bir sayfanın CSP'sini aşmak mümkündür: ```html @@ -77,7 +77,7 @@ src="data:text/html;charset=utf-8,%3Cscript%3Evar%20secret='if4%20secret!';alert ``` Not edin ki **önceki CSP yalnızca inline script'in çalışmasına izin veriyor**.\ -Ancak, **yalnızca `if1` ve `if2` script'leri çalıştırılacak, ancak yalnızca `if1` ana gizli veriye erişebilecek**. +Ancak, **yalnızca `if1` ve `if2` script'leri çalıştırılacak, fakat yalnızca `if1` ana gizli veriye erişebilecek**. ![](<../../images/image (372).png>) @@ -103,7 +103,7 @@ return "" if __name__ == "__main__": app.run() ``` -### Diğer Yükler doğal ortamda bulundu +### Diğer Yükler doğada bulundu ```html ``` +### Credentialless iframes + +[Bu makalede](https://blog.slonser.info/posts/make-self-xss-great-again/) açıklandığı gibi, bir iframe'deki `credentialless` bayrağı, yüklenen sayfanın aynı köken politikasını (SOP) korurken, bir iframe içinde bir sayfayı kimlik bilgileri göndermeden yüklemek için kullanılır. + +Bu, iframe'in, ana sayfada yüklenen aynı SOP'deki başka bir iframe'den hassas bilgilere erişmesine olanak tanır: +```javascript +window.top[1].document.body.innerHTML = 'Hi from credentialless'; +alert(window.top[1].document.cookie); +``` +- Exploit örneği: Self-XSS + CSRF + +Bu saldırıda, saldırgan 2 iframe içeren kötü niyetli bir web sayfası hazırlar: + +- `credentialless` bayrağı ile kurbanın sayfasını yükleyen bir iframe ve bir XSS tetikleyen bir CSRF (Kullanıcının kullanıcı adında bir Self-XSS hayal edin): +```html + + +
+ + + +
+ + + +``` + +- Gerçekten kullanıcının giriş yaptığı ( `credentialless` bayrağı olmadan) başka bir iframe. + +Sonra, XSS'den diğer iframe'e erişmek mümkündür çünkü aynı SOP'ye sahiptirler ve örneğin çerezi çalmak için şu komutu çalıştırabilirsiniz: +```javascript +alert(window.top[1].document.cookie); +``` +### fetchLater Saldırısı + +[Bu makalede](https://blog.slonser.info/posts/make-self-xss-great-again/) belirtildiği gibi, `fetchLater` API'si bir isteğin daha sonra (belirli bir süre sonra) yürütülmesi için yapılandırılmasına olanak tanır. Bu nedenle, bu, örneğin, bir kurbanı bir saldırganın oturumu içinde (Self-XSS ile) oturum açmak, mevcut kullanıcının şifresini değiştirmek için bir `fetchLater` isteği ayarlamak ve saldırganın oturumundan çıkmak için kötüye kullanılabilir. Ardından, kurban kendi oturumuna giriş yapar ve `fetchLater` isteği yürütülerek, kurbanın şifresi saldırgan tarafından ayarlanan şifreye değiştirilir. + +Bu şekilde, kurbanın URL'si bir iframe içinde yüklenemese bile (CSP veya diğer kısıtlamalar nedeniyle), saldırgan yine de kurbanın oturumunda bir isteği yürütme yeteneğine sahip olabilir. +```javascript +var req = new Request("/change_rights",{method:"POST",body:JSON.stringify({username:"victim", rights: "admin"}),credentials:"include"}) +const minute = 60000 +let arr = [minute, minute * 60, minute * 60 * 24, ...] +for (let timeout of arr) +fetchLater(req,{activateAfter: timeout}) +``` ## SOP'de Iframe'ler Aşağıdaki sayfaları kontrol edin: