Login / Auth Bypass

Heyho,

wie versprochen wollte ich euch etwas ueber Web Security / Web Vulnerability erzaehlen, dies kann man als Tutorial oder eben auch als Info Blatt sehen. Meine Reihe werd ich mit “Login / Auth Bypass” anfangen, da es ein nettes verstaendliches Thema ist und ich in letzter Zeit bei milw0rm.com einige “Auth Bypass” Exploits gesehen habe. Auch auf FrEe-hAcK hab ich eine Frage gesehen, wie man ein Login Bypass Exploit anwendet. Nun wie kann es passieren, dass man einen Login Bypassen kann? Schauen wir uns das mal in einem Beispiel Source an:

<?php
$sql = "SELECT * FROM users WHERE username='" . $_POST['username'] . "' AND password='" . $POST_['password'] . "'";
response = mysql_query($sql);
?>

Sollte soweit verwundbar sein. Doch warum?

Ganz einfach, da nun ein MySQL Query durchgefuehrt wird ohne die User eingaben zu pruefen. Das heißt ohne zu testen ob der User das Query manipulieren will. Dieser Fehler kann schnell mal passieren. Wird uebrigens auch gern bei Hackits als ein bestimmtes Level benutzt *hust* $h4d0wl33t hackit Level 2 *hust*.

Unser MySQL-Query sieht im Moment ja so aus:

SELECT * FROM users WHERE user='' AND password=''

Was kann nun passieren bzw. wie kann man dies nun Ausnutzen/Exploiten?

So tragen wir mal als Usernamen einen Nicknamen ein der dort existiert,oft isses admin
Als Passwort tragen wir nun ‘ OR ‘a’ = ‘a ein.

Wie sieht nun unser MySQL Query aus?

SELECT * FROM users WHERE user='admin' AND password='' OR 'a' = 'a'

‘a’ = ‘a ist ergibt den Wert True, also Richtig/Wahr. wuerde auch mit 1 = 1 gehen oder ‘abc’ = ‘abc gehen. Muss eben etwas gleichsetzen um den Wert True zu geben.

Wie sieht das nun genau aus?

Username=’admin’ UND Passwort=” OR ‘a’ = ‘a’
-> Username admin und Passwort TRUE

Wie sieht das nun in unserem MySQL Query aus?

SELECT * FROM users WHERE user='admin' AND TRUE

Was passiert nun also?

Vielen Dank fuer Ihre Anmeldung, admin. Wenn sie nicht weitergeleitet werden......

Das heißt wir haben uns eingeloggt ohne auch nur ein PW eingeben zu muessen und zwar ganz einfach in dem wir das Query so manipuliert haben das es uns als Admin einloggt. Vorraussetzung ist, dass auf dem Server ist magic_quotes off ist, d.h. Das ein Hochkomma nicht “gebackslasht” wird. Waeren magic_quotes on, dann waere das Hochkomma “gebackslasht” und das wuerde in etwa so aussehen /’

Das ist nur einige Moeglichkeit wie man das Bypassen kann.

Doch wie verhindert man sowas?

Dafuer gibts ein paar Moeglichkeiten, u.a. magic_quotes aufm Server anzustellen oder das Script so zu umschreiben, dass es escaped wird mithilfe von mysql_real_escape_string.

Beispiel:

<?php
$username = mysql_real_escape_string($_POST["username"]);
$password = mysql_real_escape_string($_POST["password"]);
$sql = "SELECT * FROM users WHERE username='" . $username . "' AND password='" . $password . "'";
$response = mysql_query($sql);
?>

Dieses Beispiel sollte denk ich, gegen Login / Auth Bypass schuetzen. Gibt noch andere Moeglichkeiten, aber ich denk das reicht erstmal.

Wer mehr ueber die Schutzweise von mysql_real_escape_string wissen moechte, kann sich die Funktion hier genauer anschauen, auch ein paar Beispiele sind dort: http://de3.php.net/mysql_real_escape_string

So das war mein erstes Tutorial meiner großen Tutorials Reihe, ich hoffe es hat euch gefallen. Freu mich ueber Kritik/Feedback/Verbesserungsvorschlaege.

Vorallem hoff ich, dass es auch Anfaenger einigermaßen verstanden haben 🙂

Mein naechstes Tutorial wird euch nen paar Grundlagen zu XSS erklaeren, wo haeufig XSS Luecken sind und vorallem warum. 🙂