<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>KnbykL Official Web Site &#124; Web Security, Web Application Security &#187; CSRF&#8217;den nasıl korunurum?</title>
	<atom:link href="http://www.knbykl.org/tag/csrfden-nasil-korunurum/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.knbykl.org</link>
	<description>Web Security, Articles and Application, Hacking Methods, SQL Injection, CSRF, XSRF and Server Security</description>
	<lastBuildDate>Wed, 23 Jun 2010 23:43:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Cross-Site Request Forgery Atağından Korunmanın Yolu</title>
		<link>http://www.knbykl.org/cross-site-request-forgery-atagindan-korunmanin-yolu/</link>
		<comments>http://www.knbykl.org/cross-site-request-forgery-atagindan-korunmanin-yolu/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 14:01:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Advisories]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Security]]></category>
		<category><![CDATA[Cross-Site Request Forgery Security]]></category>
		<category><![CDATA[Cross-Site Request Forgery'den nasıl korunurum?]]></category>
		<category><![CDATA[CSRF Patch]]></category>
		<category><![CDATA[CSRF'den nasıl korunurum?]]></category>
		<category><![CDATA[XSRF Patch]]></category>

		<guid isPermaLink="false">http://www.knbykl.org/?p=202</guid>
		<description><![CDATA[Şubatın 19&#8242;unda Mesut TIMUR tarafından yazılan bir makaleyi sizlerle paylaşmayı düşündüm, bu makaleyi okuyup anladığınızda Cross-Site Request Forgery atağından nasıl korunacağınızı da anlamış olacaksınız. Mesut Bey&#8217;e CSRF Güvenliği&#8217;ne verdiği destekten dolayı teşekkür etmemiz gerekir. CSRF, Cross-Site Request Forgery, web uygulamalarındaki çeşitli fonksiyonalitelerin mağdur kullanıcının bilgisi dahilinde olmadan onun  hak ve yetkileri ile saldırganlarca kullanılmasıdır. Bu [...]]]></description>
			<content:encoded><![CDATA[<p>Şubatın 19&#8242;unda <strong>Mesut TIMUR</strong> tarafından yazılan bir makaleyi sizlerle paylaşmayı düşündüm, bu makaleyi okuyup anladığınızda <span style="color: #99cc00;">Cross-Site Request Forgery</span> atağından nasıl korunacağınızı da anlamış olacaksınız. Mesut Bey&#8217;e CSRF Güvenliği&#8217;ne verdiği destekten dolayı teşekkür etmemiz gerekir.<br />
<img class="alignnone size-full wp-image-228" title="csrf-security-güvenlik-image-img" src="http://www.knbykl.org/wp-content/uploads/2009/06/csrf-security-güvenlik-image-img.jpg" alt="csrf-security-güvenlik-image-img" width="615" height="100" /><br />
<span id="more-202"></span></p>
<p>CSRF, Cross-Site Request Forgery, web uygulamalarındaki çeşitli fonksiyonalitelerin mağdur kullanıcının bilgisi dahilinde olmadan onun  hak ve yetkileri ile saldırganlarca kullanılmasıdır. Bu döküman, geliştiriciler için bir CSRF referansı olma amacı gütmekle beraber <strong>çok geç </strong>kaleme alınmıştır.</p>
<h2><strong>Problem Nerede Başlıyor ?</strong></h2>
<p>Problemin başlangıç noktası HTTP&#8217;nin <em>stateless</em> (durum bilgisinden yoksun) bir protokol olmasıdır. Ardı ardına yapılan HTTP istekleri ve cevapları sıra numarası taşımadıkları için, ilgili kişiler dışında başkaları tarafından da oluşturulabilmesi sebebiyle, kullanıcı ile web sunucu arasında başlamış iletişim, saldırganların kurban kullanıcılara yaptırdıkları isteklerle devam ettirilebiliyor. Paket içerisinde sıra numarası, token, anahtar gibi bir mekanizma olması halinde; bu bilgiler saldırganlarca ele geçirilemediği durumlarda, kurban adına istek yapılması mümkün olamayacaktır. Bilgi güvenliğinde bu konu &#8220;Confused Deputy&#8221; problemi olarak sınıflandırılmıştır [1]</p>
<h2><strong>Konunun Önemi </strong></h2>
<p>Bir saldırganın CSRF ile verebileceği zarar, ilgili zafiyetin bulunduğu web uygulamasının yetenekleri ile doğru orantılıdır. Bir elektronik posta hizmeti veren web servisinde ilgili zafiyet tespit edilirse saldırganın yapabileceği mağdur kullanıcının hesabıyla mail atmak olacaktır.</p>
<h1><strong>0&#215;01 : Zafiyetin İncelenmesi</strong></h1>
<h2>Senaryo</h2>
<p>Örneğin bir internet bankacılığı uygulamasında CSRF zafiyeti mevcut olsun. Mağdur kullanıcı, favori internet tarayıcısının bir tab&#8217;ında internet bankacılığı uygulamasını kullanırken, diğer tab&#8217;ında futbol maçları ile ilgili yorumların yapıldığı bir forumu takip etmektedir. Forumun yöneticisi, giriş sayfasına bir resim koymuştur, fakat resim bir sebepten dolayı görüntülenememektedir. Bunun üzerine sayfanın kaynak kodlarından, ilgili resmi ifade eden HTML kodlarına bakan mağdur kullanıcı, birden dehşete düşer.</p>
<p><span style="color: #ccffff;"><span style="color: #33cccc;"><span style="color: #00ccff;">&lt;<span style="color: #ffcc00;">img src</span>=</span>&#8220;</span><span style="color: #99cc00;">http://bank.example/withdraw?account=1&amp;amount=1000000&amp;for=forumadmin</span><span style="color: #00ccff;">&#8220;&gt;</span></span></p>
<p>Tarayıcının, bu resmi yüklemek için src etiketinde verilen adrese istek yapmasından başlayarak oluşan süreci inceleyelim.</p>
<p>1.  İnternet bankacılığı uygulamasına, Mağdur kullanıcının hesabından belli bir paranın saldırganın hesabına geçirilmesi şeklinde istek yapılır.<br />
2.  Eğer uygulamaya o an giriş yapılmış durumda ise, ya da uygulamanın &#8220;Beni Hatırla&#8221; gibi bir seçeneği işaretlenmişse, tarayıcı bu isteğin ardına , gerekli oturum (session) ya da çerez (cookie) bilgilerini ekleyecektir.<br />
3.  İstek internet bankacılığı uygulamasına gelecektir. Mantıklı bir uygulamanın burada yapması gereken istekle beraber gelen oturum ya da çerez bilgilerinin geçerli olup olmadığının kontrolü ardından isteğin yürütülmesidir.<br />
4.  Bir üst adımda problem olmadığı durumda, ilgili istek gerçekleşecek ve para transferi başarı ile sonuçlanacaktır.</p>
<p>Yasal bir şekilde kullanıcı tarafından yapılmış istek sol tarafta gösterilirken, bir CSRF saldırısının diyagramı sağdaki gibidir.</p>
<table style="height: 231px;" border="0" cellspacing="0" cellpadding="3" width="676">
<tbody>
<tr>
<td width="50%"><img class="alignnone size-full wp-image-212" title="d922dvw_21crjh3p6f_b" src="http://www.knbykl.org/wp-content/uploads/2009/06/d922dvw_21crjh3p6f_b.gif" alt="d922dvw_21crjh3p6f_b" width="329" height="222" /></td>
<td width="50%"><img class="alignnone size-full wp-image-213" title="d922dvw_20fn5tjcgv_b" src="http://www.knbykl.org/wp-content/uploads/2009/06/d922dvw_20fn5tjcgv_b.gif" alt="d922dvw_20fn5tjcgv_b" width="329" height="224" /></td>
</tr>
</tbody>
</table>
<h2>Problemin Analizi ve Çözüm Fikirleri</h2>
<p>Görüldüğü üzere kurban kullanıcının bilgisi dahilinde olmadan, onun yerine bir internet uygulaması saldırgan lehine kullanılmıştır. Burada problem kimden kaynaklanmaktadır ?</p>
<p>1. Mağdur Kullanıcı :<br />
İlgili kişinin, her girdiği web sayfasının HTML kodlarını inceleyip ondan sonra yüklemek gibi bir durumu olmadığından kurban kişinin yapabileceği pek bir şey bulunmamaktadır. &#8220;Beni Hatırla&#8221; opsiyonunu kullanmayarak ve kritik bir uygulamada gezerken, internetin geri kalanı ile ilgilenmeyerek bir miktar atak yüzeyini daraltabilir fakat bu önlemler pratik olarak çok uygulanabilir değildir.</p>
<p>2. Kurban Uygulama :<br />
İlgili uygulama, örneğimizdeki gibi oturum ve çerez bilgilerine güvenip çalışıyor ise bu zafiyete karşı korunmasız demektir. Saldırgan örnekte de gösterildiği gibi çok basit şekilde uygulamaya, mağdur kişiden geliyormuşcasına istekler gönderebilirler.</p>
<p>Zafiyet esas itibariyle kurban uygulamadan kaynaklandığı için yapılması gereken ilgili uygulamanın mağdur kişinin kendi bilgisi dışında yapılan istekleri kabul etmemektir. Peki gelen isteğin, kişinin kendisinin mi yaptığı, yoksa başka bir saldırgan tarafından mı tetiklendiği ne şekilde anlaşılabilir ?</p>
<p>Bu noktada yapılması gereken ile ilgili ipucu ilk bölümde verilmiştir. Temel sorun aslında HTTP&#8217;nin <em>stateless </em>bir protokol olması, ve bu durumun geliştirici tarafından giderilmesi gerekliliğidir. Yani tıpkı TCP/IP&#8217;de olduğu gibi giden gelen paketlere numaralar (sıra) verilmeli ve bu sayılar üçüncü şahıslar tarafından tahmin edilememelidir. [3]</p>
<h1><strong>0&#215;02 : Yetersiz Çözümler</strong></h1>
<p>Bu bölümde problem için çözüm olarak ilk akla gelen, fakat yetersiz olan çözüm yollarından bahsedilecektir. Bunlar tek başlarına çözüm olarak işe yaramazken, 0&#215;03 numaralı başlıktaki çözüm önerilerine eklenmeleri durumunda derinlemesine defans önlemi olarak işlev göreceklerdir.</p>
<h2><strong>Referer&#8217;i Kontrol Etmek</strong></h2>
<p>İstek, web uygulamasına ulaştıktan sonra HTTP başlık bilgilerinden &#8220;REFERER&#8221; bilgisine bakılarak nereden geldiği tespit edilebilir ve isteğin kullanıcıdan mı, yoksa saldırı yapmaya çalışan bir web uygulamasından mı geldiği anlaşılabilir. Fakat &#8220;REFERER&#8221; isimli HTTP başlık bilgisi, değiştirilebilir olduğu için bu bilgiye güvenilerek doğrulama yapılması büyük bir hata olacaktır. Ayrıca REFERER başlığını kimi vekil sunucular kesebilmektedir.</p>
<h2><strong>Kritik İşlemleri POST ile Yapmak</strong></h2>
<p>0&#215;01 no&#8217;lu başlığımızda incelenen atak GET dizisi içerisinde işlem tipi ve boyutları gönderilerek gerçekleştiriliyordu. Bundan dolayı bir image etiketinin kaynak bilgisine girilebilmiş, ve resmin görüntülenmesiyle atak gerçekleşmişti. Kritik işlemler ile ilgili bilgilerin taşınması sırasında POST kullanılırsa bu tip zafiyetlerden korunulabilirmiş gibi gelebilir, fakat çok basitçe bir form oluşturup, ilgili kullanıcı o sayfayı görüntüleyince ilgili form kaydettirilerek atak gerçekleştirilmesi mümkündür. Haricinde XMLHTTPRequest nesnesi ile de yapılabilir.</p>
<p>Basitçe şu şekilde yapılır:</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="100%"><span style="color: #00ccff;">&lt;script&gt;<br />
<span style="color: #99cc00;"><strong>var</strong> post_data = &#8216;name=value&#8217;;<br />
<strong>var</strong> xmlhttp=<strong>new</strong> XMLHttpRequest();<br />
xmlhttp.open(&#8220;POST&#8221;, &#8216;<span style="color: #ff9900;">http://url/path/file.ext</span>&#8216;, true);<br />
xmlhttp.onreadystatechange = <strong>function</strong> ()<br />
{<br />
<strong> if</strong> (xmlhttp.readyState == 4)<br />
{<br />
alert(xmlhttp.responseText);<br />
}<br />
};<br />
xmlhttp.send(post_data);</span><br />
&lt;/script&gt;</span></td>
</tr>
</tbody>
</table>
<h1>0&#215;03 : Zafiyetin Çözümü</h1>
<p>Zafiyetin çözümü ile ilgili fikirlere bir üst başlıkta değinilmişti. Bu bölümde reel çözüm önerileri ve zafiyetin platformlardaki durumu incelenecektir.</p>
<h2><strong>Platformların Durumu</strong></h2>
<p>ASP.net uygulamaları, ViewState mekanizması aktif durumdayken CSRF zafiyetine karşı korumalı durumdadırlar. Lakin bu mekanizma beraberinde bazı problemleri ve eksikleri bünyesinde barındırmaktadır.[2]      Her ASP.net sayfasında bu mekanizma aktif olmayabilir, ya da yanlışlıkla kapatmış olabilirsiniz. Sadece POST dizisi üzerinde koruma sağlar. GET dizisindeki parametreler, hala CSRF saldırılarına açıktır. ViewState her HTTP isteği için pakete eklediği veriler sebebiyle paket boyutunu arttıracak ve iletişimin hızını düşürecektir.          [3]ViewState, sonuç itibariyle istemci tarafından kontrol edilebileceği için her türlü manipülasyona açık durumdadır. Bundan dolayı ViewState MAC etkin durumda olmalıdır.<br />
Bunun dışında ViewState&#8217;lerin sadece belli bir kullanıcıya ait olduğunda geçerli olması için, <strong>OnInit()</strong> ya da <strong>Page_Init(</strong>) metotlarına aşağıdaki kod eklenmelidir.</p>
<p><strong>ViewStateUserKey = Session.SessionID;</strong></p>
<p>Ruby on Rails haricinde bu zafiyet ile ilgili olarak koruma ya da API sağlayan başka bir dil/framework bulunmamaktadır.[4]</p>
<h2>Temel Çözüm</h2>
<p>Zafiyetin çözülmesi için temek fikir şu şekildedir :</p>
<ol>
<li> Her yapılan isteğin sonucunda kullanıcıya bir adet rastgele değer gönderilmelidir.</li>
<li> Kullanıcı gönderilen sayfa üzerinden tekrar istek yapınca, bu isteğe daha önce kullanıcıya gönderilmiş rastgele değer eklenmelidir.</li>
<li>Kullanıcıdan gelen değer ile , kullanıcıya gönderilmiş olan değer karşılaştırılmalıdır. Eğer birbirini tutuyorsa, ilgili HTTP isteği web uygulaması tarafından gönderilmiş sayfa üzerinden yapılmış, herhangi bir 3. şahıs tarafından yapılmamış demektir.</li>
</ol>
<p>Bu çözüm fikrinin uygulanması noktasında önem teşkil eden unsur rastgele değerin , yeterli entropiye sahip bir havuzdan seçilmesi sonucu gerçekten rastgele olmasıdır.</p>
<h2><strong>Uygulama Fikirleri</strong></h2>
<h3><strong>1.Oturum Bilgilerine Rastgele Token Eklenmesi</strong></h3>
<p>Basitçe, Temel Çözüm&#8217;de ifade edilen modelin uygulanması şeklindedir. Eklenecek Token, gizli bir form parametresi olarak, ya da istek gerçekleştiğinde GET veya POST dizisine parametre olarak eklenecek şekilde yazılabilir.</p>
<table style="height: 201px;" border="0" cellspacing="0" cellpadding="3" width="426">
<tbody>
<tr>
<td width="50%"><span style="color: #00ccff;"><span style="color: #ffcc00;">&lt;?php</span><br />
<span style="color: #99cc00;"> //Token oluşturuluyor</span><br />
$token = GenerateToken($_COOKIE['cookie']);<br />
<span style="color: #ffcc00;">?&gt;</span><br />
&lt;<strong>form</strong> method=&#8221;POST&#8221; action=&#8221;<span style="color: #99cc00;">withdraw.php</span>&#8220;&gt;<br />
&lt;<strong>input</strong> type=&#8221;text&#8221; name=&#8221;account&#8221;&gt;<br />
&lt;<strong>input</strong> type=&#8221;text&#8221; name=&#8221;amount&#8221;&gt;<br />
&lt;<strong>input</strong> type=&#8221;hidden&#8221; name=&#8221;token&#8221; value=&#8221;<span style="color: #99cc00;">&lt;?=$token;?&gt;</span>&#8220;&gt;<br />
&lt;<strong>input</strong> type=&#8221;submit&#8221; name=&#8221;submit&#8221; value=&#8221;Submit&#8221;&gt;<br />
&lt;/<strong>form</strong>&gt;</span></td>
</tr>
</tbody>
</table>
<table style="height: 182px;" border="0" cellspacing="0" cellpadding="3" width="199">
<tbody>
<tr>
<td width="50%"><span style="color: #ffcc00;">&lt;?php</span><br />
<span style="color: #99cc00;"> </span><span style="color: #00ccff;"><span style="color: #99cc00;">//Token kontrol ediliyor</span><br />
<strong>if</strong>(<strong>isset</strong>($_POST['token']))<br />
{<br />
<strong>if</strong> (!CheckToken($_POST['token']))<br />
<strong>die</strong> (&#8220;<span style="color: #99cc00;">Tekrar giriş yapınız</span>&#8220;);<br />
ProcessWithdraw();<br />
}</span><br />
<span style="color: #ffcc00;">?&gt;</span></td>
<td width="50%"><span style="color: #ffcc00;"><br />
</span><span style="color: #ffcc00;"> </span></td>
</tr>
</tbody>
</table>
<p>Kodda görüldüğü üzere, GenerateToken ve CheckToken fonksiyonları ile basitçe token üretilip, kontrol edilmektedir. Bu fonksiyonların ne şekilde implemente edildiği de önemlidir. Fonksiyonların sahip olması gereken özellikler:</p>
<ol>
<li> Ürettiği tokenlerin kaba kuvvet saldırılarına karşı ayakta kalabilmesi için yeterli entropiye sahip olması.</li>
<li> CheckToken() fonksiyonu ile birlikte varolan tokenin geçersiz hale gelmesi ve bir kullanımlık olmasının garantisi.</li>
<li> Algoritma bilinse dahi, tokenlerin tahmin edilemeyecek yapıda olmaları.</li>
<li>Kullanıcı iki farklı tarayıcı ile uygulamayı aynı anda gezebiliyorsa, bu durumun göz önünde bulundurulup tokenlerin karıştırılmaması.</li>
</ol>
<p><strong>2.Çift Oturum ya da Çift Çerez Kullanımı</strong> Oturum ya da çerez bilgileri <em>Same-Origin Policy </em>gereğince, sadece aynı alan adı tarafından yazılır ve okunabilir. Bundan dolayı kurban.com &#8216;un yazdığı oturum ya da çerez bilgisini, saldırgan.com okuyamaz.[5]<br />
Bundan dolayı, CSRF koruması için çerez tabanlı bir koruma kullanılabilir. Rastgele değer olarak, oturum bilgisi okunur ve girilir. Sunucu tarafında ise isteğe eklenmiş oturum bilgisi ile, HTTP başlık bilgisi içerisindeki oturum bilgisi karşılaştırılır, eğer bilgiler tutarsızlık gösteriyorsa istek reddedilir.<br />
Bu örnek için tekrar implementasyon vermek istemiyorum, üstteki implementasyondaki token &#8216;lere, cookie atanıp bunun kontrolunun yapılması yeterlidir.</p>
<h3><strong>3.CAPTCHA Kullanımı</strong></h3>
<p>CAPTCHA (&#8220;Completely Automated Public Turing Test To Tell Computers and Humans Apart&#8221;)&#8217;lar, yapılan isteğin insan ya da otomatize bir kod tarafından yapıldığını anlamak için kullanılabilir. Burada da uygulama önemli işlemler öncesinde bir CAPTCHA ile işlemin saldırgan bir web sitesi tarafından değil de bir insan tarafından yapıldığını doğrulayabilir.</p>
<h3><strong>4.Kanal-Dışı Çözümler</strong></h3>
<p>Kritik işlemler öncesi, özellikle bankacılık uygulamalarında görülen telefon ya da sms ile onaylama isteği sayesinde CSRF engellenmiş olur. Lakin bu uğraştırıcı bir çözüm olduğundan, çok kritik olmayan uygulamalar dışında kullanılması tavsiye edilmeyen bir metotdur.</p>
<h1>0&#215;04 : Yaygınlık Durumu</h1>
<p>Bir çok popüler web uygulaması önlemlerini çoktan almış durumda. Bir uygulamadaki CSRF zafiyetleri genellikle uygulama geliştiricilerinin güvenlik farkındalıklarının durumları konusunda belirleyici bilgi verir.Daha çok ev yapımı ya da görevi kritik olmayan uygulamalarda görülmektedir.<br />
Geçtiğimiz yıllarda çok önemli web uygulamalarında CSRF zafiyetleri tespit edilmiştir. Bir kaç örnek üzerinden geçeceğiz.</p>
<h2>1.GMail E-mail Hijack Technique, Eylül 2007</h2>
<p>GMail e-posta servisinin filtre adında bir fonksiyonalitesi mevcut. Kısaca onceden belirlediğiniz belli filtrelere uyan e-postaları başka hesaplara yönlendirebiliyorsunuz.<br />
Filtre oluşturulması aşamasında bir CSRF zafiyeti tespit edildi ve tüm e-postaların dahil olduğu bir filtre ile kurban kullanıcıya gelen tüm e-postalarının size iletilmesini sağlayabiliyordunuz. Yani sunucuya filtre oluşturma işlemi ulaştığında yapılması gereken, öncelikli olarak bu isteğin korsan şekilde yapılmadığından emin olmak olmalıydı.</p>
<p>Kurban sitede çalışacak olan kod basitçe şu şekilde olmalıydı [6]</p>
<table style="height: 264px;" border="0" cellspacing="0" cellpadding="3" width="629">
<tbody>
<tr>
<td width="100%"><span style="color: #00ccff;"><span style="color: #ffcc00;">&lt;script&gt;</span></span></p>
<p><span style="color: #00ccff;"> </span></p>
<p><span style="color: #00ccff;"> <strong>var</strong> post_data = &#8216;v=prf&amp;cf2_emc=true&amp;cf2_email=<span style="color: #99cc00;">evilinbox@mailinator.com</span>&amp;cf1_from&amp; cf1_to<br />
&amp;cf1_subj&amp;cf1_has&amp;cf1_hasnot&amp;cf1_attach=true&amp;tfi&amp;s=z&amp;irf=on&amp;nvp_bu_cftb=Create Filter&#8217;;<br />
<strong>var</strong> xmlhttp=<strong>new</strong> XMLHttpRequest();<br />
xmlhttp.multipart = true;<br />
xmlhttp.open(&#8220;POST&#8221;, &#8216;<span style="color: #99cc00;">https://mail.google.com/mail/h/ewt1jmuj4ddv/</span>&#8216;, true);<br />
xmlhttp.onreadystatechange = <strong>function</strong> ()<br />
{<br />
<strong>if</strong> (xmlhttp.readyState == 4)<br />
{<br />
alert(&#8216;sorry&#8217;);<br />
}<br />
};<br />
xmlhttp.send(post_data);<br />
<span style="color: #ffcc00;">&lt;/script&gt;</span></span></td>
</tr>
</tbody>
</table>
<h2>2.GMail Kontakt Bilgilerinin CSRF ile Çalınması, Ocak 2007</h2>
<p>Google alan adı üzerindeki bir URL&#8217;den, tüm GMail iletişim bilgilerini almak mümkündü. İlgili URL&#8217;e korsan bir istek gönderilirse, dönen sayfadan iletişim bilgilerinin ayıklanması gayet kolaydı.[7]</p>
<table style="height: 242px;" border="0" cellspacing="0" cellpadding="0" width="771">
<tbody>
<tr>
<td width="100%"><span style="color: #ff9900;">&lt;script type=&#8221;text/javascript&#8221;&gt;</span></p>
<p><span style="color: #00ccff;"><strong>function</strong> google(data)</span></p>
<p><span style="color: #00ccff;"> {</span></p>
<p><span style="color: #00ccff;"><strong>var</strong> emails, i;</span></p>
<p><span style="color: #00ccff;"><strong>for</strong> (i = 0; i &lt;data.Body.Contacts.length; i++)</span></p>
<p><span style="color: #00ccff;"> {</span></p>
<p><span style="color: #00ccff;"> mails += &#8220;&lt;li&gt;&#8221; + data.Body.Contacts[i].Email + &#8220;&#8221;;</span></p>
<p><span style="color: #00ccff;"> }</span></p>
<p><span style="color: #00ccff;"> document.write(&#8220;&lt;ol&gt;&#8221; + emails + &#8220;&lt;/ol&gt;&#8221;);</span></p>
<p><span style="color: #00ccff;"> }</span></p>
<p><span style="color: #00ccff;"> <span style="color: #ff9900;">&lt;/script&gt;</span></span></p>
<p><span style="color: #00ccff;"> <span style="color: #ff9900;">&lt;script type=&#8221;text/javascript&#8221; src=&#8221;data/contacts?out=js&amp;show=ALL&amp;psort=Affinity&amp;callback=google&amp;max=99999&#8243;&gt;</span></span></p>
<p><span style="color: #00ccff;"> <span style="color: #ff9900;">&lt;/script&gt;</span></span></td>
</tr>
</tbody>
</table>
<p><strong>Bu örnekler dışında bir çok popüler web uygulamasında, yakın geçmişte CSRF zafiyetleri tespit edilmiştir.[8]</strong></p>
<h1>0&#215;05 : antiCSurf</h1>
<p>CSRF zafiyetinin çözümü için yapılması gereken &#8220;Oturum Bilgilerine Rastgele Token Eklenmesi&#8221; başlığında incelenmiştir. Bu noktada yapılması gereken ek işlemlerden yukarıda bahsetmiştik. PHP dilinde ilgili işlemleri garanti eden ufak bir kütüphane hazırladım. İlgili kod parçasındaki &#8220;token&#8221; değişkenine, kütüphane yardımıyla şu şekilde &#8220;unique&#8221; değer atanabilir .Kütüphanenin proje sayfasına referanslardan ulaşılabilir.[9]</p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="50%"><span style="color: #00ccff;"> </span><span style="color: #ff9900;">&lt;?php<br />
</span><span style="color: #00ccff;"><strong>include</strong>(&#8220;<span style="color: #ff9900;">SecureToken.php</span>&#8220;);<br />
$st=<strong>new</strong> SecureToken();<br />
$sid=$_SESSION['sid'];<br />
$token = $st-&gt;GetToken($sid);<br />
<span style="color: #ff9900;">?&gt;</span></span></p>
<p><span style="color: #00ccff;"><span style="color: #00ccff;"> </span></span></td>
<td width="50%"><span style="color: #00ccff;"><span style="color: #ff9900;">&lt;?php</span><br />
<strong>include</strong>(&#8220;SecureToken.php&#8221;);<br />
$st=<strong>new</strong> SecureToken();<br />
$sid=$_SESSION['sid'];<br />
<strong>if</strong>($st-&gt;CheckToken($_POST['token'],$sid))<br />
Go();<span style="color: #99cc00;">//islemler devam eder</span><br />
<strong>else</strong><br />
<strong>die</strong> (&#8220;<span style="color: #99cc00;">Tekrar giriş yapınız</span>&#8220;);<br />
<span style="color: #ff9900;">?&gt;</span></span></td>
</tr>
</tbody>
</table>
<h1><strong>0&#215;0</strong><strong>6 : Referanslar</strong></h1>
<ol>
<li> http://en.wikipedia.org/wiki/Confused_deputy_problem</li>
<li> https://www.owasp.org/index.php/.Net_CSRF_Guard</li>
<li> http://keepitlocked.net/archive/2008/05/29/viewstateuserkey-doesn-t-prevent-cross-site-request-forgery.aspx</li>
<li> http://spreadsheets.google.com/pub?key=pWqXgSu_wNm-GkSPgOGyOWQ</li>
<li> http://en.wikipedia.org/wiki/Same_origin_policy</li>
<li> http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/</li>
<li> http://ajaxian.com/archives/gmail-csrf-security-flaw</li>
<li> <a href="http://www.freedom-to-tinker.com/sites/default/files/csrf.pdf">http://www.freedom-to-tinker.com/sites/default/files/csrf.pdf</a></li>
<li> <a title="http://code.google.com/p/anticsurf/" href="http://www.webguvenligi.org/projeler/anticsurf/">http://www.webguvenligi.org/projeler/anticsurf/</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.knbykl.org/cross-site-request-forgery-atagindan-korunmanin-yolu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
