11 Ağustos 2013 Pazar

DOM-XSS - 1

Document Object Model, "DOM", "Belge Nesnesi Modeli" anlamlarına da gelmektedir. İnternet tarayıcıları girilen internet sayfasını bir belge, bu belge (sayfa) içerisinde bulunan tüm elemanları da nesne olarak kabul eder. Buna göre resim, yazı, form gibi tüm elemanlar nesnedir. İşte DOM sayfa içindeki herhangi bir nesnenin özelliğine müdahele edebilmemize, nesne özelliklerini değiştirebilmemize olanak sağlar.
Kaynak : Wikipedia

Konuya başlamadan önce incelenmesi gereken kaynaklar:
https://code.google.com/p/domxsswiki/wiki/Sources
https://code.google.com/p/domxsswiki/wiki/Sinks
 http://www.signalsec.com/statik-kod-analizi/ 


Saldırgan, DOM ağacı üzerinde bir nesneyi manipüle etmek istiyorsa kullanıcı girdisiyle bir kaynak oluşturmalı ve kaynaktan aldığı bu veriyi işlemesi gerekmektedir.



Kaynak ve veri işleme kısmını kavrayabilmek için aşağıdaki örnekleri inceleyelim:

Örnek 1 :
var param = location.hash.split("#")[1]; 
document.write("Hello " + param + "!");

location.hash.split fonksiyonu ile kullanıcı taraflı bir kaynak oluşturulmuş ve X bir değer değişkene atanmıştır. Daha sonra document.write fonksiyonu ile param değişkeninin işlenmesi sağlanmıştır. 

Örnek 2 :
function timedMsg(callback)
{
	if(callback)
	{
		var t=setTimeout(eval('callback'),3000);
		return 0;
	}
}

function fire()
{
var call = location.hash.split("#")[1];
timedMsg(call);
}

location.hash.split ile kullanıcı girdisi alınmakta ve timedMsg fonksiyonunun argümanı olarak kullanılmaktadır. timedMsg fonksiyonu çağrıldığında ise eval fonksiyonu çalışmakta ve veri işlenmektedir.

Örnek 3 :
quora = {
    zebra: "text",
    yahoo: function () {
         this.benz=this.zebra;
    },
    benz: div.innerHTML
};
quora.zebra=location.hash.split('#')[1];
quora.yahoo();

quora sınıfındaki methodları çağırıyoruz. Kullanıcı girdisini zebra methoduna yerleştiriyoruz ve div.innerHTML ile veriyi işliyoruz.

Bu üç örnekte DOM-XSS'in temel çalışma prensibini anlamaya çalıştık. Eğer elimizdeki kod satırı çok fazla olsaydı, JS analizi daha kapsamlı bir hale geleceği için JSPrime gibi 3. parti bir yazılım kullanmamız daha mantıklı olacaktı.

JSprime ve DOM-XSS

JSPrime, Nishant Das Patnaik tarafından geliştirilen bir statik kod analiz aracıdır. Github sayfasından ayrıntılı bilgiye ulaşabilirsiniz. https://github.com/dpnishant/jsprime

JSPrime'ın NodeJS desteği bulunmaktadır. localhost:8888 bağlantısı kullanarak çok basit bir şekilde kod parçalarını analiz edebilirsiniz.
Örnek -1
Örnek -2
Örnek -3

Yukarıda örnek 1-2-3 için analiz sonuçlarını görüyorsunuz.  JSprime, kod akışını takip ederek dom-xss noktalarını tespit ediyor. 

Not : JSPrime yeni bir ürün olduğu için kod ayrıştırıcısından kaynaklanan hataların olma olasılığı yüksek.

EOF

0 yorum:

Yorum Gönder