Sayfayı Yazdır | Pencereyi Kapat

Cross-Site Request Forgery XSRF CSRF

Nereden Yazdırıldığı: Bilginin Adresi
Kategori: Bilgisayar Güvenliði / Computer Security
Forum Adı: Güvenlik / Security Makaleleri
Forum Tanımlaması: Bilgisayarýnýzý Her Türlü Saldýrýya Karþý Korumak Ýçin Yapmanýz Gerekenler
URL: https://www.bilgineferi.com/forum/forum_posts.asp?TID=7951
Tarih: 07-07-2024 Saat 05:55


Konu: Cross-Site Request Forgery XSRF CSRF
Mesajı Yazan: megabros
Konu: Cross-Site Request Forgery XSRF CSRF
Mesaj Tarihi: 23-08-2009 Saat 22:48

XSS’i (Cross Site Scripting), web tarayýcýsý gibi bir istemcinin bir web uygulamasýna güveninden yararlanmak olarak düþünebiliriz. Peki bir uygulamanýn bir kullanýcýya olan güveni de exploit edilebilir mi? Cross-Site Request Forgery (XSRF veya CSRF) bir web uygulamasýnýn bir kullanýcýya uyguladýðý güveni kullanarak tamamen legal (aslýnda bir anlamda zaten öyleler) görünen kimlik doðrulamasý yapýlmýþ istekler yapýlmasý iþlemidir. Tehlikesi açýkça ortadadýr. XSRF kullanýcýlarýn banka hesaplarýndan para transfer istekleri yapmaya zorlamada, kullanýcý bilgisi sýfýrlamada, kötü amaçlý epostalar göndermede kullanýlabilir. Maalesef, XSRF açýklarý için kolay bir çözüm yok. Ve bu açýklar olduðunda, çok sayýda oluyorlar. Bu dokümanýn amacý hem uygulama geliþtiriclerini hemde güvenlik uzmanlarýný bu tip saldýrýlar konusunda eðitmek ve açýklarýn nasýl kapatýlacaðý konusunda tavsiyeler sunmaktýr.

XSRF nedir?

XSRF’nin en basit tanýmý bir saldýrganýn, bir web sitesine, sitenin güvendiði bir kullanýcýdan yetkisiz komutlar göndermesidir. Bu tip saldýrýlara genelde “session riding” veya “hostile linking” saldýrýlarý adý verilir çünkü sunucu ile halihazýrda oturum açmýþ olan kullanýcýlarý kullanýr. XSRF saldýrý için web tarayýcýsýný kullanýr ve kullanýcýnýn yeni kullanmýþ olduðu varsayýlan bir siteye baðlantý kuran bir script veya link içerir.


Sonrasýnda script görünüþte yetkili fakat kötü amaçlý iþlemleri kullanýcý adýna gerçekleþtirir. Kimlik doðrulamasý yapýlmýþ kullanýcýlarýn spesifik iþlemleri onaylamalarýný gerektirmeyen web uygulamalarý XSRF saldýrýlarýndan etkilenebilir. Müþterilerinin tekrar kimlik doðrulamasý iþlemi yapmadan “hýzlý” satýn alma iþlemi yapmalarýna izin veren bir alýþveriþ sitesi düþünün. Veya MyFriends hesabýna login olmuþ bir kullanýcý düþünün. Ayný browser’ý kullanarak, MyFriends’den ayrýlýr ve tarayýcýsýnýn MyFriends sitesindeki AddToFriendList.cgi?friend=evildude sayfasýna istek yapmasýný saðlayan baþka bir siteye girer. Farkýnda olmadan, ve izni olmadan, ziyaret ettiði web sitesi, onun MyFriends sitesinde arkadaþ listesine evildude isimli birisini eklemesine yol açtý.

Exploit

