Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: SQL Injektion

  1. #1
    Youngster
    Registriert seit
    10.09.2006
    Beiträge
    17
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard SQL Injektion

    Ein Freund hat mir erzählt ich muß meinen Script mit "SQL Injektion"
    überarbeiten, sonst ist meine Datenbank nicht sicher.
    Wißt ihr wie das geht, an folgenden Beispiel: (Ausschnitt)

    $userda1 = mysql_query ("SELECT * FROM db_user WHERE username = '$newuser'");

    oder

    $userda= mysql_num_rows($userda1); if ($userda>="1")


    Danke.
    mfg
    Peter
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Forum Guru
    Registriert seit
    28.12.2004
    Ort
    Ringgenberg(bei Interlaken) / Schweiz
    Beiträge
    4.787
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    injections gehen nur bei insert befehlen...

    das heist, falls du nicht abgesicherte query`s hast, kannst damit echt böse dinge machen...

  3. #3
    Kaiser(in)
    Registriert seit
    09.12.2005
    Alter
    29
    Beiträge
    2.496
    Danke
    1
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    ich dachte das geht mit jedem query, da man die befehle doch mit simikolon trennen kann oder ?
    also SELECT * FROM db_user WHERE username = 'klaus'; DELETE FROM db_user WHERE 1='1;

    $newuser = klaus'; DELETE FROM db_user WHERE 1='1
    Sei immer du selbst. Außer du kannst Batman sein. Sei immer Batman!

  4. #4
    Kaiserliche Hoheit
    Registriert seit
    15.07.2005
    Ort
    Hagen (NRW)
    Beiträge
    1.515
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Weder das eine noch das andere ist ganz korrekt.

    1. PHP kann nicht mehrere Querys in einem String ausführen (seit Version ka.) - da könnt ihr da Semikolons reinkloppen wie ihr lustig seit, es geht nicht.
    2. Nehmen wir mal an wir haben einen Query ala
    Code:
    $SQL = "SELECT * FROM benutzertabelle WHERE benutzername LIKE '{$_REQUEST['user']}' AND passwort = '{$_REQUEST['passwort']}' LIMIT 1"
    Jetzt könnte man sich einloggen indem man als username folgendes eingibt:
    Code:
    ' OR 1 --
    das Passwortfeld lässt man leer oder trägt irgendetwas ein.

    Der Query sieht dann so aus:
    Code:
    $SQL = "SELECT * FROM benutzertabelle WHERE benutzername LIKE '' OR 1 -- ' AND passwort = 'irgendetwas' LIMIT 1"
    Da -- in MySQL der Beginn für ein Kommentar ist würde nur noch dieser Query an die Datenbank geschickt werden:
    Code:
    $SQL = "SELECT * FROM benutzertabelle WHERE benutzername LIKE '' OR 1
    Da 1 immer true ist ist der hintere Teil der WHERE Bedingung erfüllt. Es werden also automatisch ALLE Datensätze zurückgegeben die in der Datenbank sind. Möchte man nur den ersten Datensatz haben den MySQL findet - z.B. um sich einzuloggen - so nutzt man
    Code:
    ' OR 1 LIMIT 1
    als Benutzernamen. Jetzt wird man - sofern im Script keine weitere Prüfung stattfindet - automatisch als der erste gefundene Benutzer angemeldet (das Beispiel kann mit ein paar Modifikationen auch bei aktivem magic_quotes funktionieren)

    Um einen solchen Angriff zu verhindern kann man nur dafür sorgen dass 1. der Passwortvergleich im PHP Script stattfindet und nicht bereits über den MySQL Query und 2. man konsequent dafür sorgt, dass alle möglichkeiten ein ', " oder sonstiges quot einzuschleusen dicht sind.
    Zoggerforum.de Betreuer * Mod @ ibforen.de * Admin @ daoc-ds.de
    ICQ Nummer kann via PN erfragt werden

  5. #5
    Forum Guru
    Registriert seit
    28.12.2004
    Ort
    Ringgenberg(bei Interlaken) / Schweiz
    Beiträge
    4.787
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    ja und da begrenze man doch einfac hdie query`s mit:

    Dann schaut das ganze so aus:

    Ordnungsgemäs:
    $sql ='SELECT `id`, `rabatt` FROM `user_login` WHERE `login`="GreenRover" AND `passwort`=MD5("geheim") LIMIT 0 , 1';

    Inject versuch:
    $sql ='SELECT `id`, `rabatt` FROM `user_login` WHERE `login`="GreenRover\" --" AND `passwort`=MD5("geheim") LIMIT 0 , 1';

    da man ja immer noch das auto entquote von PHP hat und daher der inject versuch zur sau ist.....

  6. #6
    Kaiserliche Hoheit Avatar von No0ob
    Registriert seit
    02.01.2006
    Ort
    Nähe Frankfurt
    Beiträge
    1.500
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Zitat Zitat von GreenRover
    injections gehen nur bei insert befehlen...
    Stimmt nicht.
    Entweder eine Funktion schreiben oder die Funktion mysql_real_escape_string benutzen

  7. #7
    Forum Guru
    Registriert seit
    28.12.2004
    Ort
    Ringgenberg(bei Interlaken) / Schweiz
    Beiträge
    4.787
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    vorgabe:

    $sql ='SELECT `id`, `rabatt` FROM `user_login` WHERE `login`="'.$_GET['user'].'" AND `passwort`=MD5("'.$_GET['password'].'") LIMIT 0 , 1';


    So nb0ob: liefer nun mal den beweis das heist die eingaben für die beiden get vars um fäschlich eun zu loggen oder zu schaden..

  8. #8
    Kaiserliche Hoheit
    Registriert seit
    15.07.2005
    Ort
    Hagen (NRW)
    Beiträge
    1.515
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Wie gesagt, ist magic_quotes längst nicht auf allen Systemen aktiv oder funktioniert dort einwandfrei.

    Desweiteren wäre dies jetzt lediglich ein Beispiel. Viele Integerwerte sind beispielsweise nicht mit quot versehen... - wenn diese nun via get erst eingelesen werden bieten sie eine gute Angriffsfläche.

    Man brauch sich ja nur ansehen, was mittlerweile so alles an exploids veröffentlicht wurde...
    Zoggerforum.de Betreuer * Mod @ ibforen.de * Admin @ daoc-ds.de
    ICQ Nummer kann via PN erfragt werden

  9. #9
    Kaiserliche Hoheit Avatar von No0ob
    Registriert seit
    02.01.2006
    Ort
    Nähe Frankfurt
    Beiträge
    1.500
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Zitat Zitat von GreenRover
    $sql ='SELECT `id`, `rabatt` FROM `user_login` WHERE `login`="'.$_GET['user'].'" AND `passwort`=MD5("'.$_GET['password'].'") LIMIT 0 , 1';
    Ich meinte das gar nicht mal so böse GreenRover aber nun ja :-/

    SQ-Injection kann man nur in der Domain machen, das heisst, ich müsste sehen wie das ausgegeben wird. Bei so internen Sachen, kann es so genug sein, würde ich mich allerdings auch nicht darauf verlassen.

    Wenn du also z.B. ein Link mit SELECT ID FROM user_list WHERE ID = 4 hast, kann man das dann in der URL z.b so sehn:
    Das könnte man z.B. so umändern.
    Dazu muss man natürlich den Tabellennamen wissen.
    Ich hoffe das stimmt so.

  10. #10
    Kaiserliche Hoheit
    Registriert seit
    15.07.2005
    Ort
    Hagen (NRW)
    Beiträge
    1.515
    Danke
    0
    Bekam 0 mal "Danke" in 0 Postings

    Standard

    Der Query hört bei dem Semikolon auf. MySQL schert sich einen feuchten .... um den Teil DROP TABLE user_list.

    Via PHP führt MySQL nur noch maximal einen Query je mysql_query Befehl aus. Genau um sowas zu vermeiden
    Zoggerforum.de Betreuer * Mod @ ibforen.de * Admin @ daoc-ds.de
    ICQ Nummer kann via PN erfragt werden

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •