23 Mayıs 2014 Cuma

Javascript's Darkside Part 1 | Same Origin Policy

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.

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
https://www.example.com:8080/document




İlk Deneme

<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.

<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