XSRF’den baþarýlý olarak yararlanabilmek için, saldýrganýn yardýmcý bir sistem kullanmasý gerekmektedir. Yardýmcý sistem, web tarayýcýnýza takip etmesi için XSRF linkini veren yerdir. Bir sistem hem kurban hem de yardýmcý olabilir fakat önce web tarayýcýsýnýn alýp çalýþtýrabileceði birþeyler gönderilmesine (resim, script veya link) izin vermesi gerekir. Kýsaca, yardýmcý sitenin link gönderilmesine izin vermesi gerekir. Resim kullanýlan XSRF saldýrýlarý genelde kullanýcýlarýn resim göndermesine izin veren fakat JavaScript’e izin vermeyen Internet forum’larýndan yapýlýr. Örneðin, saldýrgan bir foruma aþaðýdaki tag’lere sahip bir resim ekleme yapabilir:


<img src=”http://www.mybank.tld/MoneyTransfer.cgi?AccountFrom
=1234&AccountTo=4321&DollarAmount=10000″>

Eðer kullanýcýnýn bankaya logini aktifse ve web tarayýcýsý forumda bu resime istek yaparsa, kötü amaçlý kiþinin hesabýna 10,000 dolarlýk transfer isteði http://www.mybank.tld/ - www.mybank.tld sitesine gönderilir. Aþaðýdaki grafik bu durumu göstermektedir:
<!--[if !supportLineBreakNewLine]-->

<!--[if gte mso 9]> Normal 0 21 MicrosoftInternetExplorer4 <![endif]-->
Hedef ek kimlik doðrulamasý gerektirmeden kullanýcý iþlemlerine izin veren uygulamadýr.

Web tarayýcý yardýmcý sitedeki kaynaða istek yaptýðýnda neler olur? Önceki kod örneðimizdeki image tag örneðini kullanalým. Sayfaya istek yapýldýðýnda, tarayýcý sayfada resim olduðunu bilmez. Dönülen cevaptaki HTML parse edildiðinde tarayýcý sayfada bir resim olduðunu bilir. Bu noktada, resim standart bir GET isteiði ile istenir. Problem burada yatmaktadýr. Hedef site iþ iþten geçene kadar (ör. istek yapýldýktan sonra) isteðin bir resim için mi yoksa farklý bir kaynak içinmi olduðunu bilemez.

Bu konuyu açýklamada baþka bir örnek daha verelim. Hayali bir e-ticaret sitesi düþünelim, spistore.com. Bir kullanýcý alýþveriþ sepetine bir ürün eklemek istediðinde, web tarayýcýsý

http://spistore.com/add - http://spistore.com/add

ToCart?item=5658 isteðini yapar ve buradaki 5658 eklemek istedikleri ürün id’si. Spistore.com ürünü kimin sepetine ekleyeceðini bilir çünkü tarayýcý kullanýcýnýn çerez bilgisini de ürün ekleme isteði ile birlikte gönderir. Þimdi bir forum sitesi düþünelim, spiforum.com. Kötü amaçlý bir kullanýcý foruma
<img src=”http://spistore.com/addToCart?item=5658”>
yazýsýný içeren bir mesaj gönderir. Bu mesajý birisi görüntülediðinde, kötü amaçlý img tag’ini içeren HTML, tarayýcýlarý tarafýndan yorumlanýr. Tarayýcý img’yi gördüðünde

http://spistore.com/addToCart?item=5658 - http://spistore.com/addToCart?item=5658

URL’sine istek yapar. spiforum.com’daki bu mesajý okuyan ve spistore.com da oturumu açýk olan tüm kullanýcýlarýn alýþ veriþ sepetine 5658 nolu ürün eklenmiþ olur.

XSRF ve XSS


XSRF ve XSS birbiri ile iliþkili açýklardýr ve uygulamanýzý hangilerinin etkilediðini belirlemek zor olabilir. Eðer bir uygulama XSS den etkileniyorsa, ayný zamanda XSRF’den de etkileniyordur çünkü XSRF bir XSS açýðýný kullanabilir. Fakat XSRF’ten etkileniyor olan bir uygulama XSS den etkilenmiyor olabilir. Aþaðýdaki grafikte de görülebileceði gibi, XSS’i XSRF’nin bir alt kümesi olarak düþünebilirsiniz:


