DOM tabanlı XSS

This page is a translated version of the page DOM-based XSS and the translation is 100% complete.

DOM tabanlı XSS hakkında

DOM tabanlı XSS ​​(veya tür-0 XSS), istemci tarafındaki betikleri (JavaScript gibi) sayfanın DOM 'u değiştirip bir saldırganın JavaScript çalıştırmasına izin verdiğinde kurbanın tarayıcısında meydana gelen bir Siteler arası betik oluşturma saldırı türüdür.

Sunucu çalıştırılabilir JavaScript'i tarayıcıya döndürmediğinden, bu XSS sınıfı Reflective XSS (tip-1 XSS) ve Stored XSS'den (tip-2 XSS) farklıdır. Bunun yerine, sunucu tarafından temizlenmiş veya muhtemelen sunucuya hiç gönderilmemiş veriler, sayfada çalışan mevcut kod tarafından çalıştırılabilir JavaScript'e dönüştürülür.

Örneğin, OWASP web sitesinden şu örnek betiğini düşünün:

...
Dilinizi seçiniz:
<select><script>
document.write("<OPTION value=1>"+document.location.href.substring(document.location.href.indexOf("default=")+8)+"</OPTION>");
document.write("<OPTION value=2>English</OPTION>");
</script></select>
...

Sayfa, amaçlanan dil dizesi yerine "<script>alert("xss")</script>" olarak ayarlanmış "default" parametresi ile yüklenirse, fazladan betik sayfanın DOM'sine eklenir ve sayfa yüklenirken çalıştırılır.

Önleme

JavaScript, resmi bir kod inceleme süreci olmadan MediaWiki sitelerine eklenebilse de, bu betikleri, bu saldırıları engellemezlerse diğer kullanıcıları tehlikeye atabilir.

Standart XSS önlemede olduğu gibi, mümkün olduğunda gelen verileri doğrulamalısınız ve betiğiniz sayfaya yazarken her zaman verilerden çıkmalısınız. Bu kaçmayı yapmak için, kaçmayı zorlaştıran bazı yöntemler kullanmaktan kaçınmalı ve bunun yerine HTML yapısının ve değerlerinin veya metnin ayrılmasını kolaylaştıran yöntemler kullanmalısınız.

JavaScript için bilgi sağlamak amacıyla veri özniteliklerini kullanmak cazip gelebilir. Bu genellikle iyi bir uygulamadır, ancak kullanıcıların keyfi veri özniteliklerine sahip öğeler yapmalarına da izin verildiğini unutmayın, bu nedenle bir veri özniteliğinden alınan herhangi bir bilgi (örneğin, jQuery'nin .data() kullanılarak) güvenilmeyen girdi olarak değerlendirilmeli ve doğrulanmalıdır.

Kacının

Genel olarak, bu işlevlerden mümkünse kaçınılmalıdır. Güvenli hale getirilebilirler, ancak tüm XSS vektörlerinin hafifletildiğinden emin olmak için her tarayıcının JavaScript motorunun nasıl çalıştığını anlamayı gerektirir.

Element, .innerHTML() ve .outerHTML() yöntemler

element.innerHTML = '<div>' + user-data + '</div>';

JQuery'nin .html() yöntemi (.innerHTML kullanan)

$('#target').html( user-data );

JQuery öğesi oluşturmada kullanıcı verilerini kullanma

$( '<div id=' + user-data + '></div>' );

jQuery'nin append yöntemi, eklediğiniz her düğümün veya nesnenin türü ve değerinden emin olmadığınızda. Bir (görünen) HTML dizesi ise, jQuery bunu örtük olarak bir öğeye dönüştürür.

document.write() veya document.writeln()

document.write( 'Welcome to ' + user-data + '!' );

eval, setTimeout, bir nesnenin olay işleyicisi veya javascript: url hedeflerine iletilen bir dizede kullanıcı verilerini kullanma

Kullanıcı verilerini CSS oluşturan dizelerde kullanma

Kullanım

Sayfanın DOM'unu güncellerken, DOM öğeleri oluşturmak ve bunları DOM'a eklemek için genellikle bu işlev modelini kullanmanız gerekir:

var $el = $('<div>');
$el.attr( {
  anAttribute: 'aValue',
  anotherAttribute: 'anotherValue'
} );
$el.text( 'Text of the div' );
$parent.append( $el );

Gösterildiği gibi, öğeyi ve kullanıcı tarafından kontrol edilen verileri içermeyen herhangi bir özelliği oluşturmak için $('<tagName>') kullanabilirsiniz. Öğenin özniteliklerini ayarlamak için .attr() kullanabilirsiniz.

Doğru oluşturulmuş bir öğeniz olduğunda, öğeyi DOM'a eklemek için .append() veya .appendTo kullanabilirsiniz. Ancak yukarıda bakın; Tam olarak ne eklediğinizi bilmiyorsanız append() veya appendTo() kullanmayın.

.text() yöntemi, bir öğenin metin gövdesini ayarlamak için kullanılabilir ve herhangi bir HTML'den doğru bir şekilde çıkacaktır.

JQuery kullanmıyorsanız, kullanabilirsiniz

var element = document.createElement( "tagName" );
element.setAttribute( "attributeName", "value" );
element.appendChild( child );

JavaScript, hangi dizelerin öğe adlarını, özellik adlarını ve öznitelik değerlerini temsil etmesi gerektiğini açıkça yorumlayabildiğinden, kullanıcı tarafından kontrol edilen verilere eklenmiş olabilecek tüm HTML karakterlerini doğru bir şekilde değiştirecektir.

Sanitizasyon

Kullanıcı tarafından kontrol edilen verileri HTML ile karıştırmanız gereken zamanlar olabilir. Bu gibi durumlarda, kullanıcı tarafından kontrol edilen verilerin eklendiği HTML bağlamı için uygun şekilde kaçtığından emin olmanız gerekir.

Örneğin, bir div öğesinin metnine veri eklemek:

<div>User-Controlled Data</div>

Bu kullanıcı tarafından kontrol edilen verileri div öğesinin id özniteliğine eklemenize göre farklı çıkış gerektirir.

Bağlamların ve kaçış kurallarının bir listesi OWASP XSS Önleme Hile Sayfasında bulunabilir.

En basit durum için (bir öğenin metnine kullanıcı tarafından kontrol edilen verileri eklemek), jQuery'nin .text yöntemini veya mw.html.escape() kullanabilirsiniz.