Javascript's Darkside Part 1
[ + ] Same Origin Policy
Same Origin Policy, web tarayıcılar için bir güvenlik modelidir. Bu model aynı kaynaklar dışında farklı kaynaklardan dosya/script yüklememizi ve çalıştırmamızı engellemektedir. Bu model kapsamında tarayıcılar farklı kaynaklar için izole edilmiş durumdadır.
Same Origin Policy, web tarayıcılar için bir güvenlik modelidir. Bu model aynı kaynaklar dışında farklı kaynaklardan dosya/script yüklememizi ve çalıştırmamızı engellemektedir. Bu model kapsamında tarayıcılar farklı kaynaklar için izole edilmiş durumdadır.
SOP'yi anlamak açısından
aşağıdaki aynı kaynak ( Same Origin ) formülünü dikkatlice
inceleyelim.
Origin = Scheme + Host +
Port
http://www.example.com --> SAMEORIGIN
http://www.example.com/other/document/here --> SAMEORIGIN
https://example.com/document
https://www.example.com/document
<iframe src="http://google.com" name="google" style="height:100px"></iframe>
<script>
document.getElementsByName('google')[0].onload = function() {
try {
alert(frames[0].location)
} catch(e) {
alert("Error: "+e)
}
}
</script>
Yukarıdaki listeye baktığımızda Iframe'in google.com'u çağırdığını, yani dış bir kaynakla iletişim kurmaya çalıştığını görüyoruz. Google'ın içeriğini alert methodu ile çıktı almaya çalışalım.
Görüldüğü üzere kodumuz hata
fırlattı ve SAMEORIGIN tanımlı olduğu için dış kaynaktan
veriyi çağıramadık. DOM erişimi, Cookie, Java, Flash, XmlHttpRequest SOP'in etki alanındadır ve ismi geçen bu elemanlarla dış kaynaklara
ulaşabilirsek JavaScript çalıştırabiliriz. ( Bknz: XSS )
SOP ve XSS
Uygulama katmanında çalışan
XSS zafiyetlerini ve browser katmanında çalışan SOP mekanizmasını
ayrı ayrı irdelemek gerekmekte. XSS ile aynı kaynakta(Same Origin)
çalışırken, SOP atlatarak farklı kaynaklardan DOM nesnelerini
okuyabilir ve cookie bilgilerini değiştirebiliriz.
Aşağıdaki JSON örneği
ile konuyu genişletmeye çalışalım.
function Personel(data) {
console.log("ad: " + data.ad + ", soyad: " + data.soyad);
}
Personel({ad: 'EVREN', soyad: 'Yalçın'});
Personel adında bir fonksiyonumuz var ve JSON veriyi Personel fonksiyonunun argümanı olarak tanımladık.
Chrome'un konsol loglarına baktığımızda JSON veriyi görmemiz gerekiyor. JSON yapısıyla ilgili ufak bir örnek yaptığımıza göre JSONP çağrılarına giriş yapabiliriz.
Basit bir JSONP çağrısı oluşturup SOP mekanizmasını atlatmaya çalışalım :
<script>
var url = encodeURIComponent("http://www.google.com");
//jquery kullanalım...
$.getJSON('http://whateverorigin.org/get?url=' + url + '&callback=?',
function(data) {
var html = data.contents;
console.log(html);
}
);
</script>
Whateverorigin alanında aşağıdakine benzer bir php kodu bulunmaktadır.
<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 1 Jan 2000 01:00:00 GMT');
header('Content-type: application/json');
$data = '{ "name": "world" }';
echo $_GET['jsonp_callback'] . '(' . $data . ');';
?>
Kodu çalıştırıp konsola
bakalım :
SOP mekanizmasına
takılmadan başka bir kaynaktan callback yapabildik.
Şimdi JSONP kullanarak bir
XSS saldırısı gerçekleştirelim.
JSON veri, eval fonksiyonu içinde çağrıldığı için herhangi bir JS kodu çalışacaktır.
<script>
hello = function(data) {
var a = eval("(" + data.name + ")");
}
</script>
JSON veri, eval fonksiyonu içinde çağrıldığı için herhangi bir JS kodu çalışacaktır.
Saldırgan tarafındaki kodu inceleyelim :
<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 1 Jan 2000 01:00:00 GMT');
header('Content-type: application/json');
$data = '{ "name": " alert(document.cookie) "}';
echo $_GET['jsonp_callback'] . '(' . $data . ');';
?>
Görüldüğü gibi name
anahtarının değerine bir saldırı vektörü yerleştirdik.
Chrome tarayıcısının
debuggerından alınan ekran görüntüsünde eval fonksiyonuna
argüman olarak bir saldırı vektörü atandığını ve çalıştığını görüyoruz.
Son olarak, aşağıdaki bağlantıdan SOP bypass açısndan güzel bir örnek mevcut. Dikkatli bir şekilde incelemenizi öneriyorum.
Yandex + XSS + SOP BYPASS
The full attack scenario goes this way:
1. Victim visits malicious site (ropchain.org)
2. Attacker puts there <object> with kraski-universal-blogplayer
3. Victim click on ‘play’ button.
4. Response from flash, through ExternalInterface.call() arrives to javascript console.log() on ropchain.org domain (SOP bypass)
5. Because attacker have access to javascript in ropchain.org origin - he can parse response for CSRF token.
6. Attacker exploits both XSS issues, because now he know secret-key value :) (as far as first one is reflected XSS - it cannot be exploited on browsers that uses some Anti-XSS mechanism, but the second one works fine on all modern browsers. That is why on video I’ll show later only one alert will apear (as far as I'm Chrome user).
(Siteden alıntıdır.)
Kaynak : http://zoczus.blogspot.com.tr/2014/05/yandex-2x-xss-duplicates-same-origin.html
EOF



0 yorum:
Yorum Gönder