Suche…


Einführung

SQL-Injection ist eine Code-Injection-Technik, mit der datengesteuerte Anwendungen angegriffen werden, bei der schädliche SQL-Anweisungen zur Ausführung in ein Eingabefeld eingefügt werden (z. B. zum Speichern des Datenbankinhalts für den Angreifer).

In diesem Abschnitt werden wir darüber und seine Beziehung zur JDBC-Anweisung sprechen.

Statement & SQL Injection übel

Beachten Sie, dass in diesem Beispiel PostgreSQL DBMS verwendet wird. Sie können jedoch beliebige DBMS verwenden

Wir werden eine Datenbank verwenden bd_test Hexe enthält ein Schema: sch_test und zwei Tabellen users und test :

CREATE TABLE sch_test.users
(
  id serial NOT NULL,
  username character varying,
  password character varying,
  CONSTRAINT utilisateur_pkey PRIMARY KEY (id)
) 

CREATE TABLE sch_test.test
(
  id serial NOT NULL,
  "column" character varying
)

Einfaches Login mit Statement

static String DRIVER = "org.postgresql.Driver";
static String DB_USERNAME = "postgres";
static String DB_PASSWOR = "admin";
static String DB_URL = "jdbc:postgresql://localhost:5432/bd_test";

public static void sqlInjection() {
    try {
        Class.forName(DRIVER);
        Connection connection = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWOR);
        Statement statement = connection.createStatement();
        String username = "admin";
        String password = "admin";
        String query = "SELECT * FROM sch_test.users where username = '" 
                + username + "' and password = '" + password + "'";

        ResultSet result = statement.executeQuery(query);

        if (result.next()) {
            System.out.println("id = " + result.getInt("id") + " | username = "
                    + result.getString("username") + " | password = " + result.getString("password"));
        }else{
           System.out.println("Login not correct");
        }

    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}

Bis jetzt ist alles normal und sicher.

Melden Sie sich mit falschem Benutzernamen und Passwort an

Der Hacker oder der Tester kann sich einfach anmelden oder alle Benutzer mit dieser Liste auflisten:

String username = " ' or ''='";
String password = " ' or ''='";

FÜGEN Sie einen neuen Benutzer ein

Sie können Daten in Ihre Tabelle einfügen mit:

String username = "'; INSERT INTO sch_test.utilisateur(id, username, password) 
                        VALUES (2, 'hack1', 'hack2');--";
String password = "any";

LÖSCHEN Alle Benutzer

Beachten Sie, dass der Hacker das Schema Ihrer Datenbank kennt, damit er alle Benutzer löschen kann

String username = "'; DELETE FROM sch_test.utilisateur WHERE id>0;--";
String password = "any"; 

DROP Table-Benutzer

Der Hacker kann Ihre Tabelle auch löschen

String username = "'; drop table sch_test.table2;--";
String password = "any";

DROP-DATENBANK

Das Schlimmste ist das Löschen der Datenbank

String username = "'; DROP DATABASE bd_test;--";
String password = "any";

und es gibt viele andere.

Warum das alles?

Da Statement nicht so sicher ist, dass es die Abfrage so ausführt, wie es ist, wird empfohlen, stattdessen PreparedStatement zu verwenden. PreparedStatement ist jedoch sicherer als Statement .

Weitere Informationen finden Sie hier PreparedStatement



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow