Eine der häufigsten Sicherheitslückenklassen in Websites wird „Cross-Site Scripting“ oder „XSS“ genannt. Bei XSS-Schwachstellen ist es einem Benutzer möglich, die Ausführung von JavaScript zu veranlassen. Es gibt verschiedene Varianten von XSS-Schwachstellen mit unterschiedlichen Schweregraden.
Das Problem, dass ein Angreifer JavaScript in den Sitzungen anderer Benutzer ausführen kann, besteht darin, dass der Angreifer dann alles mit der Website machen kann, die das Opfer sieht. Dazu gehören die Weiterleitung von Opfern auf externe Websites, der Diebstahl von Authentifizierungstoken und die Überwachung von Zahlungsdetails.
Die schwerwiegendste Form der XSS-Sicherheitslücke ist „Stored“ oder „Persistent“ Cross-Site Scripting. Hier ist es einem Angreifer möglich, eine XSS-Nutzlast zu erstellen und diese dann zu übermitteln, sodass sie in der Datenbank gespeichert wird. Mit einem in der Datenbank gespeicherten XSS-Exploit ist es dann möglich, über einen weiten Zeitraum andere Benutzer zu beeinflussen.
Eine andere Form von Cross-Site Scripting ist „Reflected“, dieser Typ wird an keiner Stelle gespeichert, sondern die Payload wird in den Browser eingebunden. Normalerweise ist diese Art von XSS Teil von Phishing-Angriffen, bei denen ein Angreifer versucht, ein Opfer dazu zu bringen, auf einen bösartigen Link zu klicken.
Im Allgemeinen wird die Nutzlast bei den meisten XSS-Angriffen irgendwann an den Server gesendet, aber einige Angriffe sind rein clientseitig, werden nie an den Server gesendet und betreffen stattdessen nur clientseitiges JavaScript. Dies wird als DOM-basiertes XSS bezeichnet, da es im JavaScript Document Object Model oder DOM verbleibt. Diese Art von Schwachstelle ist besonders schwer zu identifizieren und zu beheben, da die Exploits vom Server nie gesehen werden und daher nicht protokolliert werden können.
Historisch gesehen besteht die Präventionstechnik gegen XSS-Schwachstellen darin, alle von Benutzern übermittelten Daten zu filtern, indem Blocklisten verwendet werden, um alle Nachrichten mit aussagekräftigen Zeichen oder Wörtern in JavaScript abzulehnen. Dies führte tendenziell zu einem Wettrüsten, um Umgehungen für den Filter zu finden und gleichzeitig einige legitime Benutzereingaben zu verhindern. Die richtige Lösung besteht darin, HTML-Entitäten zu verwenden, um vom Benutzer übermittelte Daten zu codieren. mit aktivierten HTML-Entity-Modulen werden Zeichen automatisch in ein Format codiert, in dem der Browser weiß, dass er sie als die richtigen Symbole anzeigt, aber nicht als Code behandelt.