File Upload Vulnerabilities (Dosya Yükleme) | Güvenlik Açıkları | Yöntemler

Gauloran

Moderasyon Tim Lideri
7 Tem 2013
8,364
932
Blackwell Academy
Not: Siber güvenlik ile ilgili konularda bazı kavramları Türkçeleştirmek her zaman okur açısından faydalı olmayabilir. Bu kavramları mümkün olduğunca mavi renklendirdim konu sonundan bu kavramları ve açıklamalarını okuyabilirsiniz.

Bu konuda, basit dosya yükleme işlemlerinin yüksek seviyeli saldırılar için güçlü bir etken olarak nasıl kullanılabileceğini öğreneceksiniz.
Web shell yüklemek için yaygın savunma mekanizmalarını bypasslayıp zafiyetlere sahip web serverını ele geçireceksiniz. Dosya yükleme işlemlerinin ne kadar yaygın olduğu göze alındığında bunları doğru bir şekilde test etmeyi bilmek şarttır.

S8Y2GQ.jpg

File Upload (Dosya Yükleme) Zafiyetleri Nelerdir?

File Upload zafiyetleri bir web serverının kullanıcıların isim, tür, içerik veya boyut gibi şeyleri yeterince doğrulamadan dosyaları sisteme yüklemelerine izin verdiği durumlarda gerçekleşir. Bu gibi durumlarda yeterince kısıtlama getirilmezse basit bir resim yükleme işlemi bile potansiyel olarak büyük bir tehlikeye yol açabilir. Hatta bu durum sunucu taraflı script dosyalarından dolayı uzaktan kod yürütmeye neden olabilir. Bazı durumlarda, dosya yüklemenin kendisi zaten başlı başına hasara yol açabilir. Diğer saldırılar genellikle dosyanın sunucu tarafından yürütülmesini tetiklemek için bir http request (http isteği) içerebilir.

File Upload Zafiyetlerinin Etkisi Nedir?

File upload zafiyetlerinin etkisi genellikle 2 faktöre bağlıdır:
  1. Web sitesinin doğru bir şekilde doğrulayamadığı boyut, tür, içerik vb. durumu
  2. Dosya başarılı bir şekilde upload edildikten sonra ne tür kısıtlamalar getirildiği
En kötü senaryoda, dosyanın türü doğru bir şekilde doğrulanmaz ve sunucu yapılandırması .php .sjp gibi belirli dosya türlerinin kod olarak yürütülmesine izin verir. Bu durumda, saldıran kişi potansiyel olarak sunucu taraflı çalışan bir web shell upload eder ve böylece serverı ele geçirmiş olur. Eğer dosya adı doğru bir şekilde doğrulanmazsa bu saldırganın aynı ada sahip bir dosya yükleyerek kritik dosyaların üzerine yazması ihtimalini oluşturur. Eğer server (directory traversal attack) dizin geçişine karşı da savunmasızsa, saldırgan beklenmedik yerlere dosya yüklemesi yapabilir. Sistem dosya boyutunun beklenen limitler içinde olduğundan emin olamazsa bu durum saldırganın DoS (denial of service) saldırısı gerçekleştirmesine ve mevcut disk alanını doldurmasına neden olabilir.

File Upload Açıkları Nasıl Ortaya Çıkar?

Genel olarak web sitelerinde kullanıcıların hangi dosyaları upload edebileceğine dair bir kısıtlamanın olmaması çok nadirdir. Geliştiriciler sağlam olduğuna inandıkları doğrulama tekniklerini uygularlar ancak bunlar kolayca bypass edilebilir. Örneğin tehlikeli dosya türlerini kara listeye almayı deneyebilirler ama dosya uzantılarını kontrol ederken ayrıştırma tutarsızlıklarını hesaba katmamış olabilirler. Ayrıca tehlikeli olabilecek belirsiz dosya türlerini kara listeye eklememiş olabilirler.

Web sitesi özellikleri doğrulayarak dosya türünü kontrol etmeye çalışabilir fakat bu saldırgan tarafından
Burp Proxy veya Repeater gibi araçların kullanımıyla kolayca manipüle edilebilir. Sonuçta sağlam doğrulama önlemleri bile web siteyi oluşturan dizinler ve hostlar(ana bilgisayar) boyunca exploit edilebilecek yani sömürülebilecek tutarsızlıklara yol açabilir. Konunun devamında bu zafiyetlerden bazılarını kullanarak uzaktan kod yürütmek için web shell yükleyeceğiz bunu nasıl yapacağınızı göreceksiniz hatta gerçekçi hedeflere karşı pratik yapabileceğiniz bazı laboratuvarlar(labs) bile oluşturduk.

S8bMX3.jpg


Web Sunucuları Statik Dosya İsteklerini Nasıl Yönetiyor?

File Upload zafiyetlerine geçmeden önce bu soruya cevap verebilmeniz işleyişi anlama açısından oldukça önemli. Geçmişten bu yana web siteleri neredeyse tamamen istendiğinde kullanıcılara sunulan statik dosyalardan oluşurdu. Sonuç olarak, her isteğin yolu sunucunun dosya sistemindeki dizinlerin ve dosyaların hiyerarşisiyle birebir eşleştirilebilirdi. Günümüzde web siteleri giderek daha dinamik hale geliyor ve bir isteğin yolu genelde dosya sistemi ile direkt olarak ilişkiye sahip olmuyor. Bununla birlikte, web serverları görüntüler, stil sayfaları gibi statik dosyalar için hala istekleri işleyebilmekte.

