Web uygulamaları dağıtım kolaylığı nedeniyle masaüstü uygulamalara üstünlük sağlamış ve geniş uygulama alanı bulmuştur. Bunun yanı sıra internete açık olan uygulamaların önemli bir kısmı da web uygulaması şeklindedir. Web uygulaması olmayan masaüstü uygulamalar ve mobil uygulamalar dahi web uygulama mimarisinin önemli bir kısmı olan HTTP protokolünü kullanmaktadır.
Bunların yanı sıra web uygulamaları çok katmanlı mimariye sahip olup, bu durum nispeten web uygulama altyapılarının sıradan masaüstü uygulamalara nazaran karmaşık olmalarına neden olmaktadır.
Tüm bu nedenlerden dolayı web uygulamaları saldırganların gözde hedeflerinden birisidir.
Web uygulama denetimi eğitiminde katılımcılara web uygulamalarında ortaya çıkabilecek açıklıkların neler olduğu, bu açıklıkları nasıl tespit edebilecekleri ve açıklıkların ortadan kaldırılma yöntemleri aktarılmaktadır.
Web uygulama denetimi eğitimi, mobil uygulama denetimi yapacak katılımcılara da gerekli temel web teknolojileri bilgilerini aktarmayı hedeflemektedir.
www.btrisk.com
4. Web Sunucusu
Tarayıcı (Browser)
Web Sunucusu
Uygulama Sunucusu
Veritabanı
Sunucusu
XML Veri Deposu / Konfigürasyon Dosyaları
Web Servisi
Soket Servisi
Diğer Sunucular
WEB UYGULAMA MİMARİSİ
7. HTML
• Temel HTML fonksiyonalitesi
• Tablo içinde kayıt listeleme
• Form bilgilerini sunucuya gönderme (yorum
yazma, başvuruda bulunma)
• Resim görüntüleme
• Başka bir sayfaya link verme
• Formatlı yazı görüntüleme
8. HTML
• İleri HTML fonksiyonalitesi
• Form alanlarına girilen verilerin validasyonu
• Dinamik HTML üretme (ör: bir dropdown list’ten
seçilen bir şehrin ilçelerini görüntüleme)
• Görüntü (video) oynatma ve ses dinletme
9. HTML
• Temel HTML doküman blokları
<html>
<head>
...
</head>
<body>
...
...
</body>
</html>
28. HTML
HTML Encoding
" " quotation mark
' ' apostrophe
& & ampersand
< < less than
> > greater than
29. HTML
BİREYSEL EGZERSİZ
• Tasarlayacağınız HTML sayfasının içinde bir şirket
logosu görüntülensin ve bu logoya tıklandığında
şirket web sitesi açılsın.
• Bu egzersiz için sizinle paylaşılacak olan örnek HTML
sayfasından ve internet kaynaklarından
faydalanabilirsiniz.
31. Javascript
BİREYSEL EGZERSİZ
• Size sağlanacak Javascript ile yazılmış hesap
makinesi kodlarına çarpma ve bölme
fonksiyonalitesini de kazandırınız.
32. Javascript
SINIF TARTIŞMASI
• Javascript’in bize sağladığı imkanları
düşündüğümüzde güvenlik veya güvenlik testleri
açılarından Javascript kodlarının ne yaptığını
anlamaya neden ihtiyacımız olabilir?
33. Javascript
Minify (Compress) etmek
x=100;
y=101;
document.writeln("<br> x = "+x+"<br>");
document.writeln("<br> y = "+y+"<br>");
if(x==y)
document.writeln("<br> x = y");
else
document.writeln("<br> x != y");
x=100,y=101,document.writeln("<br> x = "+x+"<br>"),document.writeln("<br> y =
"+y+"<br>"),document.writeln(x==y?"<br> x = y":"<br> x != y");
Normal
Minified
34. Javascript
Beautify etmek
x = 100;
y = 101;
document.writeln("<br> x = " + x + "<br>");
document.writeln("<br> y = " + y + "<br>");
document.writeln(x == y ? "<br> x = y" : "<br> x != y");
x=100;y=101;document.writeln("<br> x = "+x+"<br>");document.writeln("<br> y =
"+y+"<br>");document.writeln(x==y?"<br> x = y":"<br> x != y");
Güzelleşmiş
Kod
Çirkin Kod
35. Javascript
Obfuscate etmek (işler çirkinleşiyor!)
x=100;
y=101;
document.writeln("<br> x = "+x+"<br>");
document.writeln("<br> y = "+y+"<br>");
if(x==y)
document.writeln("<br> x = y");
else
document.writeln("<br> x != y");
var _0x15ab=["x3Cx62x72x3Ex20x78x20x3Dx20","x3Cx62x72x3E",
"x77x72x69x74x65x6Cx6E","x3Cx62x72x3Ex20x79x20x3Dx20","x3Cx62x72x3Ex20x78x20x3Dx20x79
","x3Cx62x72x3Ex20x78x20x21x3Dx20x79"];x=100;y=101;document[_0x15ab[2]](_0x15ab[0]+x+_0x15ab[1]);doc
ument[_0x15ab[2]](_0x15ab[3]+y+_0x15ab[1]);if(x==y){document[_0x15ab[2]](_0x15ab[4])}else
{document[_0x15ab[2]](_0x15ab[5])};
Obfuscated
AMA
NEDEN ?
Normal
36. Javascript
Obfuscate etmek (işler çirkinleşiyor!)
var _0x15ab=["<br> x = ","<br>", "writeln","<br> y = ","<br> x = y","<br> x !=
y"];x=100;y=101;document[_0x15ab[2]](_0x15ab[0]+x+_0x15ab[1]);document[_0x15ab[2]](_0x15ab[3]+y+_0x15ab[1]);if(x
==y){document[_0x15ab[2]](_0x15ab[4])}else {document[_0x15ab[2]](_0x15ab[5])};
var arr=["<br> x = ","<br>", "writeln","<br> y = ","<br> x = y","<br> x != y"];
x=100;
y=101;
document[arr[2]](arr[0]+x+arr[1]);
document[arr[2]](arr[3]+y+arr[1]);
if(x==y) {
document[arr[2]](arr[4])}
else {
document[arr[2]](arr[5])};
1
2
37. Javascript
Obfuscate etmek (işler çirkinleşiyor!)
x=100;
y=101;
document.writeln("<br> x = "+x+"<br>");
document.writeln("<br> y = "+y+"<br>");
if(x==y) {
document.writeln("<br> x = y")}
else {
document.writeln("<br> x != y")};
3
38. Javascript
Encode etmek (işler daha da çirkinleşiyor!)
x=100;
y=101;
document.writeln("<br> x = "+x+"<br>");
document.writeln("<br> y = "+y+"<br>");
if(x==y)
document.writeln("<br> x = y");
else
document.writeln("<br> x != y");
<script
language=javascript>document.write(unescape('%3C%73%63%72%69%70%74%20%6C%61%6E%67%75%61%67%65%3
D%22%6A%61%76%61%73%63%72%69%70%74%22%3E%66%75%6E%63%74%69%6F%6E%20%64%46%28%73%29%7
B%76%61%72%20%73%31%3D%75%6E%65%73%63%61%70%65%28%73%2E%73%75%62%73%74%72%28%30%2C%7
3%2E%6C%65%6E%67%74%68%2D%31%29%29%3B%20%76%61%72%20%74%3D%27%27%3B%66%6F%72%28%69%
3D%30%3B%69%3C%73%31%2E%6C%65%6E%67%74%68%3B%69%2B%2B%29%74%2B%3D%53%74%72%69%6E%67
%2E%66%72%6F%6D%43%68%61%72%43%6F%64%65%28%73%31%2E%63%68%61%72%43%6F%64%65%41%74%28
%69%29%2D%73%2E%73%75%62%73%74%72%28%73%2E%6C%65%6E%67%74%68%2D%31%2C%31%29%29%3B%6
4%6F%63%75%6D%65%6E%74%2E%77%72%69%74%65%28%75%6E%65%73%63%61%70%65%28%74%29%29%3B%7
D%3C%2F%73%63%72%69%70%74%3E'));dF('y%264E211%264C%261Bz%264E212%264C%261Bepdvnfou/xsjufmo%26
39%2633%264Dcs%264F%2631y%2631%264E%2631%2633%2Cy%2C%2633%264Dcs%264F%2633%263%3A%264C%2
61Bepdvnfou/xsjufmo%2639%2633%264Dcs%264F%2631z%2631%264E%2631%2633%2Cz%2C%2633%264Dcs%264F
%2633%263%3A%264C%261Bjg%2639y%264E%264Ez%263%3A%2631%261B%261%3Aepdvnfou/xsjufmo%2639%263
3%264Dcs%264F%2631y%2631%264E%2631z%2633%263%3A%264C%2631%261Bfmtf%2631%261B%261%3Aepdvnfo
u/xsjufmo%2639%2633%264Dcs%264F%2631y%2631%2632%264E%2631z%2633%263%3A%264C%261B1')</script>
Normal
Encoded
39. Javascript
Encode etmek (işler daha da çirkinleşiyor!)
"unescape" fonksiyonu: Hex escape karakterlerini
karşılık gelen karakterlere dönüştürür.
40. Javascript
Encode etmek (işler daha da çirkinleşiyor!)
<script language=javascript>document.write('<script language="javascript">function dF(s){var
s1=unescape(s.substr(0,s.length-1)); var
t='';for(i=0;i<s1.length;i++)t+=String.fromCharCode(s1.charCodeAt(i)-s.substr(s.length-
1,1));document.write(unescape(t));}</script>');
dF('y%264E211%264C%261Bz%264E212%264C%261Bepdvnfou/xsjufmo%2639%2633%264Dcs%264F
%2631y%2631%264E%2631%2633%2Cy%2C%2633%264Dcs%264F%2633%263%3A%264C%261Bepdv
nfou/xsjufmo%2639%2633%264Dcs%264F%2631z%2631%264E%2631%2633%2Cz%2C%2633%264Dc
s%264F%2633%263%3A%264C%261Bjg%2639y%264E%264Ez%263%3A%2631%261B%261%3Aepdvnf
ou/xsjufmo%2639%2633%264Dcs%264F%2631y%2631%264E%2631z%2633%263%3A%264C%2631%
261Bfmtf%2631%261B%261%3Aepdvnfou/xsjufmo%2639%2633%264Dcs%264F%2631y%2631%2632
%264E%2631z%2633%263%3A%264C%261B1')</script>
1
41. Javascript
Encode etmek (işler daha da çirkinleşiyor!)
<script language=javascript>
document.write('<script language="javascript">function dF(s){var s1=unescape(s.substr(0,s.length-1));
var t='';for(i=0;i<s1.length;i++)t+=String.fromCharCode(s1.charCodeAt(i)-s.substr(s.length-
1,1));document.write(unescape(t));}</script>');
dF('y%264E211%264C%261Bz%264E212%264C%261Bepdvnfou/xsjufmo%2639%2633%264Dcs%264F
%2631y%2631%264E%2631%2633%2Cy%2C%2633%264Dcs%264F%2633%263%3A%264C%261Bepdv
nfou/xsjufmo%2639%2633%264Dcs%264F%2631z%2631%264E%2631%2633%2Cz%2C%2633%264Dcs
%264F%2633%263%3A%264C%261Bjg%2639y%264E%264Ez%263%3A%2631%261B%261%3Aepdvnfo
u/xsjufmo%2639%2633%264Dcs%264F%2631y%2631%264E%2631z%2633%263%3A%264C%2631%26
1Bfmtf%2631%261B%261%3Aepdvnfou/xsjufmo%2639%2633%264Dcs%264F%2631y%2631%2632%2
64E%2631z%2633%263%3A%264C%261B1')
</script>
2
42. Javascript
Encode etmek (işler daha da çirkinleşiyor!)
"String.fromCharCode" fonksiyonu: Unicode karakter
numarasından karaktere (ör: 65 -> 'A') dönüşümü sağlar.
"String.charCodeAt" fonksiyonu: Belli bir indeksteki
karakterin unicode karakter numarasını döndürür (ör:
str="ASLAN"; n=str.charCodeAt(0); ise n = 65'tir)
61. Web Sunucusu
WEB UYGULAMA MİMARİSİ
Tarayıcı (Browser)
Web Sunucusu
Uygulama Sunucusu
Veritabanı
Sunucusu
XML Veri Deposu / Konfigürasyon Dosyaları
Web Servisi
Soket Servisi
Diğer Sunucular
TCP UDP
IP
SSL
HTTP
DNS
71. Alan Adları
İsim Çözümlemeye Giriş (Alan Adı <-> IP Adresi)
• Hosts dosyası
C:WindowsSystem32driversetchosts
/etc/hosts
1
72. Alan Adları
İsim Çözümlemeye Giriş (Alan Adı <-> IP Adresi)
• DNS altyapısı2 (.) root
edu net com org tr jp uk de
Top
Level
Domains
(TLDs)
btrisk com
www blog btrisk
www
ops
www
Parent
Domain
Sub / Child
Domain
Host
ÜlkelerJenerik
73. Alan Adları
İsim Çözümlemeye Giriş (Alan Adı <-> IP Adresi)
• DNS altyapısı2
1
2
3
4
5
6
7
8
9
İstemci
Root
DNS
.com
DNS
ns1.sadecehosting.com
www.btrisk.com
Recursive
DNS
DNS
HTTP
74. TCP ve HTTP Servis Tespiti
• Port tarama (TCP servisi açık mı?)
• Uygulama tespiti (Servis HTTP
protokolüne yanıt veriyor mu?)
İSTEMCİ SUNUCU
SYN
SYN / ACK
ACK
TCP EL SIKIŞMA ADIMLARI
76. HTTP
BİREYSEL EGZERSİZ
• Burp Suite ile ilk tanışma
• Kullandığınız tarayıcının proxy ayarlarını localhost:8080
olarak tanımlayınız ve Burp Suite'i başlatınız.
• Tarayıcınızla herhangi bir web sitesini ziyaret ederek
giden ve gelen HTTP başlıklarını inceleyiniz.
• Not: Burp Suite'in Proxy tab'ında Options alt tab'ında
bulunan "Intercept Server Responses" seçeneğini seçiniz.
77. HTTP
Örnek İstek
GET / HTTP/1.1
Host: www.btrisk.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101
Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
78. HTTP
Örnek Yanıt
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=ixnys23t1tkxe3mrrogsdwlm; path=/; HttpOnly
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Sat, 27 Jun 2015 12:40:34 GMT
Content-Length: 25297
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html ...
HTTP Yanıtı
HTTP Paketinde
Taşınan Veri
79. HTTP
İstek Metodlarına Örnekler
• GET: GET ve POST metodları en sık kullanılan metodlar olup
sunucudaki kaynaklara erişmek için kullanılırlar. GET metodu ile sorgu
metinleri URL içinde gönderilebilir. Bunun en önemli faydası kullanıcıların
bookmark edebilmeleri ve aynı sorguyu içeren istekleri daha sonra
gönderebilmelerini sağlaması ve tarayıcıda önceki sorguların “geri” tuşu
ile veya tarihçeden çağrılarak aynı sayfalara ulaşabilmeleridir. Buna
karşılık güvenlik açısından URL’lerin ekranda görüntüleniyor olması ve
URL’in hedefine ulaşıncaya kadar ve hedef sunucu üzerinde iz
kayıtlarında görülebilmesi gönderilen parametrelerin gizlilik ihtiyacı varsa
sıkıntı yaratabilir. URL’de yer alan bilgiler aşağıda açıklanan “Referer”
başlığında da görülmektedir. Bu nedenlerle hassas isteklerin GET ile
gönderilmemesinde fayda bulunmaktadır.
80. HTTP
İstek Metodlarına Örnekler (devamı)
• POST: Bu metodun asli amacı bir aktiviteyi gerçekleştirmektir. Bu
metodla istek parametreleri hem URL içinde hem de mesaj gövdesinde
gönderilebilir. Sadece mesaj gövdesinin kullanımı yukarıda sayılan riskleri
engelleyecektir. Tarayıcılar geri butonuna basıldığında POST isteğinin
mesaj gövdesinde yer alan parametreleri tekrar göndermek isteyip
istemedimizi sorarlar. Bunun temel nedeni bir işlemi yanlışlıkla birden
fazla yapmayı engellemektir. Bu özellik ve de güvenlik gerekçeleriyle bir
işlem gerçekleştirileceğinde POST metodunun kullanılması önerilir (GET
metodunun yerine).
81. HTTP
İstek Metodlarına Örnekler (devamı)
• HEAD
• TRACE
• OPTIONS
• PUT
• DELETE
• CONNECT
• WebDAV uzantısı ile gelen metodlar:
• COPY, MOVE, SEARCH, PROPFIND, ...
82. HTTP
Yanıt Statü Kodları
• 1xx: Bilgi mesajları
• 2xx: Başarılı istek yanıtları
• 3xx: İstemciyi başka bir kaynağa yönlendiren
yanıtlar
• 4xx: Bir hata barındıran isteklere karşı üretilen
yanıtlar
• 5xx: Sunucu tarafında istek karşılanmaya çalışılırken
bir hata alındığına ilişkin yanıtlar
83. HTTP
Yanıt Statü Kodlarına Örnekler
• 200 Ok: İsteğin başarılı olduğu ve yanıt gövdesinde isteğin
sonucu olan mesaj içeriğinin dönüldüğünü ifade eder.
• 302 Found: İstemciyi geçici olarak “Location” başlığında
belirtilen URL’e yönlendirmek için kullanılan statü kodudur.
İstemci sonraki taleplerde orjinal URL’i kullanmaya devam
etmelidir.
• 401 Unauthorized: Sunucunun istemciye istenen kaynağa
ulaşmak için kullanıcı credential’ları göndermesi gerektiğini
söylediği statü kodudur. Yanıt mesajındaki “WWW-
Authenticate” başlığı içinde sunucunun desteklediği tanılama
yöntemleri belirtilir.
84. HTTP
Yanıt Statü Kodlarına Örnekler (devamı)
• 403 Forbidden: İstenen kaynağa kim olursa olsun
(authenticate olunsa dahi) erişimin yasak olduğu anlamına
gelir.
• 404 Not Found: İstenen kaynağın mevcut olmadığını belirtir.
• 500 Internal Service Error: Sunucu tarafından istek işlenirken
bir hata oluşması durumunda gönderilen statü kodudur.
Hatanın detayları yanıt mesajında belirtilebilir.
• 503 Service Unavailable: Web sunucusunun çalıştığı ancak
sunucu tarafından erişilen uygulamanın çalışmadığı
durumlarda gönderilir.
85. HTTP
Yanıt Statü Kodlarına Örnekler (devamı)
• Diğer HTTP yanıtlarına örnekler:
• 100 Continue
• 201 Created
• 301 Moved Permanently
• 304 Not Modified
• 400 Bad Request
• 405 Method Not Allowed
• 413 Request Entity Too Large
• 414 Request URI Too Long
86. HTTP
HTTP Başlıkları (Genel Başlıklar)
• Connection: Karşı tarafa kurulan TCP bağlantısının
kapatılması mı yoksa devam edecek mesajlar için açık mı
tutulması gerektiğini bildirmek için kullanılır.
• Content-Encoding: Mesaj gövdesinde iletilen içeriğin hangi
kodlamaya sahip olduğunu belirtmek için kullanılır. Örneğin
daha hızlı iletim için sıkıştırmanın kullanıldığı durumlarda bu
başlık “gzip” değerini içerir.
• Content-Length: Mesaj gövdesinin byte cinsinden
uzunluğunu belirtir.
87. HTTP
HTTP Başlıkları (Genel Başlıklar - devamı)
• Content-Type: Mesaj gövdesinde iletilen içeriğin tipini
belirtir. Örneğin HTML dokümanları için “text/html” değerini
içerir.
• Transfer-Encoding: HTTP üzerinden iletilen mesajın
kullandığı kodlama tipini belirten başka bir başlıktır.
Normalde “chunked” kodlamayı belirtir. Chunked kodlama
eğer sunucunun üreteceği mesaj çok uzunsa bunu
parçalayarak gönderebilmesini ve tüm mesajın büyüklüğünü
önceden hesaplamadan mesajı göndermeye
başlayabilmesini sağlar.
88. HTTP
HTTP Başlıkları (İstek Başlıkları)
• Accept: Sunucuya hangi tipte içeriğin istemci tarafından
kabul edileceğini söyler. Örneğin imaj/resim formatları, ofis
doküman formatları vb. gibi.
• Accept-Encoding: Sunucuya hangi kodlama tiplerinde
içeriğin istemci tarafından kabul edileceğini söyler. Örneğin
“gzip” gibi.
• Authorization: Built-in HTTP authentication tipleri için
kullanıcı tarafından sunucuya gönderilen credential’ları içerir.
Örneğin NTLM hash’i veya Base64 encoded parola gibi.
• Cookie: Sunucu tarafından daha önce istemciye iletilmiş
cookie’leri içerir.
89. HTTP
HTTP Başlıkları (İstek Başlıkları - devamı)
• Host: URL’de belirtilen host adını içerir. Bu özellikle aynı port
üzerinden servis veren HTTP sunucularının ayırt edilebilmesi
veya proxy sunucuların mesajları doğru sunuculara
yönlendirebilmesi için önemlidir.
• If-Modified-Since: Bu başlık istemci tarayıcının talep edilen
kaynağa son eriştiği zamanı içerir. Eğer kaynak bu zamandan
sonra değiştirilmemişse sunucu istemciye 304 statü koduyla
hafızadaki (cache edilmiş) kopyayı kullanmasını söyleyebilir.
90. HTTP
HTTP Başlıkları (İstek Başlıkları - devamı)
• If-None-Match: Bu başlığın içinde istemci sunucu tarafından
Etag başlığı içinde belli bir kaynak için bir tag göndermişse bu
tag’i sunucuya geri gönderebilir. Bu şekilde sunucu kaynağın
değişip değişmediğine karar vererek yanıtını dönebilir.
• Referer: Mevcut talebin hangi URL’den kaynaklandığını içerir.
Bu saha örneğin google’da yapılan bir arama sonrası erişimi
tespit etmek ve ilgili google URL’inden hangi arama
cümlesiyle ilgili siteye ulaşıldığının öğrenilebilmesi için
kullanılabilir.
• User-Agent: İstemci tarafından kullanılan tarayıcı hakkında
bilgi içerir.
91. HTTP
HTTP Başlıkları (Yanıt Başlıkları)
• Server: Web sunucu yazılımı hakkında bilgi içerir (yazılım
üreticisi, yazılım versiyon, eklentiler, vd.)
• Set-Cookie: İstemci tarayıcıya sonraki isteklerinde geri
göndermesi için gönderilen cookie’leri içerir.
• WWW-Authenticate: Bu başlık 401 (unauthorized) statü
kodlu yanıtların içinde sunucu tarafından desteklenen
tanılama (authentication) tiplerini belirtmek için kullanılır.
• Location: Bu başlık statü kodu 3 ile başlayan yeniden
yönlendirme (redirection) mesajlarında yönlendirilmek
istenen hedefi belirtir.
92. HTTP
HTTP Başlıkları (Yanıt Başlıkları - devamı)
• Cache-Control: Sunucu tarafından istemciye cache’lemeyle
ilgili talimatların iletilmesi için kullanılır. Örneğin “no-cache”
içeriği tarayıcının kaynağı cache’inde tutmaması talimatı
anlamına gelir.
• Pragma: Bu başlık da istemci tarayıcısına yönelik
cache’lemeyle ilgili talimatları içerir. “no-cache” içeriği
tarayıcının ilgili kaynağı cache’inde saklamaması talimatı
anlamına gelir. HTTP 1.1 uyumlu olmayan sunuculara karşı
hem “Cache-Control” hem de “Pragma” başlıkların
gönderilmesi önerilmektedir RFC 2616 (HTTP 1.1) tarafından.
Cache-Control başlığı HTTP 1.1’de tanımlanmıştır.
93. HTTP
HTTP Başlıkları (Yanıt Başlıkları - devamı)
• Expires: Sunucu tarafından istemci tarayıcıya gönderilen
kaynağın ne zamana kadar geçerli olacağının iletilmesini
sağlar. İstemci tarayıcı bu zamana kadar cache’lediği kopyayı
kullanabilir.
• ETag: Yukarıda da belirtildiği üzere sunucu istenen kaynağa
bir tag değeri atayarak (entity tag) daha sonra istemci
tarafından “If-None-Match” başlığı içinde gönderilen içeriğe
göre yanıtını belirleyebilmektedir. Bu başlık içinde kaynağa
atanmış tag değeri iletilir.
94. Cookie
Sunucu yanıtı içindeki Set-Cookie başlığı örneği:
Set-Cookie: ASP.NET_SessionId=ixnys23t1tkxe3mrrogsdwlm; path=/; HttpOnly
İstemci isteği içindeki Cookie başlığı örneği:
Cookie: ASP.NET_SessionId=ixnys23t1tkxe3mrrogsdwlm
HTTP
95. HTTP
Cookie Özellikleri (attributes)
• expires: Cookie’nin geçerli olduğu zaman sınırını tanımlar. Bu özellik
tanımlı değilse istemci’nin bilgisayarı cookie’yi diskine yazmaz ve cookie
sadece mevcut tarayıcı oturumunda kullanılabilir. Ancak bu özellik ileri bir
tarih olarak belirtilmişse diske yazılır ve bu tarihe kadar açılacak olan diğer
tarayıcı oturumlarında da kullanılır.
• domain: Cookie’nin geçerli olduğu alan adını tanımlar. Bu alan cookie’nin
gönderildiği alan veya daha üst (parent) alanlardan farklı olamaz.
• path: Cookie’nin geçerli olduğu dizin (path) adını içerir.
• secure: Eğer bu özellik kullanılmışsa ilgili cookie sadece HTTPS isteklerinde
gönderilebilir.
• HttpOnly: Tüm tarayıcılar bu özelliği desteklememekle birlikte eğer bu
özellik kullanılmışsa cookie değerine istemci tarafında çalışan JavaScript
kodları tarafından erişilemez.
100. HTTP
Built-in HTTP kullanıcı tanılama yöntemleri:
• Negotiate ve NTLM Authentication (Challenge-response
metoduyla çalışırlar)
• Digest Authentication (Parola hash'ini gönderir)
• Basic Authentication (Sadece Base64 kodlayarak kullanıcı adı
ve parolasını Authorize başlığı içinde iletir)
• İlgili HTTP yanıt ve başlıkları:
• 401 Unauthorized
• WWW-Authenticate (Basic, Digest, Negotiate veya
NTLM)
• Authorization (Base64 kodlu erişim bilgileri)
101. HTTP
BİREYSEL EGZERSİZ
• Size sağlanacak IP adresinde barındırılan HTTP
sunucusuna bağlanmadan önce Burp Suite ile
tarayıcınızın arasına giriniz.
• Karşılaşacağınız kullanıcı tanılama ekranına herhangi
bir kullanıcı adı ve parola girdikten sonra iletilen
istek mesajını inceleyiniz.
102. HTTP
Daha detaylı bilgi için bakınız:
http://blog.btrisk.com/2014/09/web-uygulamalari-
guvenlik-testleri-icin-temel-web-teknolojileri.html
103. HTTP(S)
BİREYSEL EGZERSİZ
• Wireshark'ı internet erişimi için kullanacağınız
arayüzü dinleyecek şekilde ayarlayınız.
• HTTPS protokolü ile bir web sitesine erişerek alış
verişi yapılan paketleri inceleyiniz ve SSL
protokolünü anlamaya çalışınız.
• Wireshark üzerinde inceleyeceğiniz paketleri
filtrelemek için eğitmen desteği alınız.
107. HTTP(S)
Temel Kriptografi Kavramları
Base64 Kodlama (Encoding)
B T R
ASCII Kodu (Ondalık)
Binary Kodu
6 bit'lik Bölümler
66 84 82
1
49
01000010 01010100 01010010 00110001
010000 100101 010001 010010
Ondalık Karşılığı
001100 010000 000000 000000
16 37 17 18 12 16 0 0
Base64 Kodu Q l R S M Q = =
PADDING
117. HTTP(S)
Tarayıcı sertifika kontrolleri
• Trusted bir sertifika otoritesi tarafından imzalanması
• Sertifika içinde geçen alan adı ile erişmek istediğimiz
alan adının tutarlı olması
• Sertifika geçerlilik süresi içinde bulunmamız
118. HTTP(S)
HTTPS erişiminde araya girme (MITM)
SINIF TARTIŞMASI
• Eğer Burp Suite ile araya girerken tarayıcımızın bizi
her seferinde uyarmasını istemezsek ne yapabiliriz?
120. Man In the Middle (MITM) Yöntemleri
MITM Tekniklerine Örnekler:
• ARP Poisoning: Layer 2'de iletişimin kendi üzerimizden geçmesi için
gateway ve hedef bilgisayarın ARP cache'lerini zehirleme yöntemi
• DNS Spoofing: DNS sunucusundan daha önce bir yanıt üreterek kurbanı
kendi bilgisayarımıza yönlendirme yöntemi
• DNS Cache Poisoning / DNS Hacking (Pharming): Kurban(lar) için
recursive DNS istekleri yapan DNS sunucusu bir istekte bulunduğunda
sorgu yapılan DNS sunucusundan daha önce yanıt göndererek DNS
sunucusunun cache'ini zehirleme yöntemi
• ICMP Redirect: Default gateway'den geliyormuş gibi bir ICMP redirect
paketi spoof ederek kurbanı iletişimi kendi bilgisayarımız üzerinden
gerçekleştirmeye yönlendirme yöntemi
• DHCP Spoofing: DHCP isteklerine gerçek DHCP sunucusundan önce yanıt
vererek default gateway ayarını kendi bilgisayarımız olacak şekilde
kurbanı yönlendirme yöntemi
121. İstemci Katmanı Güvenlik Yaklaşımları
Same Origin Policy
• Tarayıcılar tarafından belli bir orijinden gelen JavaScript
kodlarının kendi orijinleri dışındaki bir sunucudan veri
almalarını engeller.
• Önemli: Same Origin Policy farklı orijinlerdeki sunuculara
istek yapılmasını, yani veri gönderilmesini engellemez,
sadece yapılan isteklerin yanıtlarının işlenmesine izin
vermez.
• Same Origin Policy ayrıca açık olan diğer pencerelerdeki farklı
domain'lerden gelen verilere erişimi de engeller.
• Orijin kavramı protokol, tam sunucu adı ve port bilgilerini
içerir.
122. İstemci Katmanı Güvenlik Yaklaşımları
Same Origin Policy
• Örnek: http://www.btrisk.com/dir/sayfa.html sayfasında bir script için
aşağıdaki senaryolarda uygulanan kurallar
URL Sonuç Sebebi
http://www.btrisk.com/dir/sayfa2.html Başarılı Aynı protokol, sunucu ve port
http://www.btrisk.com/dir2/diger.html Başarılı Aynı protokol, sunucu ve port
http://kullaniciadi:parola@www.btrisk.c
om/dir2/diger.html
Başarılı Aynı protokol, sunucu ve port
http://www.btrisk.com:81/dir/diger.html Başarısız Aynı protokol ve sunucu, ancak farklı port
https://www.btrisk.com/dir/diger.html Başarısız Farklı protokol
http://en.btrisk.com/dir/diger.html Başarısız Farklı sunucu
http://btrisk.com/dir/diger.html Başarısız Farklı sunucu (tam eşleşme gerekli)
http://v2.www.btrisk.com/dir/diger.html Başarısız Farklı sunucu (tam eşleşme gerekli)
http://www.btrisk.com:80/dir/diger.html
Tarayıcıya
Bağlı
Port açıkça yazılmış. Karar tarayıcıya göre
değişir.
123. İstemci Katmanı Güvenlik Yaklaşımları
Cross Domain Policy
• Bazı durumlarda web sunucusunun sahibi diğer domain'lerde
barındırılan Flash ve Silverlight kodlarının sunucu üzerindeki
verilere erişmesine izin vermek isteyebilir.
• Bu durumda sitenin root dizinine eklenecek bir
crossdomain.xml dosyası ile farklı domainler için erişim izni
verilebilir.
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
124. Web Sunucu Güvenliği
Temel web sunucu açıklıkları:
• Desteklenen gereksiz HTTP metodları
• Dizin listeleme imkanı
• HTTP başlıkları içinde sunucu ve versiyon bilgilerinin
sızması
• Oturum çerezleri için web sunucu imkanları
kullanılıyorsa (ki bu önerilen yöntemdir) HttpOnly ve
secure özelliklerinin işaretlenmemesi
• Öntanımlı zaman aşım süresinin uzun tutulması
• İstek boyutlarının kısıtlanmaması
125. Web Sunucu Güvenliği
Temel web sunucu açıklıkları:
• Kullanılan teknolojiye özel kontrol imkanlarından
faydalanılmaması
• Kullanılmayan uzantılar için desteğin
kaldırılmaması
• XSS engelleme özelliğinin kullanılmaması
• Hata mesajları özelleştirilmesinin kullanılmaması
• Temel işletim sistemi (OS) sıkılaştırma kontrollerinin
uygulanmamış olması
126. Web Sunucu Güvenliği
Daha detaylı bilgi için:
• http://blog.btrisk.com/2014/05/Apache-guvenlik-
yapilandirmasi-apache-hardening-tip.html
• http://blog.btrisk.com/2014/08/Asp.Net-ve-IIS-
Konfigurasyonlari.html
127. Web Sunucu Katmanındaki Açıklıklar
• Tehlikeli metodların üretim (production)
ortamlarında aktif olması
• Üretim (production) ortamlarında dizin listelemenin
aktif olması
• Web / Uygulama sunucularında tespit edilmiş olan
sunucuya özel açıklıklar (ör: .NET padding açıklığı,
NTLM authentication'ın açık olması, v.b.)
128. Web Sunucu Katmanındaki Açıklıklar
SINIF TARTIŞMASI
• Aşağıdaki metodların aktif olması hangi riskleri
doğurabilir?
• PUT
• DELETE
• CONNECT
129. Web Sunucu Katmanına Yönelik Saldırılar
Apache üzerinde WebDAV extension'larını (WAMP
ortamında) aktif hale getirmek için:
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
DavLockDB "C:/wamp/tmp/DavLock"
<Directory "c:/wamp/www/"> içinde
Dav On
httpd.conf
dosyası
içinde
Comment'i
kaldır
Ekle
Ekle
130. Web Sunucu Katmanına Yönelik Saldırılar
PUT metodu saldırı senaryosu
3
1 PUT /webshell.php HTTP/1.1
Web shell erişimi
2 GET /webshell.php HTTP/1.1
1
131. Web Sunucu Katmanına Yönelik Saldırılar
PUT metodu saldırı senaryosu 2
3
1 PUT /tcphell.php HTTP/1.1
Reverse TCP
shell erişimi
2 GET /tcpshell.php HTTP/1.1
TCP 4444
TCP 80
132. Web Sunucu Katmanına Yönelik Saldırılar
PUT metodu saldırı senaryosu 2
1
2 PUT /tcphell.php HTTP/1.1
3
4
GET /tcpshell.php HTTP/1.1
5
133. Web Sunucu Katmanına Yönelik Saldırılar
CONNECT metodu saldırı senaryosu
CONNECT 192.168.1.5:22 HTTP/1.1
TCP 22
X
192.168.1.585.100.85.100
TCP 80 TCP 22
135. Web Sunucu Katmanındaki Açıklıklar
Dizin listeleme
Options Indexes FollowSymLinks
<IfModule dir_module>
DirectoryIndex index.php index.php3 index.html
</IfModule>
httpd.conf
dosyası
içinde
Dizin listeleme için
gerekli direktif
Bu dosyalardan
herhangi birisi dizin içinde
olmazsa dizin listeleme
gerçekleşir
136. Web Sunucu Katmanındaki Açıklıklar
Diğer örnek web sunucu açıklıkları
Açıklık Etkisi
Apache httpOnly cookie sızma
açıklığı
Söz konusu açıklık farklı saldırı yöntemleri ile bir arada kullanıldığında (ör:
XSS) httpOnly cookie'lerin sızması ile sonuçlanabilir.
IIS WebDAV Hizmet Kesinti
Açıklığı - MS01-016
WebDAV uzantısı aktif IIS 5.0 sunucusu özel olarak hazırlanmış PROPFIND
istekleri ile hizmet kesintisine uğratılabilmektedir. Hizmet kesintisi
saldırganın özel hazırladığı paketleri gönderdiği süre boyunca geçerlidir.
.NET Framework bilgi sızdırma
açıklığı
Söz konusu açıklık sayesinde sunucu tarafından kriptolanan hassas
bilgilerin çözülmesi ve ASP.NET uygulaması içinde bulunan herhangi bir
dosyanın (ör: web.config dosyası) okunabilmesi mümkün olacaktır.
Web sunucu hatalarının ele
alınmaması
Bazı sunucular için web sunucu tarafından kullanıcıya görüntülenen
öntanımlı teknik hata mesajları saldırganların işini kolaylaştırıcı bilgiler (ör:
web sunucu versiyonu, veritabanı hataları ile tablo yapıları ve verileri, kod
parçaları, v.b.) sızdırabilir
Web sunucu ASP kod sızdırma
açıklığı
ASP kaynak kodları kullanıcı adı, parola ve diğer bilgilerden oluşan hassas
bilgiler içerebilir. Söz konusu açıklıklar kullanılarak uygulama kaynak
kodları ve içeriklerindeki hassas bilgilere yetkisiz erişim gerçekleştirilebilir.
137. Web Sunucusu
Tarayıcı (Browser)
Web Sunucusu
Uygulama Sunucusu
Veritabanı
Sunucusu
XML Veri Deposu / Konfigürasyon Dosyaları
Web Servisi
Soket Servisi
Diğer Sunucular
Oturum
Yönetimi
Erişim
Yönetimi
Girdi
Kontrolü
Hata Ele
Alma
Sunucu
Yönetimi
WEB UYGULAMA MİMARİSİ
Sunucu
Taraflı
Kontroller
140. Web Uygulamaları Girdi Noktaları
URI Parametreleri
POST Parametreleri
HTTP Başlıkları
Veritabanı
Yanıtları
Diğer Web
Uygulamaları,
Web Servisleri
Sunucu
Çevresel
Değişkenleri
Sunucu Üzerindeki
Dosyalar
(XML, config, v.b.)
141. Web Uygulamaları Girdi Noktaları
GİRDİ NOKTASI
KONTROL
EDİLEBİLİRLİK
AÇIKLAMA
HTTP İstekleri (URI,
POST parametreleri, HTTP
başlıkları)
Uzaktan
Veritabanı Yanıtları Kısmen Uzaktan
Kullanıcının neden olduğu
kayıtlar uzaktan saldırı
vektörü olarak kullanılabilir
Diğer Web
Uygulamaları, Web
Servisleri
Diğer Uygulama Sahipleri
veya Kullanıcıları
Tarafından
Diğer alan adlarından
alınan kodlar da bu sınıfta
değerlendirilebilir
Sunucu Üzerindeki
Dosyalar
Lokal Olarak, Çok Seyrek
Olarak Uzaktan
Sunucu Çevresel
Değişkenleri
Lokal Olarak
143. Web Uygulamaları Girdi Noktaları
Sıkça Karşılaşacağınız POST Encoding Türleri
Content-Type: application/x-www-form-urlencoded
• Öntanımlı form verisi encoding formatıdır.
POST /User/Update?0.5469181543563653 HTTP/1.1
Host: www.abc.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://www.abc.com/Main
Content-Length: 90
Cookie: ASP.NET_SessionId=oibe1hl3eh1yxrh3lljuqcdi
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Adres=Istanbul&Egitim=Lisans&Meslek=Hacker
144. Web Uygulamaları Girdi Noktaları
Sıkça Karşılaşacağınız POST Encoding Türleri
Content-Type: text/xml
• Web servis isteklerinde karşılaşılır. AJAX, mobil uygulama veya thick
client uygulama isteklerinde gözlenebilir.
POST /Services/WebService.asmx HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://tempuri.org/GetDetail"
Content-Length: 296
Host: www.abc.com
Proxy-Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:GetDetail>
<tem:itemID>100</tem:itemID>
</tem:GetDetail>
</soapenv:Body>
</soapenv:Envelope>
145. Web Uygulamaları Girdi Noktaları
Sıkça Karşılaşacağınız POST Encoding Türleri
Content-Type: multipart/form-data
• Form yüklenecek bir dosya içeriyorsa FORM tag'inin "enctype"
özelliğinde belirtilerek form verisi içinde dosya yüklemek için kullanılır.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>upload</title>
</head>
<body>
<form action="http://www.btrisk.com" method="post" enctype="multipart/form-data">
<p><input type="text" name="text1" value="test">
<p><input type="file" name="file1">
<p><button type="submit">Submit</button>
</form>
</body>
</html>
146. Web Uygulamaları Girdi Noktaları
Sıkça Karşılaşacağınız POST Encoding Türleri
Content-Type: multipart/form-data
• Form yüklenecek bir dosya içeriyorsa FORM tag'inin "enctype"
özelliğinde belirtilerek form verisi içinde dosya yüklemek için kullanılır.
POST http://www.btrisk.com/ HTTP/1.1
Host: www.btrisk.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------115553026227194
Content-Length: 11848
-----------------------------115553026227194
Content-Disposition: form-data; name="text1"
test
-----------------------------115553026227194
Content-Disposition: form-data; name="file1"; filename="EÄŸitim Takvimi.xlsx"
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
PK
147. Web Uygulamaları Girdi Noktaları
Sıkça Karşılaşacağınız POST Encoding Türleri
Content-type: application/json
• Genellikle AJAX istekleri ve yanıtlarında görülür, ancak mobil ve thick
client uygulamalarında da rastlanır. JSON formatı hafif (lightweight)
olması dolayısıyla web servis yanıtlarında da tercih edilmektedir.
POST /api/AnalyticsData/Integration HTTP/1.1
Accept: application/json
Content-type: application/json
User-Agent: Mozilla/5.0 (Linux; Android 4.4.2; google_sdk Build/KK) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0
Chrome/30.0.0.0 Mobile Safari/537.36
Content-Length: 316
Host: www.abc.com
Connection: Keep-Alive
{"phone":"905554445566","customerId":"847364655","osVersion":"4.3.2","accessToken":"a181c0df47ce492db087f247a37650
46","timeValue":"1403363400055","email":"user@gmail.com","appVersion":"1.0.3","customParams":"","name":"MEHMET","s
urname":"KAYHAN","deviceId":"1b0ccd48f4ecefdgd","osName":"Android","sdkVersion":"4.1.0"}>
148. Web Uygulamaları Girdi Noktaları
Sıkça Karşılaşacağınız POST Encoding Türleri
JSON (JavaScript Object Notation)
• JSON formatı JavaScript Object Notation'ın bir alt kümesi olup JavaScript
kodları içinde nesne erişimi için kullanılan bir native veri formatıdır.
• AJAX isteklerine dönen yanıtlarda sıklıkla kullanılmasının temel nedeni
budur.
• Ayrıca XML formatına nazaran kullanılan whitespace veri miktarını
azalttığı için iletilen veri büyüklüğünün azaltılmasında da fayda sağlar.
149. AJAX
AJAX Nedir?
AJAX = Asynchronous JavaScript and XML.
AJAX'ı anlamak için aşağıdaki konularda temel bilgi
sahibi olmak gereklidir:
• HTML / XHTML
• CSS
• JavaScript / DOM
150. AJAX
AJAX Nasıl Çalışır?
Bir olay oluştuğunda...
• XMLHttpRequest
nesnesi oluştur
• HTTP isteği gönder
• Dönen veriyi
JavaScript ile işle
• Sayfa içeriğini
güncelle
• HTTP isteğini işle
• Bir yanıt oluştur ve
tarayıcıya gönder
TARAYICI SUNUCU
Örneğin bir tuşa basıldığında
Örneğin basılan tuşla başlayan illeri listele
151. AJAX
Örnek Kod
POST /api/AnalyticsData/Integration HTTP/1.1
Accept: application/json
Content-type: application/json
User-Agent: Mozilla/5.0 (Linux; Android 4.4.2; google_sdk Build/KK) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0
Chrome/30.0.0.0 Mobile Safari/537.36
Content-Length: 316
Host: www.abc.com
Connection: Keep-Alive
{"phone":"905554445566","customerId":"847364655","osVersion":"4.3.2","accessToken":"a181c0df47ce492db087f247a37650
46","timeValue":"1403363400055","email":"user@gmail.com","appVersion":"1.0.3","customParams":"","name":"MEHMET","s
urname":"KAYHAN","deviceId":"1b0ccd48f4ecefdgd","osName":"Android","sdkVersion":"4.1.0"}>
152. Web Uygulamaları Girdi Noktaları
Verilere Erişim
Veri Erişimi Değişkenleri
$_REQUEST
$_GET
$_POST
$_COOKIE
$_SERVER
$_ENV
URI Parametreleri
POST Parametreleri
Cookie Değerleri
HTTP Başlıkları
Çevresel Değişkenler
153. Web Uygulamaları Girdi Noktaları
Verilere Erişim
Örnek
<?php
if(isset($_REQUEST['kullaniciAdi'])){
echo 'Hoşgeldin '.$_REQUEST['kullaniciAdi'];
} else {
echo 'Kullanıcı Adını Giriniz...';
}
?>
154. XSS Açıklıkları
XSS Nedir?
• Cross Site Scripting'in kısaltmasıdır. CSS "Cascaded Style
Sheets" ifadesinin kısaltması olarak kullanıldığından XSS
kullanılmıştır.
• Tarayıcı üzerinde gelen HTML sayfasının içeriğinde bulunan
Javascript (v.d.) script kodlarının çalıştığını görmüştük.
• Eğer web uygulaması (örneğin bir php kodu) istemciden gelen
bir girdiyi (ör: URI parametresi, POST parametresi, JSON,
SOAP v.d. formatlardaki girdiler, cookie değeri, diğer HTTP
başlık değerleri) bir girdi kontrolünden geçirmeden ve özel
HTML karakterlerini encode etmeden kullanıcıya geri
gönderirse ve bu girdi bir script içeriyorsa XSS gerçekleşir.
159. XSS Açıklıkları
SINIF TARTIŞMASI
• XSS saldırısı sadece URL parametrelerine yönelik mi
gerçekleştirilebilir (POST parametresi üzerinden XSS
yapılabilir mi)?
163. XSS Açıklıkları
Document Object Model (DOM) Tabanlı XSS Açıklıkları
7
1
2 Saldırgan özel URL'i kullanıcıya gönderir
3
4
Kullanıcının tarayıcısı oturum parametresini
saldırgana gönderir
6
URL içinde
geçen script
kodu DOM
kullanan
Javascript ile
HTML'e katılır
5
KULLANICI SALDIRGAN
UYGULAMA
Yansıtılan XSS'ten farkı;
URL içinde geçen script
kodunun sunucu uygulaması
tarafından değil, sunucunun
ürettiği HTML sayfasının
içinde zaten var olan
Javascript kodu tarafından
dinamik olarak HTML'e dahil
edilmesidir.
184. Erişim Kontrol Açıklıkları
Geçerli Kullanıcı Belirleme
Aradaki fark HTML
encode edilmiş bir boşluk
karakterinden kaynaklanıyor
" "
185. Erişim Kontrol Açıklıkları
Diğer Erişim Kontrol Açıklıklarına Örnekler:
• Parola politikası uygulanmaması ve kaba kuvvet saldırıları
• Hatalı uygulanan CAPTCHA kontrolü, CAPTCHA imajının robot
aracılığı ile okunabilmesi
• Referer başlığına güvenen erişim kontrolü
• Parola alanlarında "autocomplete=off" özelliğinin
kullanılmaması
• Tek kullanımlık parola geçerlilik süresinin sınırlandırılmaması
186. Direct Object Access
PDF, ofis dokümanı, resim dosyaları gibi statik içerik web sunucu
dizinlerinde barındırılırsa bu verilere erişim kontrolü
uygulanamayabilir. Bazı platformlar (ASP.NET veya Java
framework'leri gibi) tanılanmamış kullanıcıların uygulama
dizinleri altındaki herhangi bir dosyaya erişmesine izin
vermemektedir.
Erişim kontrolü uygulansa bile kontrol sadece tanılanmış ve
tanılanmamış kullanıcılar arasında uygulanabilir, dolayısıyla
tanılanmış kullanıcılar yine tüm içeriğe erişebilir.
189. İstemci Taraflı Kontrollerin Aşılması
SINIF TARTIŞMASI
• İstemci tarafında uygulanan kontrolleri nasıl
uygulayabiliriz?
• Bu kontroller hangi koşullarda geçersiz kalabilir?
190. İstemci Taraflı Kontrollerin Aşılması
Uygulamamız TL transfer
fonksiyonunda tutarın negatif
olmamasını kontrol ediyor
192. İstemci Taraflı Kontrollerin Aşılması
Kontrolü yapan Javascript
kontrolünü dönen yanıttan
temizliyoruz
Böylece istemci tarafındaki
kontrol etkisiz kalacak
193. İstemci Taraflı Kontrollerin Aşılması
Javascript kontrolünü ortadan
kaldırdıktan sonra tutarı -50 TL
olarak gönderiyoruz
Tahmin edebileceğiniz gibi
önyüzde geçerli bir rakam girip
attack proxy'de de bu değişikliği
yapabilirdik
Şimdi sunucu tarafında da aynı
kontrolün uygulanıp
uygulanmadığını görelim
194. İstemci Taraflı Kontrollerin Aşılması
İşlemimiz başarı ile gerçekleşti ve
biz negatif bir para transferi ile
bakiyemizi artırdık
195. Remote File Inclusion
Çok sık gözlenmemekle birlikte
web uygulamalarının parametre
olarak aldıkları dosya isimlerini
çalışma anında HTML içeriğine
dahil ettikleri görülebilir
Buradaki örnekte uygulama bir
dosya adını parametre olarak
alıyor gibi görünüyor
Bu adın kök dizinden itibaren
tanımlanmış olması uzak dosya
dahil etme ihtimalini artırıyor
196. Remote File Inclusion
Sayfa kaynak kodunu
incelediğimizde bu parametrede
belirtilen dosyanın HTML kodu
içine dahil edildiğini görüyoruz
197. Remote File Inclusion
Bu parametreye kendi kontrol
ettiğimiz bir sitede bulunan ve
sayfanın cookie'lerini çalarak
istediğimiz IP adresine gönderen
bir Javascript kodunun adresini
yazıyoruz
214. Oturum Yönetim Açıklıkları
Oturum Yönetimi
• HTTP'nin connectionless bir protokol olması
• Kullanıcı tanılama fazlarında oturum parametresinin
değişmesi
• Oturum parametresinin rassallığı ve anahtar genişliği
• Oturum geçerlilik süre sınırı (istemci ve sunucu tarafında)
• Güvenli çıkış fonksiyonalitesi
215. Oturum Yönetim Açıklıkları
Oturum Parametresi'nin Tanılama Fazlarında Değişimi
Anonim Faz
PHPSESSID
Login Fazı
BTRmCookie
OTP Fazı
1
2
3
221. Oturum Yönetim Açıklıkları
Oturum Parametresinin Rassallığı
Sequencer modülü otomatik
olarak rassallık testi
yapılabilecek cookie ve
parametreleri tanıyabilir,
veya biz istediğimiz özel alanı
Burp'e tanıtabiliriz.
222. Oturum Yönetim Açıklıkları
Oturum Parametresinin Rassallığı
Sequencer modülü
cookie'mizin rassallık
değerini çok düşük buldu.
cookie değer
örneklerimiz
231. Cookie Riskleri
Cookie Özellikleri
Oturum cookie'miz "httponly"
olarak işaretlenmediği için Javascript
kodu ile erişilebilir.
"secure" olarak işaretlenmediği için
HTTP üzerinden iletilebilir.
234. Cookie Riskleri
Kalıcı Cookie'ler
Bu cookie değerini ASCII HEX decode
ettiğimizde içinde telefon numarası
ve kullanıcı adı, soyadının
tutulduğunu görüyoruz.
236. File Upload Riskleri Uygulama resim dosyasının ismini
aşağıdaki gibi oluşturuyor ve bunu
istemci tarafında belirlemiş oluyor.
237. File Upload Riskleri Bilgilerim sayfasında bulunan linkleri
incelediğimizde fotoğraf dosyasının
bu isimle çekildiğini görüyoruz.
Buradan yüklenen dosyaların
"/profile_photo" dizini altına
yüklendiğini varsayabiliriz.
238. File Upload Riskleri Bu defa bir resim dosyası yerine bir
php kodu yükleyeceğiz.
Uygulama istemci veya sunucu
tarafında uzantı veya içerik kontrolü
yapmıyor.
247. Redirection Açıklıkları Bu düğme tıklandığında yapılan
isteğin "loginpage" adında bir
parametre aldığını ve bu
parametrenin de "login.php"
olduğunu görüyoruz.
252. URL ve Referer Başlığında Sızan Bilgiler
TL Yükle fonksiyonu hassas
parametreleri URL içinde iletiyor
253. URL ve Referer Başlığında Sızan Bilgiler
TL Yükle fonksiyonu hassas
parametreleri URL içinde iletiyor
254. SINIF TARTIŞMASI
• URL içinde hassas bilgi iletilmesinin doğurabileceği
riskler nelerdir?
URL ve Referer Başlığında Sızan Bilgiler
255. URL ve Referer Başlığında Sızan Bilgiler
TL Yükle fonksiyonuna yapılan isteğe
dönen HTML yanıtı içinde
www.btrisk.com alanında bulunan
bir resim dosyasına link görülüyor
256. URL ve Referer Başlığında Sızan Bilgiler
Bu resim dosyasına yapılan istek
mesajının "Referer" başlığı içinde
hassas bilgileri içeren URL bilgisi
görülüyor
258. URL ve Referer Başlığında Sızan Bilgiler
www.btrisk.com alanından çekilen
resim görüntüsü
259. HTML Comment Bölümlerinde Sızan Hassas
Bilgiler
Çok sık olmasa da özellikle uygulama
geliştirme süreci ve testler sırasında
HTML yorum alanlarında
yerleştirilmiş olan hassas bilgiler
üretim ortamlarında da
unutulabilmektedir
Bu durumu test etmek için elbette
sayfa kaynak kodlarını incelemek
gerekecektir
260. HTML Comment Bölümlerinde Sızan Hassas
Bilgiler
OTP sayfasının kaynak kodunda OTP
kodunun yorum alanında istemciye
iletildiğini görüyoruz
(Not: Bu alan eğitim uygulamamızın
telefon ekranı görüntüsünde görülen
OTP koduyla ilişkili bir alan değildir)
261. HTML Comment Bölümlerinde Sızan Hassas
Bilgiler
Burp'ün yorum satırlarını otomatik
olarak ayrıştırabilmesi sayesinde
yorum satırlarını daha kolay
inceleyebilirsiniz
262. HACKING'İN ALTIN KURALI #2
(MANTIK ve ERİŞİM KONTROL HATALARI DIŞINDAKİ TEKNİK
HATALAR İÇİN)
EĞER BİR SİSTEMİ HACK'LEYEBİLİYORSANIZ
O SİSTEME HATA ALDIRABİLİRSİNİZ
DOLAYISIYLA BİR SİSTEME HATA
ALDIRABİLİYORSANIZ
O SİSTEMİ HACK'LEME İHTİMALİNİZ
VARDIR
HACKING
263. Hata Ele Alma
Hata Ele Alma Riskleri:
• Web sunucusu, uygulama sunucusu ve uygulama içinde hata
ele alma ve özel hata mesajları (custom error messages)
kullanılmaması, veya
• Uygulama tarafından ele alınan hatalar için teknik hata
mesajlarının kullanıcıya görüntülenmesi olası saldırganların
işini kolaylaştıracaktır.
• Hacking'in Altın Kuralı #2 gereği hata oluşması halinde
uygulamanın hack'lenmesi ihtimali doğacaktır. Hata
mesajlarının zengin biçimde kullanıcıya aktarılması ise saldırı
yöntemlerinin kısa zamanda etkili hale getirilmesine büyük
yardımda bulunacaktır.
265. Web Sunucusu
Tarayıcı (Browser)
Web Sunucusu
Uygulama Sunucusu
Veritabanı
Sunucusu
XML Veri Deposu / Konfigürasyon Dosyaları
Web Servisi
Soket Servisi
Diğer Sunucular
Girdi
Kontrolü
Mantık
Hataları
WEB UYGULAMA MİMARİSİ
266. SQL Injection Saldırıları
SQL (Structured Query Language) Nedir?
Data Definition Language (DDL)
• CREATE (ör: CREATE TABLE Kullanici (KullaniciID int, KullaniciAdi varchar(255));)
• ALTER (ör: ALTER TABLE Kullanici ADD Adres varchar(255);)
• DROP (ör: DROP TABLE Kullanici;)
Data Control Language (DCL)
• GRANT (ör: GRANT SELECT, INSERT, UPDATE, DELETE ON Kullanici TO bozgenc;)
• REVOKE (ör: REVOKE SELECT ON Kullanici FROM public;)
Data Transaction Language (DTL)
• START TRANSACTION
• SAVEPOINT
• COMMIT
• ROLLBACK [TO SAVEPOINT]
267. SQL Injection Saldırıları
SQL (Structured Query Language) Nedir?
Data Query Language (DQL)
• SELECT (detaylı şekilde açıklayacağız)
• SHOW
• HELP
Data Manipulation Language (DML)
• INSERT (ör: INSERT INTO Kullanici (KullaniciAdi, Adres) VALUES ('akara','Istanbul');)
• UPDATE (ör: UPDATE Kullanici SET Adres='Ankara' WHERE KullaniciID=26;)
• DELETE (ör: DELETE FROM Kullanici WHERE KullaniciID=999;)
268. SQL Injection Saldırıları
SINIF TARTIŞMASI
• Bir pentest uzmanı SQL'i neden iyi bilmelidir (veya
gerektiğinde hızlıca hatırlayabilmelidir)?
269. SQL Injection Saldırıları
SELECT İfadesi
SELECT kolon adları FROM tablo_adı WHERE kolon_adı operatör değer;
ör: SELECT no, password FROM kullanicilar WHERE no = '5550000001';
WHERE koşul örnekleri:
WHERE kolon_adı LIKE pattern (ör: WHERE no LIKE '555%')
WHERE kolon_adı IN (değer1,değer2,...) (ör: WHERE no IN ('5550000001', '5550000002'))
WHERE kolon_adı BETWEEN değer1 ANDdeğer2; (ör WHERE no BETWEEN '5550000001' AND'5550000999')
WHERE koşul örnekleri
270. (Birden fazla tablodan bilgi çekme) JOIN örnekleri:
SELECT kolon adları
FROM tablo1
INNER JOIN tablo2
ON tablo1.kolon_adı=tablo2.kolon_adı;
Örnek ("alias" kullanımı ile birlikte):
SELECT T1.Ad, T2.HesapNo
FROM Musteri T1
INNER JOIN Hesap T2
ON T1.MusteriNo=T2.MusteriNo;
SQL Injection Saldırıları
SELECT İfadesi
(Birden fazla tablodan bilgi çekme) JOIN örneği:
Örnek ("alias" kullanımı ile birlikte):
271. SQL Injection Saldırıları
SELECT İfadesi
(Aggregate) FonksiyonKullanım örnekleri:
SELECT COUNT(*) FROM tablo adı;
SELECT kolon_adı, aggregate_fonksiyon(kolon_adı)
FROM tablo_adı
WHERE kolon_adı operatör değer
GROUP BY kolon_adı;
Örnek:
SELECT MusteriNo, COUNT(HesapNo) AS Hesap_Sayisi
FROM Hesap
WHERE HesapTipi='VadesizMevduat'
GROUP BY MusteriNo
(Aggregate) Fonksiyon Kullanım örnekleri:
Örnek:
272. SQL Injection Saldırıları
SELECT İfadesi
HAVING koşulu:Aggregatefonksiyonlar ile birlikteWHERE koşulu kullanılamadığındanSQL dilineHAVING koşulu eklenmiştir.
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_nameoperator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
Örnek:
SELECT MusteriNo, COUNT(HesapNo) AS Hesap_Sayisi
FROM Hesap
WHERE HesapTipi='VadesizMevduat'
GROUP BY MusteriNo
HAVING COUNT(HesapNo) >3;
HAVING koşulu:
Aggregate fonksiyonlar ile birlikte WHERE koşulu
kullanılamadığından SQL diline HAVING koşulu eklenmiştir.
Örnek:
273. Payload: 1 OR 1=1#
SQL Injection Saldırıları
SQL Injection'a giriş
SQL Injection'a giriş
SELECT * FROM fatura_detay WHERE fatura_id=$id
Payload: 1 OR 1=1#
SELECT * FROM fatura_detay WHERE fatura_id=1 OR 1=1#
(tüm faturaları gösterir)
ya da girdi tipi string ise
"SELECT * FROM fatura_detay WHERE fatura_id='".$id."'"
Payload: 1' OR 1=1#
SELECT * FROM fatura_detay WHERE fatura_id='1' OR 1=1#
Tüm faturaları
gösterir
ya da girdi tipi string ise
Payload: 1' OR 1=1#
274. SQL Injection Saldırıları
UNION ve SQL injection açısından önemi
UNION ve SQL injection açısından önemi
Bilgi çekmek istediğimiz farklı bir tablo varsa UNION ifadesi bize yardımcı olabilir
SELECT kolon adları FROM tablo1
UNION ALL
SELECT kolon adları FROM tablo2;
Ön koşullar:
Diğer tablo ve alan adlarının bilinmesi
UNION yapılacak bir önceki SELECT ifadesindeki kolon adları ile bilgi çekeceğimiz tablonun alan veri tiplerinin uyuşması
Bilgi çekmek istediğimiz farklı bir tablo varsa UNION ifadesi bize
yardımcı olabilir.
Ön Koşullar:
• Diğer tablo ve alan adlarının bilinmesi
• UNION yapılacak bir önceki SELECT ifadesindeki kolon adları
ile bilgi çekeceğimiz tablonun alan veri tiplerinin uyuşması
275. SQL Injection Saldırıları
UNION ve SQL injection açısından önemi
UNION ile kolon sayısı bulma yöntemleri (hata almayıncaya dek)
' UNION SELECT NULL--
' UNION SELECT NULL, NULL--
' UNION SELECT NULL, NULL, NULL--
String veri tiplerini tespit etmek için
' UNION SELECT 'a', NULL, NULL--
' UNION SELECT NULL, 'a', NULL--
' UNION SELECT NULL, NULL, 'a'--
Not: Oracle veritabanlarında FROM deyimi bulunmak zorunda olduğundan mutlaka bu deyim kullanılmalıdır. Bununiçin ' UNION SELECT NULL FROM DUAL-- kullanılabilir.
Not: Genelliklenumerik değerler string değerler olarak değerlendirilebilir. Ancak tam tersi mümkündeğildir. Bu nedenlekolon sayısını bulurken şu ifadeyi dekullanabilirdik:
' UNION SELECT 1, 1, 1--
UNION ile kolon sayısı bulma yöntemleri (hata almayıncaya dek)
String veri tiplerini tespit etmek için
Not-1: Oracle veritabanlarında FROM deyimi bulunmak zorunda olduğundan mutlaka bu deyim
kullanılmalıdır. Bunun için ' UNION SELECT NULL FROM DUAL-- kullanılabilir.
Not-2: Genellikle numerik değerler string değerler olarak değerlendirilebilir. Ancak tam tersi
mümkün değildir. Bu nedenle kolon sayısını bulurken şu ifadeyi de kullanabilirdik:
' UNION SELECT 1, 1, 1--
276. SQL Injection Saldırıları
UNION ve SQL injection açısından önemi
Kolon sayısını öğrenmenin bir başka yolu da ORDER BY deyiminin kullanılmasıdır
ORDER BY 1--
ORDER BY 2--
ORDER BY N-- ta ki hata alıncaya kadar. Hata alınan ilk rakam kolon sayısının aşıldığı anlamına gelir.
Kolon sayısını öğrenmenin bir başka yolu da ORDER BY deyiminin
kullanılmasıdır.
ta ki hata alıncaya kadar. Hata alınan ilk rakam kolon sayısının
aşıldığı anlamına gelir.
277. SQL Injection Saldırıları
MSSQL ODBC Hataları Sayesinde Injection Yaptığımız
SELECT Cümle Yapısını Öğrenme İmkanları
MSSQL, Oracle ve MySQL veritabanları arasında hata mesajları
zenginliği açısından (genel olarak) en kötüsü MySQL, en iyisi ise
MSSQL'dir.
MSSQL Server'ın ODBC hata mesajları HAVING ve GROUP BY
deyimleri kullanılarak tablo ismi ve kolon isimlerinin bulunması
için kullanılabilir.
278. SQL Injection Saldırıları
MSSQL ODBC Hataları Sayesinde Injection Yaptığımız
SELECT Cümle Yapısını Öğrenme İmkanları
ta ki hata oluşmayıncaya kadar.
HAVING deyimi GROUP BY deyimi ile birlikte kullanılır. Eğer
HAVING deyimi kullanılıyorsa aggregate fonksiyon olsun veya
olmasın aggregate fonksiyona konu olmayan tüm alanlar GROUP
BY deyimi ile belirtilmelidir.
279. SQL Injection Saldırıları
SINIF TARTIŞMASI
• SQL injection açıklığı tespit ettiğimizde
hedefimizdeki veritabanı sunucusunu ve
versiyonunu neden tespit etmek isteyebiliriz?
280. SQL Injection Saldırıları
Veritabanı Sunucusunu Tespit Etme Yöntemleri
String veri tipinde girdi alan bir parametre için concatenation
(birleştirme) yöntemleri'nden faydalanarak:
• MSSQL: 'bt'+'risk'
• MySQL: 'bt' 'risk' (arada boşluk karakteri ile)
• Oracle: 'bt'||'risk'
Numerik veri tipinde girdi alan bir parametre için veritabanına
özel fonksiyon kullanarak:
• MSSQL: @@PACK_RECEIVED-@@PACK_RECEIVED
• MySQL: CONNECTION_ID()-CONNECTION_ID()
• Oracle: BITAND(1,1)-BITAND(1,1)
281. SQL Injection Saldırıları
Veritabanı Sunucusunu Tespit Etme Yöntemleri
Olağan şüpheliler:
• PHP uygulamaları genelde MySQL kullanır
• Java uygulamaları genelde MySQL veya Oracle kullanır
• ASP.NET uygulamaları genelde MSSQL kullanır
282. SQL Injection Saldırıları
SQL injection için önemli SQL kural bilgileri
Aynı satırda birden fazla SQL komutu gönderebilme
• MSSQL ";" ile ayrılmış komutlar
• MySQL ";" ancak mysqli() nesnesi ve bu nesnesi multi_query fonksiyonu
ile (mysqli PHP uzantısı MySQL 4.1.3 ve sonraki versiyonlarla gelen
imkanlardan faydalanmak için geliştirilmiş ve PHP versiyon 5 ve sonrasında
yer almaktadır).
Sorgunun geri kalanını yorum haline getirebilme
• MSSQL: "--" çift çizgi
• MySQL: "#" ve "-- " karakterleri (çift çizgiden sonra en az bir boşluk
olması önemlidir, aksi takdirde hata oluşmaktadır. Örneğin gerek olmadığı
halde SQL cümlesinin sonundaki bir parametreye injection yaparken --
kullanırsanız bu karakterlerden sonra boşluk oluşmamakta ve hata
oluşmaktadır.)
283. SQL Injection Saldırıları
Veri Sızdırma Öncesi Veritabanı Yapısını Öğrenme
(Ör: MySQL veritabanı için)
Veritabanı isimlerini elde etmek için
SELECT schema_name FROM information_schema.schemata
Tablo isimlerini elde etmek için
SELECT table_name FROM information_schema.tables WHERE table_schema = 'database_adı'
Alan (kolon) isimlerini elde etmek için
SELECT column_name FROM information_schema.columns WHERE table_name = 'tablo_adı'
Veritabanı isimlerini elde etmek için
Tablo isimlerini elde etmek için
Alan (kolon) isimlerini elde etmek için
285. SQL Injection Saldırıları
UNION SQL Injection Örneği
"'" karakteri hata
alınmasına neden oldu
Hata mesajlarından
bunun bir veritabanı hatası
olduğunu anlayabiliyoruz
286. SQL Injection Saldırıları
UNION SQL Injection Örneği
"id" parametresi
string tipinde
olmayabilir, numerik
bir payload deneyelim
287. SQL Injection Saldırıları
UNION SQL Injection Örneği
Bu sorgu için tüm
verilere eriştik.
Bir sonraki adımımız
farklı tablolardan veri
çekmek olacak
288. SQL Injection Saldırıları
UNION SQL Injection Örneği
SELECT cümlesindeki
Alan sayısını bulmak için
hem numerik hem de alfabetik
veri tipleri ile uyumlu NULL
değerini kullanıyoruz
289. SQL Injection Saldırıları
UNION SQL Injection Örneği
Alttaki tabloya
veri sağlayan sorgunun
5 alan döndürdüğünü
anlamış olduk
291. SQL Injection Saldırıları
UNION SQL Injection Örneği
Öncelikle veritabanı
isimlerine ulaşmaya
çalışıyoruz.
Birinci alanda dönen
verilerin uygulama geliştirici
tarafından kullanılmadığı
anlaşılıyor.
292. SQL Injection Saldırıları
UNION SQL Injection Örneği
3. alan "Tutar"
bölümünde göründü.
Bu listeden hedef
veritabanımızın
"btrmobile" olduğunu
tahmin edebiliriz.
293. SQL Injection Saldırıları
UNION SQL Injection Örneği
Daha rahat görüntüleme
amacıyla son alanı
kullandık.
Burada "btrmobile"
veritabanındaki tablo
isimlerini elde ediyoruz.
Kullanıcılar
tablosu ilginç
görünüyor
294. SQL Injection Saldırıları
UNION SQL Injection Örneği
"kullanicilar" tablosunun
alanlarını listeliyoruz.
"id" veya "no" alanları
kullanıcı kodu olarak
kullanılıyor olabilir. Biz no
alanının kullanıldığını
biliyoruz. "no" ve "password"
alanlarını elde etmeye
çalışacağız.
297. SQL Injection Saldırıları
SQL Injection için Araç Kullanım Örneği
Injection yapılacak olan
parametrenin id
parametresi olduğunu
belirtiyoruz.
Geçerli bir oturum
üzerinden injection
yapabilmek için oturum
cookie değerini
belirtiyoruz.
Sqlmap'in shell
imkanından faydalanmak
istiyoruz.
298. SQL Injection Saldırıları
SQL Injection için Araç Kullanım Örneği
Veritabanı heuristic olarak
MySQL olarak tahmin etti.
Detaylı testleri atlıyoruz.
299. SQL Injection Saldırıları
SQL Injection için Araç Kullanım Örneği
BOOLEAN (veya
CONTENT) BASED Blind
Injection yöntemini
(daha sonra
bahsedeceğiz) başarı ile
uyguladı.
300. SQL Injection Saldırıları
SQL Injection için Araç Kullanım Örneği
UNION yöntemi ile SQL
injection'ı yapamadı.
Bunun sebebi sayfada 2
tablo olması olmalı.
Bunlardan birisinde hata
ortadan kalktığında
diğerinde oluşuyordu.
TIME BASED
Blind Injection
yöntemini de
(daha sonra
bahsedeceğiz)
başarı ile
uyguladı.
301. SQL Injection Saldırıları
SQL Injection için Araç Kullanım Örneği
Uygulayabildiği 2 injection
yöntemini özetliyor.
Shell'imizi
aldık.
302. SQL Injection Saldırıları
SQL Injection için Araç Kullanım Örneği
Blind SQL Injection
yöntemi ile veritabanı
ismimizi çekebildik.
304. SQL Injection Saldırıları
Güçlü Veritabanı Fonksiyonlarına Örnekler
MSSQL
• Registery fonksiyonları (xp_regread, xp_regwrite,..)
• Servis başlatma ve kapatma (xp_servicecontrol)
• Komut işletme (xp_cmdshell - SQL Server 2005'ten bu yana ön tanımlı
olarak aktif değildir)
• Veritabanını kapatma (shutdown)
• Kullanıcı ekleme (sp_addlogin)
MySQL
• Dosya okuma (load_file('/etc/passwd') dosya içeriğini string olarak
döndürür)
• Dosya yazma (select * from kullanici into outfile
C:wampwwwkullanici.txt)
305. SQL Injection Saldırıları
Diğer Sunuculara Erişim veya Veri Aktarım
Fonksiyonlarına Örnekler
MSSQL
• OPENROWSET (çok eski MSSQL Server versiyonlarında (MSSQL Server
2000 ve daha öncesi) farklı bir sunucuya veri göndermek için
kullanılıyordu)
Oracle
• UTL_HTTP paketi ve içindeki fonksiyonlar (ör: UTL_HTTP.request()),
UTL_TCP, UTL_SMTP, UTL_FILE ve diğer paketler
MySQL
• SELECT ... INTO OUTFILE komutu (outfile bir ağ paylaşımında olabilir)
306. SQL Injection Saldırıları
SINIF TARTIŞMASI
• SELECT dışındaki deyimlere başarılı biçimde SQL
injection yapılabilir mi, yapılabilirse hangi amaçlara
ulaşılabilir?
307. SQL Injection Saldırıları
SINIF TARTIŞMASI
• Yukarıdaki SQL cümlesine belirtilen alanda injection
yapılabilmesi için cümle yapısında neye dikkat
etmemiz gerekir?
308. SQL Injection Saldırıları
Blind SQL Injection (Content-Based)
Yöntem: SQL Injection açıklığı UNION tekniği ile farklı tablolardan veri sızdırmamıza
imkan vermiyorsa, ancak injection'ı yaptığımız noktada AND operatörü sonrasında
oluşturacağımız TRUE ve FALSE koşullarına karşı farklı yanıtlar üretiyorsa, o halde bir
şansımız daha var demektir.
Olumsuz Tarafı: UNION tabanlı veya doğrudan yanıt doğuran yöntemlere nazaran çok
daha fazla sayıda istek göndermemiz gerekecektir.
Örnek: Blind SQL Injection yönteminde genellikle veriler harf harf belirlenir ve her bir
harfin değerini bulmak için binary search yöntemi kullanılır. Örneğin 0-100 arasında
bulunması gereken 83 değerini bulmak için önce değerin 50'den büyük olup
olmadığını sorgularsınız, eğer büyükse bu sefer 75'ten büyük olup olmadığını
sorgularsınız, bundan da büyükse 88'den büyük olup olmadığını sorgularsınız. Bu
sayıdan büyük olmadığı için bu defa 75 ve 88 sayılarının ortasında bulunan 81'den
büyük olup olmadığını sorgularsınız ve bu sayı bulununcaya kadar devam eder.
309. SQL Injection Saldırıları
Blind SQL Injection (Content-Based)
Örnek (MySQL'e özel):
http://www.site.com/news.php?id=5 and
ascii(substring((SELECT concat(username,0x3a,password) from
users limit 0,1),1,1))>80
Koşul: "users" tablosunun ilk kaydından başlayarak bir kayıt al,
bunun birinci karakterinden başlayarak bir karakterini ASCII
değerine çevir ve 80'den büyük olup olmadığına bak.
310. SQL Injection Saldırıları
Blind SQL Injection (Time-Based)
Yöntem: Eğer SQL injection yapabilmemize ve TRUE ve FALSE koşullar
oluşturabilmemize rağmen yanıtlarda bir farklılık gözlenmiyorsa o zaman TRUE veya
FALSE koşullar oluştuğunda yanıtın dönme hızını etkileyerek yine veri sızdırma
şansımız olabilir.
Olumsuz Tarafı: Hem çok sayıda istek göndermemiz hem de zaman farkına dayanan
bir yöntem olduğu için çok daha fazla süre beklememiz gerekecektir.
Örnek: Time based SQL injection yönteminde sonucun hata doğurup doğurmadığı
önemli değildir, ancak belli bir koşul gerçekleştiğinde sunucunun daha geç yanıt
vermesine dayanarak veriler tahmin edilir.
311. SQL Injection Saldırıları
Blind SQL Injection (Time-Based)
Örnek (MySQL'e özel):
http://www.site.com/news.php?id=5 and
1=IF(ascii(substring((SELECT concat(username,0x3a,password)
from users limit 0,1),1,1))>80, sleep(15),1)
312. SQL Injection Saldırıları
Blind SQL Injection (Time-Based)
Veritabanı sunucularının TIME-BASED BLIND SQL INJECTION
saldırılarında kullanılabilecek fonksiyonlarına örnekler:
MSSQL
• WAITFOR DELAY '0:0:10' (10 sn. bekle)
MySQL
• sleep(5000) (sleep fonksiyonu MySQL 5.0.12 ve sonraki
versiyonlarında kullanılabilir, 5.000 milisaniye bekle anlamına
gelir)
• benchmark(50000, SHA1('test')) (50.000 defa 'test' verisinin
SHA1 hash değerini hesapla, bunun dışında CPU zamanını
alabilecek farklı MySQL fonksiyonları da bulunmaktadır)
313. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
[Fatura Ödeme / Numara ile Ödeme] fonksiyonu ("numara" parametresi)
Numara alanına
"'" işareti
gönderiyoruz.
314. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
Hatalı bir durum oluştu, ancak
uygulama hatayı ele aldı. SQL
Injection olma ihtimali yüksek,
ancak hata mesajı olmadığı için
farklı bir neden de olabilir.
315. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
Manuel olarak yaptığımız denemeler
sonucunda numara parametresinin string
veri tipinde olduğunu tespit ettik.
Ayrıca geçerli bir telefon numarası
girilmemesi halinde gelen yanıtlar her
durumda boş olmaktadır.
Son olarak hedeflediğimiz veritabanı MySQL
olduğundan eğer sondaki iki çizgiden sonra
bir boşluk karakteri konulmazsa hata
oluşmaktadır.
316. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
Comment işlemi için # kullandığımızda da
sonuç alınmaktadır.
317. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
FALSE durumu oluştuğunda dönen içerik
değişmektedir. Aradaki bu farkı blind
injection amaçlı olarak kullanabiliriz.
318. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
Bu noktadan sonra kullanım kolaylığı
açısından Burp ile ilerleyeceğiz.
İlk testimizde database() fonksiyonunun
döndürdüğü değerin ilk karakterinin "a"
(ASCII 97) olup olmadığını test ediyoruz.
Dönen yanıt FALSE durumunda oluşan yanıt
olduğundan ilk karakterin "a" olmadığı
sonucuna varabiliriz.
319. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
Bu defa "b" (ASCII 98) karakterinin doğru
olup olmadığını test ediyoruz ve dönen
yanıt TRUE koşulunda gözlediğimiz yanıt
olduğu için database() fonksiyonunun
döndürdüğü ilk karakterin "b" olduğunu
söyleyebiliriz.
320. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
Veritabanının adının "btrmobile" olduğunu
bildiğimiz için ikinci karakterin "t" (ASCII
116) olup olmadığını test ediyoruz ve
olduğunu görüyoruz. Normalde bu sürecin
binary test süreci ile çok daha uzun sürmesi
lazım.
Bu işlem için bir araç kullanım ihtiyacı
ortada.
321. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
sqlmap.py ile deneme
Önceki sqlmap denememizden
farklı olarak bir POST isteği
üzerinde çalıştığımız için "—
data" switch'ini kullanıyoruz.
"numara" parametresine
doğru ve yanlış sorguları ayırt
etmemize imkan vermeyen
(yani geçerli olmayan) bir
telefon numarası yazdığımızı
not edin.
322. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
Sqlmap geçerli bir telefon numarası tahmin
edemeyeceği için "numara" parametresinin
injectable olduğundan emin olamadı.
323. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
"numara" parametresine bu
defa geçerli bir numara
yazarak denememizi yapalım.
324. SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
Sqlmap geçerli bir telefon numarası
verildiğinde time based blind SQL injection
yöntemi ile başarıya ulaştı.
326. SOAP Injection Saldırıları
Simple Object Access Protocol (SOAP)
Test yöntemi:
Girdi alanlarına "</test>" veya benzeri bir girdi
gönderildiğinde uygulama hata üretirse uygulamanın
girdiyi bir SOAP mesajı içinde kullanma ihtimali
bulunduğunu söyleyebiliriz.
327. XPATH Injection Saldırıları
XML Path Language (XPATH)
XPATH XML dokümanları içinden veri çekmek için kullanılan bir
dildir.
XML dokümanlar veri saklamak için ilk tercihlerden olmasa da
konfigürasyon verisi gibi verilerin saklanması için kullanılabilir.
328. XPATH Injection Saldırıları
XML Path Language (XPATH)
XPATH Sorgu Örneği:
• //adres/eposta/text()
• //adres[ad/text()='Mehmet']
Test Yöntemi:
SQL injection'a benzer şekilde "'" işareti hata doğurursa
XPATH injection ihtimali doğabilir. Bunun dışında "[",
"]", "(", ")", "/" gibi XPATH için özel karakterler de
kullanılabilir.
329. LDAP Injection Saldırıları
Lightweight Directory Access Protocol (LDAP)
LDAP Sorgularına Örnekler:
• (|(cn=arama_terimi) (sn=arama_terimi)
(ou=arama_terimi))
• (&(kullanici_adi=5550000002) (parola=par0la))
Test Yöntemi:
LDAP sorgularında özel karakterler fuzzing testlerinde
kullanılabilir: ( ) ; , * | & =
Çok sayıda parantez işareti LDAP sorgusuna müdahale
edebilmek için kullanılabilir "))))))))"