sql injection mit real_escape und md5

Hallo allerseits

Ich versuche auf der Seite w3challs.com die Aufgabe "hacking/a basic vulnerability". Man hat den Source Code der Seite zur Verfügung, die wesentliche Zeile:

PHP:
$query = sprintf("SELECT * FROM haxorz_memberz WHERE login = '%s' AND password = MD5('%s')",
		mysql_real_escape_string($_POST['login']),
		$_POST['password']
	);

Meine bisherigen Bemühungen:

Ich habe gesehen, dass mysq_real_escape_string() umgangen werden kann. Allerdings wird dafür davon ausgegangen, dass mysql GBK als charset verwendet (sofern ich das richtig verstanden habe).
Auch eine Umgehung von md5() habe ich gefunden, doch dafür musste das Argument $raw_input von md5() true übergeben.

Jetzt fehlt mir ein Ansatz, denn beides ist hier nicht gegeben. Ich habe auch selber, lokal, versucht mysql_real_escape_string zu umgehen, ohne Erfolg. Ich denke dass dort die angebotene Schwachstelle ist, denn im Web reagiert man geradezu hysterisch, wenn diese Funktion zur Sprache kommt. Da kann doch die Einstellung irgend eines chinesischen Zeichensets nicht ihre einzige Schwäche sein.

Kann mir da jemand weiterhelfen?

Grüsse
 
Nice,
was zum beschäftigen inlangen, kalten, einsamen Nächten. :)
Zu deinem Problem(zuviel hilfe macht dann ja keinen Spass mehr):
Du könntest zum Beispiel die Logik um ein OR erweitern und die MD5-Sache vorzeitig abschließen.
Die SQLi ist eigentlich simple du brauchst nur ein "')" an der richtigen Stelle und entsprechenden SQL-Befehl in der Mitte, mit "--" abschließen ist gut.

Du denkst viel zu kompliziert.
Schau dir einfach nur die Query an, das Passwort wird nicht gefiltert.
Cheers
 
Hallo Fluffy

Vielen Dank für deine Antwort!
Leider komme ich heute nicht mehr dazu, weiter zu probieren, werde es aber morgen nochmals versuchen.
Danke auch für deine Hinweise.
Ich werde mich dann nochmals melden.

Grüsse
 
Hallo

Ich hab es mit deiner Hilfestellung hinbekommen :thumb_up:.
Ich werde mich wohl schon bald mit weiteren Fragen hier melden.

Eine Anschlussfrage noch:
Wenn man die Aufgabe modifiziert und das Passwort mit real_escape ebenfalls filtert, wäre ich dann auf der richtigen Spur gewesen? Resp. dann wird es in der Tat ziemlich kompliziert, korrekt?

Grüsse
 
Keine Ahnug, glaube aber eher nicht.
Ich bin kein Pentester, sondern Entwickler und deine Ideen gehen eher in Richtung von Ausnutzen der Serverkonfiguration(Backend, Libraries), also Dev-Ops. Und das kann beliebig kompliziert werden.
Davon ab weiss jeder Sysadmin der sein Salz wert ist um solche speziellen Grenzfälle und wiso sollte man ausgerechnet GBK als charset auswählen?
Passwörter sind eher selten chinesich, schon alleine aufgrund der Tastaturen. Längere Texte schon eher und dann auch nur in besonderen Breitengraden.
Wobei ich nicht weiss was du mit $raw_input meinst, so ohne weiteres kannst du beim Auslesen einer Variable nicht die Variable ändern und MD5() hat in MySQL keinen 2. Parameter https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_md5

Normalerweise hast du keinen Einblick in den Quellcode und du weisst nicht wie das Passwort verarbeitet wird.
Ich könnte zB eine Hashfunktion von PHP benutzten, da ist es dann egal was du eingibst es wird nie zu einer SQLi kommen.

In so einem Fall würde man also nicht Versuchen mit der Axt durch eine Stahltür zu schneiden, sondern man sucht sich einen anderen Eingang, weil man nicht weiss wie es abgesichert ist und ob es in der speziellen Query überhaupt einen Weg hinein gibt.

Kommt dann natürlich auch auf die Motivation des Angreifers an und wie gut die SysAdmins ein Auge auf hoffentlich vorhandene Logs haben.
Gruß

Fluffy
 
Hey Fluffy

Danke für die Antwort. Ja eben, dachte ich eben auch, wer verwendet schon ein chinesisches Zeichenset.

Zur $raw_output (sorry, nicht input) Sache:
Es geht um die md5 funktion von PHP. Ich habe den entsprechenden Link bisher noch nicht wieder gefunden, werde ihn aber nachreichen wenn ich ihn finde:
Grob ging es darum, dass es möglich war, durch raw_ouput "||" als Ausgabe der PHP md5 funktion zu erzeugen. Dadurch kam dann die injection zustande (es war ein write-up zu einer Aufgabe aus einem CTF und der Quelltext stand da auch zur Verfügung).

Grüsse
 
Zurück
Oben