html () vs innerHTML jquery / javascript & XSS-Angriffe

8

Ich teste xss-Angriffe auf meinen eigenen Code. Das Beispiel unten ist eine einfache Box, in der ein Benutzer eingeben kann, was immer er möchte. Nach dem Drücken von "Test!" Knopf, JS wird die Eingabezeichenkette in zwei Divs zeigen. Dies ist ein Beispiel, das ich gemacht habe, um meine Frage besser zu erklären:

%Vor%

Wenn Sie versuchen, es in eine .html-Datei zu kopieren und auszuführen, wird es funktionieren, aber wenn Sie versuchen, <script>alert('xss')</script> einzugeben, wird nur eine Warnmeldung ausgegeben: die eine in 'test-html' div (mit html () Funktion).

Ich kann wirklich nicht verstehen, warum das passiert, und auch, wenn ich den Code mit Firebug inspiziere, bekomme ich dieses Ergebnis (nachdem ich das Skript eingefügt habe)

%Vor%

Wie Sie sehen können, ist test-html div leer und test-innerhtml div enthält das Skript. Kann mir jemand sagen warum? Liegt das daran, dass html () sicherer ist gegen die Injektion von Skripten oder ähnliches?

Vielen Dank im Voraus, beste Grüße.

    
BeNdErR 29.11.2011, 22:22
quelle

4 Antworten

5

JQuery streift die Skript-Tags ab, weshalb Sie nicht sehen, dass es an das dom angehängt wird, geschweige denn es ausführt.

Um zu sehen, warum jquery es ausblendet, können Sie die Antwort von John Resig hier sehen: Ссылка

Hoffe, das hilft

    
MatthewJ 29.11.2011, 22:44
quelle
16

Im Gegensatz zu dem, was auf dieser Seite gesagt wird, sind jQuery.html() und die vielen jQuery-Funktionen , die HTML-Strings als Argumente akzeptieren, anfälliger für DOM-basierte XSS-Injection als innerHTML wie vom OP bemerkt.

jQuery.html() extrahiert die <script> -Tags, aktualisiert das DOM und wertet den in den Skript-Tags eingebetteten Code aus .

Als Ergebnis kann XSS ohne Benutzerinteraktion passieren, selbst wenn das DOM bei Verwendung von jQuery.html() geladen wird.

Dies ist sehr einfach zu demonstrieren.

Dies ruft alert() :

auf %Vor%

Ссылка

Während dies nicht:

%Vor%

Ссылка

    
Erwan Legrand 10.04.2013 14:29
quelle
1

Dies ist ähnlich wie diese Frage und this one . .html() entfernt die Skript-Tags, bevor sie den HTML-Code eingeben und separat ausführen.

Warum der zweite nicht ausgeführt wird, liegt daran, dass dynamisch hinzugefügte Skripte nicht ausgeführt werden, nachdem die Seite geladen wurde.

Aber, wie @Ben betont, gibt es eine Menge XSS-Öffnungen, wenn man solche Dinge akzeptiert. Das heißt, wenn die Informationen auf ihrer eigenen Seite angezeigt werden, können sie beliebigen Code auf ihrem eigenen Rechner ausführen. Das große Problem wird sein, wenn Sie dies speichern oder an andere Benutzer senden. Wenn Sie das nicht tun, gibt es keinen Schutz der Benutzer vor sich selbst in dieser Hinsicht. Vielleicht hilft es zu wissen, wovor du dich schützen willst.

    
Ktash 29.11.2011 22:45
quelle
0

ja jquery html rendert keine Skript-Tags

aber es ist nicht sicherer weil Sie viele andere XSS-Payloads wie <a href> style, expression usw. verwenden können.

    
Ben 29.11.2011 22:39
quelle

Tags und Links