VBS Injection Exploit

  • Themenstarter Themenstarter Revenant
  • Beginndatum Beginndatum
R

Revenant

Guest
Hi,

ich habe nicht viel Ahnung davon, aber wenn ich das Prinzip richtig verstanden habe sollte folgendes eigentlich funktionieren:

Code:
OPTION EXPLICIT
DIM name, passwort       'Variablendeklaration

name = inputbox("Name eingeben:")              'ließt den Benutzernamen ein
passwort = inputbox("Passwort eingeben:")  'ließt das Passwort ein

'Die Passwortabfrage
IF name = "admin" AND passwort = "abc" THEN msgbox "Exploited!"


Das ist ein kleines VBS-Script. Ihr könnt es abspeichern (z.B. injection.vbs) und ausführen. Gibt man die richtigen Daten ein so erhält man die Meldung "Exploited!". Das Programm funktioniert also. Lediglich die Sache mit dem Exploit... hm

Wenn ich anstatt des Passworts: FALSE OR TRUE OR "a" eingebe komme ich nicht zum Erfolg. Warum?

Theoretisch steht doch jetzt in der Zeile:

Code:
IF name = "admin" AND FALSE OR TRUE OR "a" = "abc" THEN msgbox "Exploited!"

Das heisst die Bedingung müsste immer TRUE sein
 
oki ich gebe zu hab kein plan von vbs...

aber ich erklär mir das so:

das deine variabel die geholt wird in einen reellen string umgewandelt wird sprich also string behandelt wird und net als befehl
 
versuche zu allerest mal mit einer msgbox einen text mit einem anführungzeichen auszugeben. meinetwegen a"a. wenn du nun im quellcode schreibst:
msgbox "a"a"

bekommst du einen fehler, da der string eigentlich nach dem zweiten anführungzeichen aufhört. also musst du jedes anführungzeichen dass du in einen string schreiben willst mit einem Fluchtzeichen umschreiben:
msgbox "a""a"

doppelte anführungzeichen in einem string werden unter vb als ein anführungzeichen interpretiert. und nun zu deinem problem:

wenn du dieses FALSE OR TRUE OR "a" eingetippt hast, wird dieser string in die variable passwort übergeben. also:
passwort = "FALSE OR TRUE OR ""a"""
(am ende stehen drei anführungszeichen: zwei als fluchtzeichen für ein anführungzeichen und das letzte als indikator, dass der string zu ende ist)

wenn wir nun in der betreffenden zeile den variablennamen durch seinen inhalt ersetzen (wie es während der laufzeit gemacht wird), erhalten wird folgendes:
IF unwichtig AND "FALSE OR TRUE OR ""a""" = "abc" THEN msgbox "Exploited!"

hier wird nun der string FALSE OR TRUE OR ""a"" mit dem string abc verglichen, was natürlich ein false zurück gibt. und da man als user admin eingegeben wurde steht nun da:
If TRUE AND FALSE Then Msgbox ("Exploited!")
und das ist leider false ;)

was als nächtes kommt ist warscheinlich die frage warum's dann aber bei mysql tut ^^

ich hoffe es hat geholfen :)

mfg NT
 
Geht nach meiner meinung sowieso nicht da VBS kein PHP + SQL ist. VBS packt die eingabe automatisch in nen string der dann "unschädlich" ist
 
Jo Jungs,

Ihr habt wahrscheinlich Recht. Liegt wohl daran dass VBS die Eingabe als String behandelt.


Stellt sich als nächstes die Frage, ob man dieses 'Problem' umgehen kann.

Durch die Eingabe von:
anything"" = ""anything"" OR TRUE OR ""anything""

müsste im Code dann folgendes stehen:

IF name = "admin" AND "anything"" = ""anything"" OR TRUE OR ""anything""" = "abc" THEN msgbox "Exploited!"

wenn jetzt doppelte anführungszeichen in einem string wie ein einziges anführungszeichen behandelt werden müsst das ganze so aussehn:

IF name = "admin" AND "anything" = "anything" OR TRUE OR "anything" = "abc" THEN msgbox "Exploited!"

d.h.:

IF FALSE AND TRUE OR TRUE OR FALSE


Puh... Das heisst doch dass die Bedingung immer TRUE sein müsste. :rolleyes:


Ausserdem: warum wird bei PHP nicht genauso verfahren wie bei VBS? Würden alle Eingaben gleich als String behandelt werden könnte man sich den ganzen Ärger sparen.

mfG
 
Ich denke das ist so (meine Theorie kann aber auch total falsch sein)

Der PHP-Interpreter wandelt zuerst alle Variablen in den String um also steht anstatt
mysql_query("INSERT INTO" . $foo . " (bla1, bla2) VALUES (" . bla1 . ", " . bla2 ");");
folgendes
mysql_query("INSERT INTO Hallo (bla1, bla2) VALUES (test, test2);");
Erst danach wird die Funktion aufgerufen und dadurch wäre es leicht möglich den Befehl zu fälschen.

Bei VBS hingegen wird jede Variable im Ram gespeichert.
Die Variable wird dann mit der 2 Variable über irgendeinen Befehl (zb vbaStrCmp) überprüft.
Dabei kommt die Variable aber nie richtig mit dem Programmsource zusammen.
 
das problem tritt einfach deshalb auf, weil mysql_query() einen string als argument erhaelt und diesen an die mysql datenbank weitergibt. fuer php ist da nur ein string drin, genauso wie fuer vbs in der eingabe aus der inputbox nur ein string drin ist. als code interpretiert wird das sql statement erst von der datenbank. wenn das vbs die eingabe an eine sql datenbank weitergeben wuerde oder einen aufruf wie z.b. system() machen wuerde um kommandozeilentools zu starten, dann waere die situation vergleichbar.
in php funktioniert das ganze genauso.

Code:
$foo = 1;
$bar = 2;
print "ergebnis: " . $foo . " + " . $bar;

die ausgabe hier ist 1 + 2 und nicht 3.
 
Original von The Dude
das problem tritt einfach deshalb auf, weil mysql_query() einen string als argument erhaelt und diesen an die mysql datenbank weitergibt. fuer php ist da nur ein string drin, genauso wie fuer vbs in der eingabe aus der inputbox nur ein string drin ist. als code interpretiert wird das sql statement erst von der datenbank. wenn das vbs die eingabe an eine sql datenbank weitergeben wuerde oder einen aufruf wie z.b. system() machen wuerde um kommandozeilentools zu starten, dann waere die situation vergleichbar.
in php funktioniert das ganze genauso.

Code:
$foo = 1;
$bar = 2;
print "ergebnis: " . $foo . " + " . $bar;

die ausgabe hier ist 1 + 2 und nicht 3.


SEHR GUT, SEHR GUT. Jetzt is mir alles klar. Wirklich sehr interessant. Dass das Ganze bei asp geht wusste ich nämlich. Hintergrund ist: Ich wollte das Ganze auf VBS transferieren (wir arbeiten bei uns an der Schule mit vbs) und bei einem Referat erklären. Bleibt wohl nur noch die Möglichkeit es an asp festzumache. Gut die beiden Sprachen sind ja sehr ähnlich.


Vielen Dank

mfG


E: mein Gott eigentlich ist die Lösung so simpel... trotzdem staun ich immer wieder über den Skill von euch hier
 
Zurück
Oben