<!--[if !supportLineBreakNewLine]-->

<!--[if gte mso 9]> Normal 0 21 MicrosoftInternetExplorer4 <![endif]-->


Bu iki saldýrý þeklindeki ana fark saldýrýnýn nasýl yapýldýðýdýr. XSS giriþ doðrulamayý atlatma ile ve bir sayfaya direk olarak kod enjekte etme ile yapýlýr. XSRF zaten orada olaný kötüye kullanmak için yapýlýr..izin verilen sayfa elementlerini, CGI’larý direk olarak ek kimlik doðrulamasý gerekmeden çalýþtýrarak.

XSS ve XSRF’deki esas problem XSS’in, XSRF açýklarýnýn riskini artýrmasýdýr. Birlikte kullanýldýðýnda birbirlerini çok iyi tamamlarlar. En büyük risk, birleþtirildiklerinde, tarayýcý farklý web sitelerine gidebilir, tek bir siteyle sýnýrlý kalmaz. XSRF tek baþýna saldýrganýn HTTP cevabýný okuyabilmesine izin vermediði için saldýrýnýn baþarýlý olup olmadýðý bilinemez. Fakat, XSS ile birleþtirildiðinde, saldýrgan sonuçlarý kendi seçtiði bir yere yönlendirebilir ve saldýrýnýn baþarýlý olup olmadýðýný anýnda görebilir.

Önleme

XSRF’i fixlemek XSS’i, hatta SQL Injection http://www.olympos.org/glossary/term/563 - i ‘ý fixlemekten daha zor olabilir. Çünkü kötü amaçlý isteði kurban gönderdiðinde, isteðin saldýrý olup olmadýðýný anlamak zor olabilir. XSRF için alýnan önlemler, eðer XSS açýklarý varsa etkisiz olabilir. XSRF’i engellemek demek ayný zamanda XSS saldýrýlarýný da engellemek demektir. Giriþ filtreleme XSRF saldýrýlarýný engellemese de XSS saldýrýlarýný önlemek için mutlaka yapýlmalýdýr. Giriþ filtreleme, kaynaðý neresi olursa olsun, uygulama tarafýndan kabul edilen verilere uygulanmalýdýr.

XSRF önleme genelde her web uygulamasý özelliðinin ve form’unun tekrar kodlanmasýný gerektirir. anti-XSRF token’larý kullanarak veya CAPTCHA implemente ederek XSRF saldýrýlarýný önleyebilirsiniz. Ýmplementasyonu daha kolay fakat çok etkili olmayan, yine de hiç olmamasýndan iyi, baþka metodlar da var. Birden fazla metodun kombinasyonunun kullanýlmasý genelde tavsiye edilmektedir. Aþaðýda her bir metod anlatýlmaktadýr:

Yardýmcý


Kullanýcý tarafýndan gelebilecek tüm giriþlerin filtrelenmesi gerekir. Bunun için aþaðýdakileri yapýn:

* Filtrelemede black list yerine white list metodunu kullanýn. White list metodu, kötü olan içerikleri bloklamak yerine iyi olan giriþleri kabul etme iþlemidir. Örneðin Türkiyedeki bir telefon numarasý her zaman (alan kodu ile birlikte) 10 rakam olmalýdýr; telefon numarasýna white list uygulamak demek sadece 10 ader rakam kabul etmek, baþka birþeyi kabul etmemek demektir.
* Kullanýcý tarafýndan saðlanan tüm verileri, tarayýcýlarýnýn yorumlayabileceði bir formatta gönderilmesini engelleyecek þekilde kodlayýn. Örneðin, küçüktür iþareti < &lt; olarak (veya URL’de %3c olarak) kodlanmalý.

* (programlama sitelerinden indirilen veya programlama örneklerinden alýnan) Üçüncü parti kodlarý kendi web uygulamanýzda (ne kadar güvenli olup olmadýðýný anlamadan) kullanmayýn.

Kurban

Anti_XSRF Nonce Token

