PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [HTML/CSS/JS] Clientseitiger XSS Schutz per JavaScript



Worka
24.11.2012, 13:40
Hallo
Ich möchte hier mal ein Script vorstellen, welches ich vor ein paar Tagen gebastelt habe.

Zum Hintergrund:
Als JS Coder kennt man das Problem von XSS. In den letzten Tagen sind mir wieder viele Scripte untergekommen, welche XSS anfällig sind.
Natürlich sollte man, seine Scripte serverseitig gegen sowas absichern. Dennoch kommt es immer wieder vor, dass Scripte XSS anfällig sind.
Daher habe ich überlegt, inwiefern man Clientseitig sowas vorbeugen kann.

Clientseitigen XSS Schutz, kennt jeder moderne Browser. Jedoch kann ein Browser nicht vor allen Angriffen schützen, da er nicht genau weiss, welche Scripte im Quelltext nun vom Seitenbetreiber eingefügt wurden, und welche der "böse XSS Hacker" eingefügt hat.

Hier greift mein Script ein, welches am besssten direkt als erstes Tag im html Head eingefügt werden sollte. In dieser ersten noch SEHR unausgereiften Tech Demo Version tut es folgendes:

1. Stoppt das Laden der Seite :
--> Keine weiteren Scripte werden geladen.

2. Lädt die URL des aktuellen Documentes per AJAX Request:
--> HTML Quelltext der Seite, dessen Laden abgebroche wurde, wird in String gespeichert.

3. Fügt Antwort (= HML Code der Seite) so in das Document ein, dass Scripte zwar im DOM aufgenommen aber NICHT ausgeführt werden.
--> Scripte werden über das DOM auffindbar.

4. Durchsuch alle gefundenen Scripte ob sie oder ihre src in der Whitelist stehen.
--> Führt erlaubte aus, ignoriert nicht erlaubte.

Natürlich ist das Script noch sehr unausgereift, kann aber verbesssert werden.

1. Es erfordert immer 2 Requests pro Seite, da der erste Request abgebrochen wird, sobald das Script geladen wurde und anschliessen der HTML Code per XMLHttp geladen wird.
--> Man könnte alle Links welche zu Documenten auf dem selben Host führen gegen "AJAX Links" austauschen, so dass alle Links per AJAX geladen werden und die Antwort als neuer HTML Code eingetragen wird.

2. Erfolgt der Aufruf der Seite mit Post Parametern, so werden diese beim AJAX Request nicht gesendet.
--> Alle Forms könnten dynamisch so geändert werden, dass sie per AJAX Ihren Request absenden. Die Antwort wird dann als neuer HTML Code eingefügt.

3. Alle Scripte bzw. Ihre src welche erlaubt werden sollen müssen in der Whitelist aufgenommen werden.

4. Funktionsweise des Scriptes ist Browserabhängig.
--> Es funktioniert scheinbar im jeweils neuesten IE/FF/Chrome/Opera

5. Alle Funktionen wurden nur exemplarisch Implementiert


Demo:
http://worka.designerscripte.net/WAAXE/WAAXE.html



//Exemplarische Whitelist
var WhiteList = 'alert(123)alert(12)';


(function WAAXE(){

var WhiteListed = function(Code){
if (WhiteList.indexOf(Code) >= 0) {
alert('Es wurde folgendes Script gefunden und es wird nun erlaubt: ' + Code);
return true;

}else{
alert('Es wurde folgendes Script gefunden und es wird nun verboten: ' + Code);
return false;
}
};


var ExecScript = function(Node) {
var newNode = document.createElement('script'), parentNode = Node.parentNode;
newNode.src = Node.src;
parentNode.removeChild(Node);
parentNode.appendChild(newNode);
};



//Seitenladen Stopen
if(window.stop){
window.stop();
}else{
document.execCommand('stop')
};

//SeitenURL per AJAX anfordern
this.xmlHttp = new XMLHttpRequest();
xmlHttp.open('GET', window.location.href + window.location.search, true);

xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4) {
//HTML einfügen
var newHtml = document.createElement('html'), oldHtml = document.getElementsByTagName('html')[0], parentNode = oldHtml.parentNode, body = document.createElement('body');
body.innerHTML = xmlHttp.responseText;
newHtml.appendChild(body);
parentNode.removeChild(oldHtml);
parentNode.appendChild(newHtml);


//Scripte suchen und prüfen
var scripts = document.scripts;
for (var i=0, len = scripts.length; i < len; i++) {
if (scripts[i].src && scripts[i].src != '') {
if ( WhiteListed(scripts[i].src) == true) {
ExecScript(scripts[i]);
}

}else if(scripts[i].innerHTML && scripts[i].innerHTML != '') {
if ( WhiteListed(scripts[i].innerHTML) == true ) {
eval(scripts[i].innerHTML);
}
}

}
}
};
xmlHttp.send(null);
})();
Ist das nur eine nette Spielerei oder seht Ihr Sinn in einer Weiterentwicklung dieses Scripts?

jpwfour
24.11.2012, 13:49
...
Natürlich sollte man, seine Scripte serverseitig gegen sowas absichern. ...
1. Stoppt das Laden der Seite :
...
Ist das nur eine nette Spielerei oder seht Ihr Sinn in einer Weiterentwicklung dieses Scripts?

Kann man so machen, aber allein der Performanceverlust ist hier für viele denke ich schon ein K.O. Kriterium. Dann lieber die "Energie" in die serverseitige Absicherung stecken (der Client sollte mit sowas eh nicht belastet werden, dass sind bisher auch nur "dirty hacks", die aus der Not entstanden sind. Leider entwickelt sich das dann schnell weiter, plötzlich benutzt es jeder und sieht es als i.O. an, dem Client solche Dinge zu überlassen :suspicious:).

Worka
24.11.2012, 13:58
Das zweifache laden der Seite wäre beim umschreiben der Links (Link href gegen AJAX Request ersetzen und Quellcode nach Request ersetzen) nur beim ersten Aufruf nötig.

Das Argument mit der Zuständigkeit ist natürlich verständlich.
Leider scheint der Verzicht auf sowas aber die Coder auch nicht zum sicheren Scripten anzuregen.