2009-07-12 15 views
2

Ich habe eine Webanwendung mit einer SQL-Injektion als Teil einer INSERT-Anweisung. Es sieht wie folgt aus:SQL Injection in Java und MySQL bei Verwendung mehrerer Abfragen

INSERT INTO table1 VALUES ('str1', 1, 'INJECTION HERE') 

ich die regelmäßig mit mehreren Abfrage Injektionen wie ');truncate table1;-- einfügen können, aber aufgrund der Tatsache, dass Java + MySQL es nicht mehrere Anfragen Stapeln nicht verwendet wird, ermöglicht so die obige Injektion in eine Folge hätte Fehler von MySQL und die zweite Abfrage wird nie ausgeführt.

Im Grunde scheint es, als ob man von einer solchen Injektion in der oben erwähnten Architektur nur "junk-Daten" injizieren kann, was auch ohne Injektion möglich ist.

Es gibt mehr Techniken wie die Verwendung load_file(), aber das würde mir immer noch nicht erlauben, die Datenbank in dem Umfang zu manipulieren, den ich suche.

Fehle ich hier etwas? Gibt es eine andere Möglichkeit, diese Injektion zu verwenden, um die Kontrolle über die Datenbank zu erlangen?

Antwort

2

Natürlich, wenn Sie Ihre Datenbank/Treiber-Kombination von Ihrer aktuellen Implementierung zu etwas ändern, das mehrere Anfragen unterstützt, dann aktivieren Sie ein ruhendes Sicherheitsloch, das (ohne Zweifel) die Leute vergessen haben werden!

die schändlichen, bösartige Szenarien Ignorieren, die oben werden Sie Probleme verursachen mit regelmäßigen Einfügen von Daten, einschließlich der Anführungszeichen usw. dh die oben einfach nicht für bestimmte Sätze von Daten (sofern nicht gereinigt/esaped etc.) funktionieren . Ich würde es nur für die Funktionalität korrigieren.

Sie einen Blick auf PreparedStatement haben sollten und die Dateneinfügungsverfahren für diese (setString()) usw.

zB:

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES 
            SET SALARY = ? WHERE ID = ?"); 
    pstmt.setBigDecimal(1, 153833.00) 
    pstmt.setString(2, "Insert what you like here") 

Die setString() -Methode wird ohne entweichende beliebige Zeichenfolge unterstützen/Injektion Probleme.

1

SQL-Injection muss nicht etwas aus der Datenbank löschen. Der Angreifer möchte möglicherweise wertvolle Daten abrufen, auf die er keinen Zugriff haben soll.

Betrachten wir zum Beispiel die folgende Nacheinspritzung Form (Ich bin nicht vertraut mit MySQL-Syntax, aber so etwas wie dies sollte in der Regel möglich sein - Abgüsse nach Bedarf hinzufügen):

INSERT INTO table1 VALUES ('str1', 1, 
-- injected stuff -- 
'' || (SELECT valuable_info FROM admin_only_table WHERE id=1) || '' 
-- end injected stuff -- 
)) 

Jetzt table1 - Das kann zum Beispiel sein, wo einige öffentlich zugängliche Informationen abgerufen werden, so dass jeder die Werte sehen kann - enthält einen möglicherweise sensiblen Wert von einer vermutlich sicheren Tabelle admin_only_table.

Dies setzt natürlich voraus, dass Ihr Server keine Tricks wie Benutzer-Identitätswechsel ausführt oder die Berechtigungen auf SQL-Ebene für die Abfragen anderweitig einschränkt, sondern alle mit vollen Berechtigungen ausführt.

0

Wie in this post gibt es mehr schlechte Dinge, die für Ihre Anwendung als der klassische Tisch DROP passieren können: Ihre Datenbankverbindungen

  • Anruf eine Sleep-Funktion, so dass alle damit beschäftigt sein, damit Ihre Anwendung machen nicht verfügbar
  • sensible Daten von der DB
  • bypassing the user authentication

Extrahieren Unter dem Strich sollten Sie beim Erstellen von SQL-Anweisungen niemals eine String-Verkettung verwenden. Verwenden Sie eine dedizierte API für diesen Zweck.

Verwandte Themen