Bu statik dosyaların işlenmesi süreci hala büyük ölçüde aynı. Bir noktada sunucu istekte bulunan dosya uzantısını belirlemek için istekteki yolu ayrıştırır. Daha sonra -genellikle uzantıları ve MIME türleri arasında önceden yapılandırılmış eşlemelerin bir listesini karşılaştırarak- bunu istekte bulunulan dosyanın türünü belirlemek için kullanır. Daha sonra ne olacağı ise dosya türüne ve server konfigürasyonuna bağlı olarak değişir.

S8bSrq.png


  • Eğer bu dosya türü çalıştırılabilir değilse (mesela bir görüntü veya statik bir html sayfasıysa) server dosyanın içeriğini HTTP yanıtıyla birlikte istemciye gönderebilir.
  • Eğer dosya türü çalıştırılabilir ise, mesela bir PHP dosyasıysa ve server bu tür dosyaları çalıştırmak için yapılandırılmışsa önce HTTP isteğindeki başlık (header) ve parametrelere bakarak değişkenler atayacak daha sonra da scripti çalıştıracaktır. Elde edilen sonuç daha sonra bir HTTP yanıtıyla birlikte istemciye gönderilebilir.
  • Eğer dosya türü çalıştırılabilir ise ancak server buna uygun yapılandırılmamışsa genellikle bir hata ile yanıt verir ancak bazı durumlarda dosyanın içeriği hala düz metin olarak istemciye sunulabilir. Bu tabii ki bir yanlış yapılandırılmadır ve kaynak kodu gibi diğer hassas bilgilerin sızdırılmasına sebep olabilir. Bunun örneğini göreceğiz.
Content-Type Yanıt Headerı/başlık) serverın ne tür bir dosya sunduğunu düşündüğü ile ilgili ipuçları verebilir. Bu header uygulama kodu tarafından açıkça ayarlanmadıysa genellikle dosya uzantısı MIME türü (ortam türü) eşlemesinin sonucunu içerir.

Artık temel konsepti anladığınıza göre bu tür zafiyetlerden potansiyel olarak nasıl faydalanabileceğinize geçelim.


Sınırlandırılmamış File Uploadlarını Kullanabiliriz

Güvenlik açısından en kötü senaryo bir sitenin php java veya python gibi sunucu taraflı scriptleri siteye yüklemenize izin vermesi ve bunları kod olarak çalıştırabilmesidir. Web shell zararlı bir scripttir ve hackerlar web shell sayesinde HTTP istekleri göndererek serverda komutlar çalıştırabilir. Eğer bir web shelli başarılı bir şekilde upload edebilirseniz sunucuda full kontrole sahip olursunuz. Yani bu da serverdaki herhangi bir dosyayı veya hassas verileri okuyup bu verilerin üzerine yazabileceğiniz anlamına gelir. Hatta serverı ağ dışındaki diğer sunuculara veya iç altyapıya yönelik saldırılarda kullanabilir hale gelirsiniz. Örnek olarak aşağıda tek satırlık PHP kodunu ile serverdaki dosya sisteminden herhangi bir dosyayı okumak için kullanabilirsiniz:

PHP:
<?php echo file_get_contents('/path/to/target/file'); ?>

Uploadtan sonra hedef dosyanın içeriğini almak için istek göndermemiz yeterli

Daha esnek hali için şöyle yapabiliriz

PHP:
<?php echo system($_GET['command']); ?>

bu script herhangi bir sistem komutunu ufak bir sorgu parametresi aracılığıyla çalıştırmamızı sağlıyor

PHP:
GET /ornek/saldirimiz.php?command=id HTTP/1.1

Hatalı File Uploadlardan Yararlanmak

Valla açıkçası File Upload saldırılarına yönelik önlem almamış bir site bulmak pek mümkün değil. Ama önlemlerin olması başka, bu önlemlerin sağlam önlemler olması başka :) Bu kısımda serverların file uploadlarını doğrulamak ve süzgeçten geçirmek için kullandığı bazı yöntemlere ve aynı zamanda bu mekanizmalardan uzaktan kod yürütmek için nasıl faydalanacağınıza bakacağız.

S8bmBc.png


Hatalı Dosya Türü Doğrulaması

HTML formları gönderildiğinde tarayıcı genellikle sağlanan verileri application/x-www-form-url-encoded içerik türüyle POST isteği olarak gönderir. Bu durumun bir sıkıntısı yok basit textler için mesela isimler, adresler vs. Ama büyük miktarda ikili veri içeren örneğin resim veya pdf dosyaları için bu doğru bir yöntem değil. O tarz bir durumda tercih edilen içerik türü multipart/form-data olur. Resim yüklemek için alanlar içeren, kullanıcı adınızı girdiğiniz ve resimle ilgili de bir açıklama kısmına sahip olan bir form düşünün. Böyle bir formun gönderilmesi aşağıdaki gibi bir isteğe yol açabilir:

