Unter Cross-Site-Scripting (XSS) versteht man eine Schwachstelle in Webanwendungen, durch die es möglich ist Schadcode (meistens JavaScript) auszuführen.
Oftmals ist dies durch Felder für Nutzereingaben möglich, in dem die Eingaben nicht ensprechend geprüft werden.
Wichtig zu verstehen ist hierbei, dass JavaScipt im Browser des Besuchers und nicht auf dem Webserver ausgeführt wird.
Quelle
Im Folgenden möchte ich die drei grundlegenden Arten
- Reflexiv
- Persistent
- DOM-Basiert
anhand des XSS-Spiel von Google veranschaulichen. Damit ist es möglich sich spielerisch mit Cross-Site-Scripting auseinander zu setzten um die Funktionsweise zu lernen.
Ziel ist es als Proof of concept Code auszuführen, der ein Pop-Up mittels alert()
erscheinen lässt. Bei einem „richtigen“ Angriff würde hier entsprechender Schadcode ausgeführt werden, der Cockies ausliest etc.
Level 1:
Hier sehen wir ein Eingabefeld, das eine Suchfunktion darstellt.
Wird in dieses etwas eingegeben, so erscheint der entsprechende Text nach dem Absenden
Die wohl einfachste Möglichkeit eines XSS-Angriffes ist es, den Code direkt einzugeben:
<script>alert("Hello Steemit")</script>
Hierbei handelt es sich um einen sogenannten reflektierten Angriff. Reflektiert, weil die Benutzereingabe (in diesem Fall der gesuchte Text) nochmal ausgegeben wird.
Level 2:
Hier wird ein Forum simuliert. Die Texteingabe wird gespeichert und den anderen Benutzern verfügbar gemacht.
Die direkte Eingabe des Scriptes wie oben ist hier nicht möglich. Indem ein Bild eingebunden wird, welches nicht geladen werden kann kommt unser Code im onerror
Event zur Ausführung.
Hier spricht man von einem persistenten Angriff. Persistent, da der Code (in diesem Fall über eine Kommentarfunktion) auf dem Webserver gespeichert wird. Jedes mal wenn ein Benutzer die Seite läd wird der Code im Browser ausgeführt.
Level 3:
Hier haben wir kein Eingabefeld, in welches wir schreiben können. Durch das Klicken auf eines der Reiter ändert sich das entsprechende Bild.
Ein Blick in den Quelltext verschafft uns Einsicht in die Funktionsweise
Das Bild wird abhängig vom angeklickten Tab geladen. Die Dateinamen werden hierbei entsprechend Zusammengesetzt(cloud1.jpg, cloud2.jpg, cloud3.jpg)
Durch Einfügen eines einfachen '
"brechen" wir aus dem JS Code aus, und führen anschließend wie zueben über das HTML event onerror
den entsprechenden Code aus:
https://xss-game.appspot.com/level3/frame#3' onerror='alert("Level 3.")';
Diese Art des Angriffs nennt man lokales bzw. DOM-Basiertes Cross-Site-Scripting. Hierbei wird das Document Object Modell manipuliert.
Wie Schütze ich mich als Besucher einer Webseite ?
Durch deaktivieren von JavaScript z.B durch entsprechende Browser-Addons wird kein Code mehr ausgeführt. Natürlich kann es sein, dass Funktionalität der Webseite hiedurch eingeschränkt wird.
Wie schütze ich meine Webanwendung ?
Durch den Einsatz von entsprechenden Tools wie DOM Snitch können während dem Entwickeln entsprechende Tests durchgeführt werden.
Sinvoll ist es in jedem Fall einmal einen Blick in Reviewing Code for XSS und XSS Filter Evasionvon OWASP zu werfen.
Ich hoffe euch einen groben Überblick gegeben zu haben. Bei weiteren Fragen beantworte ich diese natürlich gerne in den Kommentaren. Ansonsten könnt ihr euch ja mal an den nächsten Leveln versuchen ;)
Vielen Dank fürs Lesen !
Solche Posts sind der Hammer :)
Ich habe eben gerade den webdev Bereich entdeckt und dann deinen Post! Super Beitrag, interessant geschrieben - macht Lust auf mehr!
Ich freue mich jedes Mal wenn es etwas von dir zu lesen gibt! Danke für diese ausführlichen Posts. Gab es in der Vergangenheit schon größere "Skandale" wegen Cross Site Scripting attacks?
Freut mich, dass dir meine Beiträge gefallen liebes @flugschwein.
XSS Angriffe gibt es sehr oft - so hatte unter anderem ebay eine Zeit lang entsprechende Schwachstellen.
XSS war letztes Jahr auf Platz 7. der Web Application Security Risks von OWASP
Das 1. Beispiel kann schädlich sein, wenn die Eingabe per GET übergeben werden kann. Dann können schadhafte Links verteilt werden. Ansonsten unkritisch, da das nur das Scriptkiddie selbst zu sehen bekommt.
Ebenso ist 3. unkritisch, da es auch nur das Spielkind sieht.
Das 2. hingegen kann bösartig sein. Daher sollten die Usereingaben immer gefiltert werden. Ich nutze z.B. bei PHP den Html purifier dafür. Wem das zu kompliziert ist, kann auch einfach strip_tags nutzen.
Das 1. Beispiel ist genauso kritisch wenn die Eingabe nur per POST übergeben wird.
Muss das Scriptkiddie ja auch nur eine entsprechende Form bauen die auf die Seite weiterleitet und die Parameter per POST übergibt.
Hier wird beispielsweise erklärt wie sowas im einfachsten Falle aussehen kann.
Für den User ist das sogar noch undurchsichtiger, weil er auch über die URL nichts ungewöhnliches feststellen kann...
Das 3. Beispiel ist eher kritisch bei naiven Usern, die irgendwas in die Console pasten, weil es ihnen so gesagt wurde....
Sagen wirs mal so, allein das so etwas existiert sagt doch schon aus wie viele darauf schon reingefallen sind...
Gruß,
Martin
Congratulations! This post has been upvoted from the communal account, @minnowsupport, by MaxPatternMan from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, theprophet0, someguy123, neoxian, followbtcnews, and netuoso. The goal is to help Steemit grow by supporting Minnows. Please find us at the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.
If you would like to delegate to the Minnow Support Project you can do so by clicking on the following links: 50SP, 100SP, 250SP, 500SP, 1000SP, 5000SP.
Be sure to leave at least 50SP undelegated on your account.
Resteemed to over 16500 followers and 100% upvoted. Thank you for using my service!
Send 0.200 Steem or 0.200 Steem Dollars and the URL in the memo to use the bot.
Read here how the bot from Berlin works.
We are happy to be part of the APPICS bounty program.
APPICS is a new social community based on Steem.
The presale was sold in 26 minutes. The ICO is open now for 4 rounds in 4 weeks.
Read here more: https://steemit.com/steemit/@resteem.bot/what-is-appics
@resteem.bot