SQL Injection noch möglich?

Ich arbeite mit Visual Basic und MySQL, später auch Oracle. Ich darf diese Frage hier oben nochmals anführen, da sie unten als Antwort zu Chondron vielleicht nicht mehr gesehen wird.

Ich übergebe die Daten an den Server, vereinfacht, durch:

call myProc(’„wert1“,„wert2“,„wert3“’);

Zuvor aber ersetze ich %,,& und alle Hochkommas durch %a,%b,%c,usw.

MySQL übernimmt in der Proz. den Parameter myString und zerteilt ihn:

set @myVar = ELT(1,myString);
set @myVar = func_retrieve_orig_chars(@myVar); # Rückübersetzung
update tab set col = @myVar;

Kann mir dabei noch irgendetwas passieren? Ist hierbei noch SQL Injection möglich? Gibt es noch weitere Zeichen, die ich ersetzen sollte?

Gruß Fralang

Moin moin,

Zuvor aber ersetze ich %,,& und alle Hochkommas durch
%a,%b,%c,usw.

ab hier ist also

MeiPasswort; DELETE * FROM tab /* delete */

update tab set col = @myVar;

update tab set col = MeiPasswort; DELETE * FROM tab /* delete */

was hilft dir eine wandlung die du wieder rückübersetzt ? du sollst etwas escapen was eine bedeutung hat soll nun keine mehr haben und nicht hin und her wandeln bis es wieder original ist.

Ein paar Beispiele von injection http://www.erich-kachel.de/?p=223
Dann noch probleme bei PHP z.b. addslashes
http://shiflett.org/blog/2006/jan/addslashes-versus-…

und so weiter :smile:

oder meinst du das so
Eingabe :
';DELETE * FROM tab /* delete ’
daraus wird :
‚‘;DELETE * FROM tab /* delete ‚‘
was dann zu
%a%a;DELETE * FROM tab /* delete %a%a
und wieder zurück
‚‘;DELETE * FROM tab /* delete ‚‘
und einsetzen

update tab set col = @myVar;

update tab set col = ‚‘;DELETE * FROM tab /* delete ‚‘

probier doch einfach mal aus . hack dich selber :smile:

Hmm nun bin ich mir nicht sicher bei prozeduren ob es eher

';DELETE * FROM tab /* delete ’

';DELETE * FROM tab # delete ’

sein sollte um ein kommentar einzuleiten

Moin, moin Thomas,

';DELETE * FROM tab # delete ’

ja, mit # beginnt der Kommentar

update tab set col = @myVar;
update tab set col = MeiPasswort; DELETE * FROM tab /* delete */

Ds passiert nicht, SQL interpretiert den Inhalt einer Variablen nicht mehr. Man kann eine Variable im Update-Befehl einsetzen und ihr Inhalt wird eins zu eins übertragen.

Interpretiert wird nur einmal der eingegebene String der den SQLBefehl enthält. Beispiel ich gebe ein statt:

update tab set col = „wert“
update tab set col = „wert“;delete * from tab #"

Dann macht der SQLServer bei der Ubernahme des Befehls daraus:

update tab set col = „wert“;delete * from tab #"

Dann ists passiert. Ich übergebe aber:

call myproc(„wert%a%b;delete * from tab #“)

Hier findet SQL nichts zu interpretieren und setzt das so in die Variable, die ich als Parameter angebe, ein. Diese Variable verwandle ich dann wieder zurück. Normalerweise genügt es, statt %a%b nur zu escapen mit \", dann bräuchte ich nicht zurückverwandeln, aber ich übergebe inWirklichkeit noch etwas komplizierteres: eine varabel lange Liste von Werten:

… paramerter1,’„wert1“,„wert2“,„wert3“’,paramerter3, …

Wenn nun innerhalb der werte Doppelhochkommas stehen, kann die ELT-Funktion die Werte nicht mehr ermitteln. Deshalb die Ersetzung mit den Prozenzeichen.

Gruß Fralang

Hallo,

Kann mir dabei noch irgendetwas passieren? Ist hierbei noch
SQL Injection möglich? Gibt es noch weitere Zeichen, die ich
ersetzen sollte?

in Java kann man das Probelm mit PreparedStatements umgehen, dabei braucht man sich um die zu escapenden Zeichen keine Gedanken machen. Mit Visual Basic kenne ich mich nicht aus, aber es gibt wohl etwas ähnliches: http://de.wikipedia.org/wiki/SQL-Injection#Visual_Ba…

Gruß
Heavy

Es geht hier direkt um SQL code :smile:
In dem Fall ist die Methode mit Variablen eine sichere.

Danke für die Hinweise.

Mit Visual Basic kenne ich mich nicht aus,
aber es gibt wohl etwas ähnliches:

Gibt es:

.CommandText = „SELECT spalte1 FROM tabelle WHERE spalte2=?“
.Parameters.Append .CreateParameter(„paramSp2“, adVarChar, :adParamInput, 25, spalte2Wert) '25 ist die max. länge

Ein Problem habe ich mit einer variablen Zahl an Parametern.

myLoop: loop
set @colName = ?;
set @newValue = ?;

erzeuge den Updatebefehl

end loop;

Die Fragezeichen werden nur 1x ersetzt.

Gruß Fralang

Habe das nicht getestet, aber dieses Beispiel verwendet IMHO ein Array von Parametern mit dem mehrere Fragezeichen ersetzt werden: http://www.clarksoncs.com/Samples/ADOParamQ.htm (runterscrollen zu Sub TwoParameters())

Gruß
Heavy