HTTP:
POST /images HTTP/1.1
Host: normal-website.com
Content-Length: 12345
Content-Type: multipart/form-data; boundary=---------------------------012345678901234567890123456

---------------------------012345678901234567890123456
Content-Disposition: form-data; name="image"; filename="example.jpg"
Content-Type: image/jpeg

[...binary content of example.jpg...]

---------------------------012345678901234567890123456
Content-Disposition: form-data; name="description"

This is an interesting description of my image.

---------------------------012345678901234567890123456
Content-Disposition: form-data; name="username"

wiener
---------------------------012345678901234567890123456--

Gördüğünüz gibi body kısmı yani ana metin kısmı formdaki her
input için ayrı parçalara ayrılmış. Her parça ilgili input alanı ile ilgili bilgi veriyor ve Content-Disposition headerını içeriyor. Bu ayrı parçalar servera bu girişi kullanarak gönderilen verilerin MIME türünü bildiren kendi Content-Type headerlarını da içerebilirler.

Sitelerin file uploadlarını doğrulamak için deneyebileceği bir yol da bu inputlara özgü Content-Type headerlarının beklenen MIME türüyle eşleşip eşleşmediğini kontrol etmektir. Eğer server sadece resim dosyaları bekliyorsa misal sadece image/jpeg ve image/png gibi türleri kabul edebilir. İşte eğer bu başlık server tarafından dolaylı yoldan güvenli kabul edilirse sorunlar çıkabilir. Eğer dosyanın içeriğinin varsayılan MIME türüyle eşleşip eşleşmediğini kontrol etmek için başka bir doğrulama yapılmazsa bunu Burp Repeater gibi
toollarla kolayca bypasslayabiliriz.

Kullanıcı Tarafından Erişilebilen Dizinlerde Dosya Yürütmeyi Önleme

İki aşamalı olarak düşünürsek ilk olarak tehlikeli dosya türlerinin upload edilmesini engellemek daha önemli. İkincisi ise serverın yukarıda da bahsettiğimiz gibi scriptleri çalıştırmasını durdurmaktır. Önlem olarak serverlar sadece MIME türüne yapılandırılmış olan scriptleri çalıştırır. Aksi takdirde genellikle bir hata mesajı döndürürler veya bazı durumlarda dosyanın içeriğini düz metin (
plain text) olarak sunarlar.

sunucular genellikle yalnızca MIME türü yürütmek üzere açıkça yapılandırıldıkları komut dosyalarını çalıştırır

HTTP:
GET /static/exploit.php?command=id HTTP/1.1
Host: normal-website.com


HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 39

<?php echo system($_GET['command']); ?>

Bu durum kaynak kodun sızdırılmasını sağlayabilir potansiyel olarak ilginçtir ama web shell işi yaş olur bu şekilde. Bu tür yapılandırmalar genellikle dizinden dizine farklılık gösterir. Kullanıcı tarafından sağlanan dosyaların yüklendiği bir dizin son kullanıcıların erişemeyeceği olarak kabul edilen dosya sistemine ait diğer lokasyonlardan çok daha katı kontrollere sahip olabilir. Eğer kullanıcı tarafından sağlanan dosyaların bulunmaması gereken farklı bir dizine bir script yüklemek için bir yol bulabilirseniz sunucu scriptinizi çalıştırabilir.

Web serverları dosyanın kaydedileceği adı veya lokasyonu belirlemek için genellikle multipart/form-data isteklerindeki filename alanını yani dosya adı alanını kullanır.

Ayrıca tüm isteklerinizi aynı domaine gönderebilmenize rağmen bu durum genellikle
reverse proxy serveraya da load balancera işaret eder. İstekleriniz genellikle arka planda farklı bir şekilde yapılandırılmış ek serverlar tarafından halledilecektir.

Kara Listeye Tehlikeli Dosya Türlerinin Yetersiz Olarak Eklenmesi

Kullanıcıların siteye zararlı bir script yüklemesini engellemenin en açık yolu potansiyel olarak zararlı olabilecek dosya türlerini engellemektir mesela .php. Zaten bu kara listelemede tıpkı teknolojik ürünlerde olabilen kronik sorun dediğimiz şey gibi zararlı olabilecek bütün dosya uzantılarını ekleyememek diye bir durum vardır. Kara listeler bazen daha az bilinen ancak yürütülebilir olabilen .php5, .shtml gibi dosya uzantıları kullanılarak bypass edilebilir.

S8bNzj.jpg


Sunucu Konfigürasyonunu Override Etme

Yukarıda bahsettiğimiz gibi serverlar genelde yapılandırılmadıkça dosyaları çalıştırmaz. Mesela bir Apache serverının istemci tarafından istenen PHP dosyalarını çalıştırabilmesi için geliştiricilerin /etc/apache2/apache2.conf dosyasına aşağıdaki ayarı çekmesi gerekir:

Apache yapılandırması:
LoadModule php_module /usr/lib/apache2/modules/libphp.so
AddType application/x-httpd-php .php

Bİrçok serverda geliştiricilerin global ayarların üzerine yazmak için veya ekleme yapmak için dizinlerde özel yapılandırma dosyaları oluşturmalarına izin verir. Örneğin
Apache serverları .htaccess adlı bir dosyadan dizine özel yapılandırmayı yükler. Benzer şekilde geliştiriciler IIS serverlarda bunu web.config dosyası ile yaparlar. Mesela kullanıcılara .JSON dosyalarının gösterilmesine izin vermeleri bu yapılandırmalarla olur.