XSRF’i önlemede hiçbir metod kesin deðil fakat anti_XSRF nonce token’larý kullanmak riskin büyük bir bölümünü yokeder. Teoride, geçerli bir token saldýrgan tarafýndan tahmin edilebilir, fakat bu gerçekte kolay bir iþlem deðildir. Dahasý, bu metod günümüzde XSRF saldýrýlarýný engellemede en etkili metoddur. Kullanýcý login olduktan sonra bir “giz” yaratarak kullanýcýnýn doðru olup olmadýðýný kontrol edebilirsiniz. Kullanýcý login olduktan sonra gizli bir hash veya token yaratýp sunucu-tarafý oturumunda depola ve bunu her link ve form’a dahil et. Birbirini takip eden her http isteði bunu içermeli, aksi takdirde kabul edilmemeli ve oturum geçersiz kýlýnmalý. Eðer XSS açýðý varsa “Giz” oturum id’si ile ayný olmamalý. Token’ý herhangi bir oturum deðiþkeni gibi oluþtur. Basit bir koþul ifadesi doðrulanabilir.

 
Ayrýca etkisini artýrmak için kýsa bir zaman dilimine kýsýtlanabilir. Bu deðiþiklik saldýrganýn XSRF saldýrýsýnda geçerli token kullanmasýný gerektirir. Kullanýcý token’ý oturumda depolandýðý için, saldýrganýn bu kurbanýna özel token’ý kullanmasý gerekecektir.
 

Bunu PHP’de yapýlýþý ile ilgili bir örnek verelim. Bu futbol maçý biletleri sipariþ edilebilen bir web uygulamasý örneði:

<?php
session_start();
$token = md5(uniqid(rand(),TRUE));
$_SESSION['token'] = $token;
$_SESSION['token_time'] = time();
?>
<form action=”purchase.php” method=”POST”>
<input type=”hidden” name=”token” value=”<?php echo $token; ?>” />
<p>
Item:
<select name=”item”>
<option name=”fieldlevel”>fieldlevel</option>
<option name=”upperdeck”>upperdeck</option>
</select><br/>
Number:<input type=”text” name=”number” /><br/>
<input type=”submit” value=”Purchase” />
</p>
</form>

Token herhangi bir oturum deðiþkeni gibi yaratýlmalý.
<?php
if (!isset($_SESSION['token']))
{
$_SESSION['token'] = md5(uniqid(rand(), TRUE));
}
?>

Token’ý basit bir koþul ifadesi ile kontrol edin:
<?php
if ($_POST['token'] == $_SESSION['token'])
{
/* Valid Token */
}
?>

Token’ýn geçerliliðini belirli bir zaman periyoduna kýsýtlamak, örneðin dört dakika, güvenliði artýracaktýr:
<?php
$token_age = time() – $_SESSION['token_time'];
if ($token_age <= 240)
{
/* Less than four minutes has passed. */
}
?>

CAPTCHA

CAPTCHA implemente etmekde XSRF saldýrýlarýný engelleyebilir. CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) basitçe kullanýcýnýn karýþýk fakat okunabilir harf (veya harf rakam kombinasyonu) içeren resimde gösterilenleri girmesini gerektirir. Burdaki fikir bilgisayarýn grafikte gizli olan kelimeyi bulamayacaðý ve insanlarýn kolaylýkla ayýrtedebileceðidir. CAPTCHA kullanýmý, kullanýcýnýn spesifik iþlemler öncesi resimdeki bilgiyi girmesi ile olur.

Ýþleme devam için otomatik bir script’in yaratýlmasý çok zor olsa  bunu aþma konusunda araþtýrmalar yapýlýyor. Eðer bu metodu kullanmaya karar verirseniz güçlü bir CAPTCHA kullanýn. Güçlü bir CAPTCHA inþa etmek zor olabilir. Ek olarak, resimlerin bilgisayar tarafýndan okunamadýðýna emin olmak için, geliþtiricilerin, CAPTCHA’nýn script seviyesinde atlatýlamayacaðýna emin olmasý gerekir. Ayný CAPTCHA birden fazla mý kullanýlýyor? uygulamanýn tekrar-oynatma (replay) saldýrýsýndan etkilenmesine yol açarmý? Ya da CAPTCHA ya geçirilen düz yazý cevap web formunun bir parçasýmý? Bunlar düþünülmesi gereken problemler.

Diðer Çözümler

Daha az zaman ve efor gerektiren (fakat daha az etkili olan) diðer çözümlere gelelim. Çoðunlukla gizleme ile güvenlik (security through obscurity) den oluþurlar. Bu da saldýrganýn açýktan yararlanmasýnda ek bilgi gerektirir. Fakat, tekrar uyaralým, uygulamanýz uzman bir saldýrgana bu þekilde karþý koyamaz.

Yönlendirme

XSRF saldýrýlarýný HTTP isteðinin yetkili bir kaynaktan gelip gelmediðini kontrol ederek ve yönlendirme kullanarak önleyebilirsiniz. Eðer Referer baþlýðý yoksa, veya iþlemi gerçekleþtirmesi gerekmeyen bir sayfa veya site içeriyorsa, yönlendirme kullanýcýyý baþka bir sayfaya yönlendirerek ek iþlem yapýlmasýný engelleyebilir.

<?php
if ($_SERVER['HTTP_REFERER'] != ‘http://www.victim.tld/transfer.html’ )
{
header(”Location:
http://www.victim.tld/transfer.html - http://www.victim.tld/transfer.html” );
exit;
}
?>

URL Rewrite

Form-tabanlý kimlik doprulama yaparken diðer bir opsiyon da cookie yerine URL rewrite (özellikle bu opsiyon uygulama sunucusu tarafýndan transparan olarak yapýlabiliyorsa) kullanýmýdýr. Oturum tanýmlayýcýsýný her URL’ye dahil edildiðinde, bu tanýmlayýcý arka arkaya yapýlan sayfa isteklerinde ayrýþtýrýlýp oturum bilgisini tanýmakta kullanýlabilir. Fakat çoðu uygulamada bunun uygulanabilmesi büyük bir çalýþma gerektirebilmektedir.

Get yerine Post kullanýmý

Uygulamanýn objeleri yaratma, deðiþtirme ve silme gibi durum deðiþiklikleri için GET yerine POST kullanýmýna zorlama yapýlabilir. Hem HTTP GET, hem de HTTP POST kullanan uygulamalar XSRF açýklarýndan etkilense de, HTTP GET kullanarak saldýrýyý gerçekleþtirmek çok daha kolaydýr. POST kullanýmý resim tag’leri örneðimizdeki saldýrýyý etkisiz kýlar ve uygulama içerisinde resim link’lerinin paylaþýlabilmesine izin verir. Ayrýca bunu implemente etmek çok kolaydýr. Ayrýca saldýrganlarýn baþka hedef aramasýna yol açacak kadar caydýrýcý olabilir. Fakat yine de çok bilgili bir saldýrgan JavaScript kullanarak POST isteklerinden de bu saldýrýlarý yapabilir.

Oturum tanýmlayýcýlarýnýn gizli form alanlarý olarak geçirmek

Formlarda hidden alanlarýnda oturum tanýmlayýcýlarýný kullanabilirsiniz. Bu bilgi web sayfasýnda görülmez fakat diðer alanlarla birlikte otomatik olarak gönderilir. Gizli form alanlarýnda oturum tanýmlayýcýlarýný geçirmek, bir sayfadan diðerine geçiþte resim linkleri yazý linkleri kullanýmýndan mahrum býrakýr, bu sebeple bu pek kullanýþlý deðil. Ayrýca HIDDEN form alaný deðeri web sayfasýnda görünmese de tarayýcýnýn kaynak görüntüleme seçeneði ile kolayca görülebilir. Bunun içinde gizli veri kriptolanarak sadece gerektiðinde dekriptolanabilir.

Saygýlar..

 




Sayfayı Yazdır | Pencereyi Kapat