jdbc
JDBC - Statement Injection
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