Kod:
<staticContent>
    <mimeMap fileExtension=".json" mimeType="application/json" />
</staticContent>

Web serverları bu tür yapılandırma dosyalarını kullanır ama genellikle HTTP istekleriyle bunlara erişmenize izin verilmez. Bununla birlikte bazı serverlar kendi kötü amaçlı olarak kullanacağınız yapılandırma dosyanızı yüklemenizi engellemez :D Bu durumda ihtiyaç duyduğunuz dosya kara listeye alınsa bile serverı herhangi bir dosya uzantısını yürütülebilir bir MIME türüyle eşleştirmesi için kandırabilirsiniz.


Dosya Uzantılarını Gizleme

En kapsamlı kara listeler bile klasik obfuscation teknikleri kullanılarak potansiyel olarak bypass edilebilir. Diyelim ki doğrulama kodu büyük küçük harfe duyarlı ve exploit.pHp nin aslında .php dosyası olduğunu anlayamıyor. Eğer sonrasında gelen dosya uzantısını MIME türüne eşleyen kod büyük küçük harfe duyarlı değilse bu PHP dosyalarınızı doğrulamadan geçirmenizi ve server tarafından yürütebilmenizi sağlar.

S8bXdn.jpg


Benzer sonuçları elde etmek için aşağıdaki teknikler de kullanılabilir:


  • Birden fazla uzantı sağlama. Dosya adını ayrıştırmak için kullanılan algoritmaya göre exploit.php.jpg dosyası hem bir php dosyası hem de jpg resmi zannedilebilir.
  • Ek karakterler ekleyin. örneğin exploit.php. gibi bazen bu noktalar ve boşluklar işinize yarayabilir
  • exploit%2Ephp gibi . / \ yani nokta, slash, backslash gibi işaretler için URL encoding deneyin. Dosya uzantısı doğrulaması sırasında çözümlenmezse ve daha sonra sunucu tarafında çözümlenirse bu da zararlı dosyalarımızı upload etmemizi sağlayabilir.
  • Dosya uzantısından önce noktalı virgüller veya URL kodlu null byte karakterleri ekleyin. Eğer doğrulama PHP veya Java gibi yüksek düzeyli bir dilde yazılmış da olsa server dosyayı C/C++ gibi düşük seviyeli dillerin fonksiyonlarıyla işlediğinde dosya adının sonunda tutarsızlıklara neden olabilir. Örnek: exploit.asp;.jpg veya exploit.asp%00.jpg
  • Multibyte unicode karakterleri kullanmayı deneyin. Bunlar unicode dönüştürülmesi sırasında null bytelara ve noktalara dönüştürülebilir. Örneğin xC0 x2E, xC4 xAE veya xC0 xAE -----> (dosya adı utf-8 olarak ayrıştırıldıktan sonra) x2E'ye dönüştürülebilir ancak daha sonra path için kullanılmadan önce ASCII karakterlerine dönüştürülebilir.
Diğer önlem alma çeşitleri, dosyanın yürütülmesini engellemek için tehlikeli uzantıları kaldırmak veya değiştirmekle ilgili. Bunlar düzgün ayarlanıp tekrarlı olarak yapılmazsa öyle bir ayar çekersiniz ki en sonunda kayda değer bir dosya uzantısı bırakabilirsiniz. Örneğin aşağıdaki dosya adından .php'yi kaldırırsanız ne olacağını düşünelim:

Kod:
exploit.p.phphp

Dosya İçeriğinin Hatalı Doğrulanması

Daha güvenli serverlar bir istekte belirtilen Content-Type'a güvenmek yerine dosyanın içeriğinin beklenen şeyle gerçekten eşleştiğini doğrulamaya çalışır. Örneğin bir resim upload işleminde, server resmin belirli özgün özelliklerini boyutunu vs. doğrulamaya çalışabilir. Eğer PHP scripti upload etmeyi denerseniz server direkt bunun resim olmadığını çakacaktır ve reddedecektir. Benzer mantıkla bazı belirli dosya türleri headerlarında veya footerlarında belirli bir bayt dizisini içerebilir ve bunlar eşleşiyor mu diye kontrol edilebilir örneğin JPEG dosyaları her zaman FF D8 FF ile başlar. Bu dosya türünün doğrulanması için çok daha sağlam bir yöntem ancak bu bile tamamen güvenilir değil. ExifTool gibi çeşitli özel toollar kullanılarak metadatasında zararlı kodlar içeren polyglot bir jpeg dosyası oluşturulabilir.

Belirli sıradaki görevi yerine getirmek için tasarlanan sistemlerin aynı anda 2 veya daha fazla işlemi aynı anda gerçekleştirmeyi çalışırken sistemin zorlanmasından “
Race Condition” açığı meydana gelir. Aslında bir tür güvenlik önleminin atlatmayla geçekleşir.

File Upload & Race Condition

Modern frameworkler bu tür saldırılara karşı daha dayanıklıdır. Genellikle dosyaları direkt dosya sistemindeki hedef konumlara yüklemek yerine ilk olarak geçici yükleme yaparlar (sandbox) ve mevcut dosyanın üzerine yazmamak için dosya adlarını da random ayarlarlar. Daha sonra bu geçici dosyada doğrulama yaparlar ve güvenli olduğuna karar verdikten sonra hedef dosyaya aktarırlar. Bazen geliştiriciler herhangi bir frameworkten bağımsız olarak kendi dosya yükleme processlerini uygularlar. Bunu iyi yapmak zordur ve karmaşık bir işlemdir ayrıca en güçlü doğrulamaların bile bypass edilmesini sağlayabilecek race condition açıklarına neden olabilir.

Örneğin bazı siteler dosyayı direkt olarak ana dosya sistemine yükler daha sonra dosya doğrulamayı geçmezse dosyayı kaldırır. Bu tarz bir yaklaşım genellikle virüsleri kontrol etmek için anti-virüs yazılımlarına dayanan sitelerde olur. Bu işlem sadece birkaç milisaniye sürebilir fakat dosyanın bu kadar kısa sürede bile sistemde kalması potansiyel bir tehlike oluşturur çünkü çalıştırılabilir. Bu güvenlik açıkları son derece ince detaylara sahiptir bu nedenle eğer kaynak kod yoksa
Black Box testlerinde tespit edilmeleri oldukça zordur.

URL Tabanlı Dosya Uploadları & Race Condition

URL sağlayarak dosya uploadları yapılıyorsa yine Race Condition ortaya çıkabilir. Bu durumda serverın dosyayı internet üzerinden alması ve doğrulama yapmadan önce lokalde bir kopyasını oluşturması gerekir. Dosya HTTP kullanılarak yüklenirken geliştiriciler dosyayı güvenli bir şekilde doğrulamak için frameworklerinin yerleşik mekanizmalarını kullanamazlar. Bunun yerine geçici olarak dosyayı depolamak ve doğrulamak için kendi processlerini manuel olarak oluşturabilirler fakat bu da o kadar güvenli olmayabilir. Örneğin dosya geçici dizine random bir isimle yüklenirse teorik olarak hackerımızın herhangi bir race conditiondan faydalanması imkansızdır, eğer dizinin adını bilmiyorlarsa dosyayı çalıştırmak için istek gönderemezler. Ama eğer bu random oluşturulmuş dizin ismi pseudo-random fonksiyonlarla oluşturulmuşsa (mesela PHP'nin uniqid() gibi) evet sizlerden duyar gibiyim Brute Force saldırılarına karşı açık olabilir diyorsunuz. Saldırıları kolaylaştırmak için dosyanın işlenme süresini uzatmak mantıklı olabilir. Bunu yapmanın yolu da daha büyük bir dosya yüklemek. Eğer dosya parçalara ayrılarak işleniyorsa başlangıçta payload ile birlikte zararlı dosya oluşturarak boyutun geriye kalan kısmını da rastgele baytlarla doldurarak potansiyel olarak faydalanmamız mümkün.

Uzaktan Kod Yürütme Olmadan File Upload Açıklarından Faydalanmak

Şu ana kadar bahsettiğim örneklerde uzaktan kod yürütmek için sunucu taraflı yani server side scriptler yüklemekten bahsettik. Tabii ki bu en ciddi sonuçlardan birisi ancak bu tür güvenlik açıklarından başka şekillerde de faydalanılabilir.

Zararlı Client-Side Scriptlerin Upload Edilmesi

Serverda scriptleri çalıştıramasanız bile client-side saldırılar için scriptleri upload edebilirsiniz. Örneğin eğer HTML dosyası veya SVG resmi upload edebiliyorsanız <script> etiketlerini kullanarak XSS payloadları oluşturabilirsiniz. Ve eğer yüklenen dosya daha sonra diğer kullanıcıların ziyaret ettiği bir sayfada görüntülendiğinde, eğer yüklediğiniz dosya aynı kaynaktan geliyorsa tarayıcıları sayfayı oluşturmaya çalışırken scripti çalıştıracaktır.

S8bwaD.webp


Upload Edilen Dosyaların Ayrıştırılmasındaki Güvenlik Açıklarından Faydalanmak

Yukarıda bahsedilen sıkıntılar yoksa dosya güvenli olarak depolanıyorsa ve gösterilebiliyorsa son çare olarak farklı dosya türlerinin ayrıştırılması veya işlenmesine yönelik spesifik güvenlik açıklarından faydalanmak kalıyor. Örneğin serverın Microsoft Office .doc veya .xls gibi XML tabanlı dosyaları ayrıştırdığını biliyorsanız bu potansiyel bir XXE injection tehdidi yaratır.

PUT kullanarak Dosya Upload Etme

Dikkat edilmesi gereken bir nokta da bazı serverların PUT isteklerini destekler yapıda olabileceğidir. Eğer bununla ilgili önlemler alınmamışsa bu durum sitede upload fonksiyonları olmasa bile zararlı dosyaların yüklenmesi için alternatif yöntem oluşturur.

S8bEXI.jpg


HTTP:
PUT /images/exploit.php HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-httpd-php
Content-Length: 49

<?php echo file_get_contents('/path/to/file'); ?>

Farklı noktalara OPTIONS isteklerini göndermeyi deneyebilirsiniz


File Upload Açıklarını Nasıl Kapatabiliriz

Kullanıcılara Upload izni vermek yaygın olan bir şey ve doğru önlemler alındığında tehlikeli değildir. Şimdi sırasıyla alabileceğiniz önlemlere bakalım:
  • Dosya uzantılarını kontrol ederken belirli dosya uzantılarını engelleyen bir blacklist yerine whitelist kullanmayı deneyin.
  • Dosya adının dizine yorumlanabilecek şekilde substring içermediğinden emin olun.
  • Var olan dosyaların override edilmesini önlemek için yüklenen dosyaların adlarını değiştirin.
  • Dosyaları tamamen doğrulamadan serverın kalıcı dosya sistemine yüklemeyin ve kendi doğrulama processlerinizi yazmak yerine frameworkleri kullanın.

*script: Script yani komut dosyası, belirli bir programlama dilinde veya sözdiziminde yazılmış bir dizi talimat veya komuttur.
*http request: HTTP Request, client'ın server dan istekte bulunduğu mesaj tipidir.
*File Upload: Dosya yükleme, bilgisayar ağlarında uzaktaki sistemin bir kopyasını saklayabilmesi için bir sunucu veya başka bir istemci gibi bir uzak sisteme veri göndermektir.
*web shell: Web kabuğu, genellikle siber saldırılar amacıyla bir web sunucusuna uzaktan erişilmesini sağlayan kabuk benzeri bir arabirimdir. Bir web kabuğu, onunla etkileşime geçmek için bir web tarayıcısının kullanılması bakımından benzersizdir.
*php: internet için üretilmiş, sunucu taraflı, çok geniş kullanımlı, genel amaçlı, içerisine HTML gömülebilen betik ve programlama dilidir. İlk kez 1995 yılında Rasmus Lerdorf tarafından yaratılan PHP'nin geliştirilmesi bugün PHP topluluğu tarafından sürdürülmektedir
*sjp: bir dosya tipiyle ilgilidir ve Oracle Corporation geliştiricisinin Oracle IRM Desktop yazılımı kullanılarak görüntülenebilir. Sonuç olarak bu format bir adet bilinen yazılım uygulamasıyla ilgilidir. Bunlar genellikle Sealed JPG File dosya formatında bulunurlar.
*exploit: bir bilgisayar programı veya betiktir, bilgisayar programlarında bulunan zayıflık veya hatalar için kullanılır.
*cyber security labs: eğitim, test, tatbikat ve siber güvenlik analizi gibi faaliyetleri gerçekleştirmek için bulut üzerinde oluşturulmuş sanal ortamlar
*server-side script: Sunucu tarafı komut dosyası oluşturma, web geliştirmede kullanılan ve her kullanıcının web sitesine isteği için özelleştirilmiş bir yanıt üreten bir web sunucusunda komut dosyalarının kullanılmasını içeren bir tekniktir. Alternatif, web sunucusunun kendisinin statik bir web sayfası sunmasıdır.
*bypass: alternatif bir yol bularak giriş veya geçiş yapmak anlamında kullanılan bir terimdir. Örneğin bir web sunucusu üzerinde farklı bir dizin yolu bulunarak bu yol kullanılıp server'a giriş yapılabilir. Bu durumda Server Bypass edilmiş olur.
*MIME types: Ortam türü, Internet üzerinde iletilen dosya biçimleri ve biçim içerikleri için iki parçalı bir tanımlayıcıdır. Amaçları, amaçlanan veri formatını tanımlamaları açısından dosya uzantılarına biraz benzer. İnternet Tahsisli Numaralar Kurumu, bu sınıflandırmaların standardizasyonu ve yayınlanması için resmi otoritedir
*header: Bilgi teknolojisinde başlık, depolanan veya iletilen bir veri bloğunun başına yerleştirilen ek verileri ifade eder. Veri iletiminde, başlığı takip eden verilere bazen yük veya gövde denir. Ayrıştırmaya izin vermek için başlık bileşiminin açık ve net bir belirtimi veya biçimi izlemesi çok önemlidir
*pivot attack: Saldırganın güvenliği ihlal edilmiş bir sistemden aynı veya başka kuruluşlardaki bir veya daha fazla başka sisteme geçmesi.
*dos denial of service attack: Denial-of-service attack, internete bağlı bir hostun hizmetlerini geçici veya süresiz olarak aksatarak, bir makinenin veya ağ kaynaklarının asıl kullanıcılar tarafından ulaşılamamasını hedefleyen bir siber saldırıdır.
*directory traversal attack: Dizin geçişi saldırısı, "ana dizine geçiş"i temsil eden karakterlerin işletim sisteminin dosya sistemi API'sine iletildiği şekilde, kullanıcı tarafından sağlanan dosya adlarının yetersiz güvenlik doğrulamasından veya temizlemesinden yararlanır.
*input: Bilgisayar biliminde girdinin genel anlamı, bilgisayara bir şey sağlamak veya vermektir, başka bir deyişle, bir bilgisayar veya aygıt dış kaynaklardan bir komut veya sinyal aldığında, olay aygıta girdi olarak adlandırılır.
*tool: araç, bir şeyi yapmaya yarayan yazılım veya uygulama
*reverse proxy server: Ters vekil sunucusu, bilgisayar ağlarında bir veya daha fazla sunucudan istemci adına kaynakları alan bir vekil sunucu türüdür. Kaynakları daha sonra istemciye geri döndürür. İleri proxy, istemcilere yakın bir yerde çalışan Web sunucularla istemciler arasında aracı olan bir vekil sunucusudur
*load balancing: Yük dengeleme; işi, iki ya da daha fazla bilgisayar, işlemci, sabit disk ya da diğer kaynaklar arasında paylaştırma teknolojisidir. Bu teknolojiyi kullanarak en iyi kaynak kullanımı, en yüksek işlem hacmi, en düşük cevap süresi sağlanabilir; oluşabilecek aşırı yüklemeden kurtulunabilir.
*obfuscation: Yazılım geliştirmede şaşırtma, insanların veya bilgisayarların anlaması zor olan kaynak veya makine kodu oluşturma eylemidir. Doğal dildeki karartma gibi, ifadeler oluşturmak için gereksiz yere dolambaçlı ifadeler kullanabilir.
*apache server: Apache, açık kaynak kodlu ve özgür bir Web sunucu programıdır. Apache Yazılım Vakfı tarafından geliştirilmektedir. Unix, GNU, FreeBSD, GNU/Linux, Solaris, Novell NetWare, Mac OS X, Microsoft Windows, OS/2, TPF ve eComStation işletim sistemleri üzerinde çalışabilir.
*IIS: Internet Information Service, Microsoft firmasının Windows işletim sistemlerinde ve sunucularında kullandığı, Web servisini sunan alt yazılımdır. Güncel sürümü, Windows 8.1 sunucuları için IIS 8.5'tir. Windows 2008 > IIS7 Windows 2003 > IIS6 Windows 2000 > IIS5 Windows XP > IIS5, 5.1 sürümleri kullanılmaktadır.
*.JSON: bütün programlama dilleri arasında, yapılandırılmış veri değişimini kolaylaştıran bir metin biçimidir. Yay ayraç, köşeli ayraç, iki nokta ve virgüllü yazımı ile birçok bağlam ve uygulamada kullanışlıdır.
*URL encoding: Resmi olarak yüzde kodlaması olarak bilinen URL kodlaması, yalnızca bir URI içinde yasal olan sınırlı US-ASCII karakterlerini kullanarak bir Tekdüzen Kaynak Tanımlayıcısındaki rastgele verileri kodlama yöntemidir.
*bayt: elektronik ve bilgisayar bilimlerinde genellikle 8 bitlik dizilim boyunca 1 veya 0 değerlerini bünyesine alan ve kaydedilen bilgilerin türünden bağımsız bir bellek ölçüm birimi. Bir bayt, Latin alfabesini baz alan 8-bitlik bir kodlamada herhangi bir harfi temsil eder. 'Çoğu platformda' 8 bit = 1 bayt
*footer: Tipografi ve kelime işlemede, yazdırılan bir sayfanın sayfa altbilgisi, ana metnin veya gövdenin altında bulunan bir bölümdür. Genellikle sayfa numarası için boşluk olarak kullanılır.
*polyglot file: Çok dilli bir dosya, iki veya daha fazla dosya formatının, her formatın hatasız olarak ayrı ayrı yorumlanabileceği şekilde bir araya getirilmesiyle oluşturulur.
*metadata: metaveri ya da üst veri, bir kaynağın ya da verinin öğelerini tanımlayan bilgilerdir. Kısaca veri hakkında veri/bilgi olarak özetlenebilir. Pratikte kütüphanelerdeki kart kataloğu ya da bibliyografya ile benzerlik gösterirler.
*process: Bilgisayar bilimlerinde işlem terimi, belleğe yüklenmiş ve işlemcide yürütülmekte olan bir program olarak tanımlanmaktadır. Uygulamalar diskte çalışmaz halde bulunurken ise program olarak tanımlanır. Bir program kendi başına pasif komut yığınıdır ve işlem ise bu komutların aktif olarak yürütülmesidir
*pseudo-random: Sözde rassal sayı üreteci, öğeleri arasında kolay kolay ilişki kurulamayacak bir sayı dizisi üreten algoritma türlerine verilen genel isimdir.
*uniqid(): php'de bir fonksiyon
*payload: Bilgi işlem ve telekomünikasyonda, payload, iletilen verilerde gerçek istenilen mesajın parçasıdır. Payload, yalnızca yük taşıma işlemini kolaylaştırmak için gönderilen herhangi bir üstbilgi veya meta veriyi hariç tutmaktadır.
*client-side: İstemci tarafı, bir bilgisayar ağındaki istemci-sunucu ilişkisinde istemci tarafından gerçekleştirilen işlemleri ifade eder.
*XXE Injection: bir saldırganın bir uygulamanın XML verilerini işlemesine müdahale etmesine izin veren bir web güvenlik açığıdır XXE olarak bilinen xml external entity enjeksiyonu ise bu işaretleme dili kullanılarak her hangi bir saldırganın xml verilerini işlemesi ile ilgilidir.
Microsoft Office: Microsoft Windows ve MacOS işletim sistemlerinde birbiriyle ilişkili masaüstü uygulamaları, sunucular ve hizmetler sunan bir ticari ofis yazılım paketi hepimiz biliyoruz
*.xls: Bir dosyanın excel dosyası üzerinde yapılmış olduğunu kanıtlayan uzantı excel dosya uzantısıdır.
*.doc: Microsoft'un tescilli Microsoft Word İkili Dosya Biçiminde depolanan sözcük işlem belgeleri için kullanılan bir dosya adı uzantısıdır. Microsoft, uzantıyı 1983'ten beri kullanıyor.
*PUT: PUT metodu ile sunuculara veri (genellikle de dosya) atılmak için kullanılır. POST gibi metodlardan farklı olarak gönderilen bu veri (katar veya dosya) ile hedef sunucuya dosya gönderilir. Gönderilen dosya ile aynı isimde bir dosya varsa da üzerine yazar, yoksa belirtilen isimde ve içerikteki dosya oluşturulur.


International-Teambd62f7e7ad9a640b.png
 
Son düzenleme:

Gauloran

Moderasyon Tim Lideri
7 Tem 2013
8,364
932
Blackwell Academy
Lab: Web Shell Upload Edip Uzaktan Kod Yürütme
Bu labde ve bundan sonra vereceklerimde resim upload açıkları mevcut. Kullanıcıların upload ettiği dosyaları serverın dosya sisteminde depolamadan önce herhangi bir doğrulama gerçekleştirmiyor. Labı çözmek için PHP Web shell upload edip /home/carlos/secret dosyasının içeriğini görmek için kullanın

Hesaba giriş yapmak için bilgiler: wiener : peter

Lab linki: Tıklayınız
 
Son düzenleme:

Gauloran

Moderasyon Tim Lideri
7 Tem 2013
8,364
932
Blackwell Academy
Lab: Path Traversal (Dizin Geçişi) ile Web Shell Upload Etmek

Server kullanıcı tarafından gelen dosyaların çalıştırılmasını engellemek için yapılandırılmış. Ancak bu ikincil bir güvenlik açığı ile bypass edilebiliyor :) Hesaba giriş bilgileri ve amaç yine aynı.

Lab linki: Tıklayınız
 
Son düzenleme:

Gauloran

Moderasyon Tim Lideri
7 Tem 2013
8,364
932
Blackwell Academy
Lab: Blacklist Bypassı ile Web Shell Upload Etme

Konuda da bahsettiğim gibi bazı belirli dosya türleri kara listeye alınmış ama bu kara listede bulabileceğiniz bir güvenlik açığı var çok da temel. Bu sayede kara listeyi bypass edebiliyorsunuz. Hesaba giriş bilgileri ve amaç yine aynı.

Lab linki: Tıklayınız

Not: Size benden bir tavsiye bu labı çözmek için iki farklı dosya upload etmeniz gerekiyor :)
 
Son düzenleme:

Gauloran

Moderasyon Tim Lideri
7 Tem 2013
8,364
932
Blackwell Academy
Lab: Obfuscation Tekniğiyle Web Shell Upload Etme

Bazı dosya türleri kara listeye alınmış ancak bazı obfuscation teknikleri ile yani sistemi aldatarak bypass edebilirsiniz konuda bahsetmiştim. Amaç ve hesaba giriş bilgileri yine aynı.

Lab linki: Tıklayınız

Benden size ipucu: exploit.php.jpg gibi şeyler yapmıştık konuda :)
 
Son düzenleme:

Gauloran

Moderasyon Tim Lideri
7 Tem 2013
8,364
932
Blackwell Academy
Lab: Polyglot Web Shell Uploadı ile Uzaktan Kod Yürütme

Upload edilen içeriğin gerçek bir resim olup olmadığını kontrol etse de sunucu taraflı kod yürütmek mümkün. Amaç yine aynı bilgiler de aynı kolay gelsin.

Lab linki: Tıklayınız

Taktik: ExifTool'a bir bakın derim :)
 
Son düzenleme:

Gauloran

Moderasyon Tim Lideri
7 Tem 2013
8,364
932
Blackwell Academy
Lab: Race Condition Açığıyla Web Shell Upload Etmek

Upload edilen dosyalara karşı sağlam bir doğrulama gerçekleştirse de race condition açığı ile bypass etmek mümkün.

Lab linki: Tıklayınız

Taktik: Race condition açığı nerede yahu diyenler için:

PHP:
<?php
$target_dir = "avatars/";
$target_file = $target_dir . $_FILES["avatar"]["name"];

// temporary move
move_uploaded_file($_FILES["avatar"]["tmp_name"], $target_file);

if (checkViruses($target_file) && checkFileType($target_file)) {
    echo "The file ". htmlspecialchars( $target_file). " has been uploaded.";
} else {
    unlink($target_file);
    echo "Sorry, there was an error uploading your file.";
    http_response_code(403);
}

function checkViruses($fileName) {
    // checking for viruses
    ...
}

function checkFileType($fileName) {
    $imageFileType = strtolower(pathinfo($fileName,PATHINFO_EXTENSION));
    if($imageFileType != "jpg" && $imageFileType != "png") {
        echo "Sorry, only JPG & PNG files are allowed\n";
        return false;
    } else {
        return true;
    }
}
?>
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.