jdbc
JDBC - Injection de déclaration
Recherche…
Introduction
L'injection SQL est une technique d'injection de code, utilisée pour attaquer des applications pilotées par des données, dans lesquelles des instructions SQL néfastes sont insérées dans un champ d'entrée pour l'exécution (par exemple, pour vider le contenu de la base de données vers l'attaquant).
Dans cette section, nous parlerons de cela et de sa relation avec la déclaration JDBC.
Déclaration et SQL Injection diabolique
Notez que dans cet exemple, nous allons utiliser le SGBD PostgreSQL, mais vous pouvez utiliser n'importe quel SGBD
Nous utiliserons une base de données bd_test
contenant un Schema: sch_test
et deux users
tables et 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
)
Connexion simple avec 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();
}
}
Jusqu'à présent, tout est normal et sécurisé.
Connexion avec faux nom d'utilisateur et mot de passe
Le pirate ou le testeur peut simplement se connecter ou lister tous vos utilisateurs en utilisant ceci:
String username = " ' or ''='";
String password = " ' or ''='";
INSÉRER un nouvel utilisateur
Vous pouvez insérer des données dans votre table en utilisant:
String username = "'; INSERT INTO sch_test.utilisateur(id, username, password)
VALUES (2, 'hack1', 'hack2');--";
String password = "any";
SUPPRIMER Tous les utilisateurs
considérez le pirate connaître le schéma de votre base de données afin qu'il puisse supprimer tous vos utilisateurs
String username = "'; DELETE FROM sch_test.utilisateur WHERE id>0;--";
String password = "any";
Utilisateurs de DROP Table
Le pirate peut également supprimer votre table
String username = "'; drop table sch_test.table2;--";
String password = "any";
BASE DE DONNÉES
Le pire est de laisser tomber la base de données
String username = "'; DROP DATABASE bd_test;--";
String password = "any";
Et il y en a beaucoup d'autres.
Pourquoi tout ça?
Tout cela parce que Statement
n'est pas assez sécurisé, il exécute la requête comme c'est le cas, pour cela il est recommandé d'utiliser PreparedStatement
place, il est plus sécurisé que cette Statement
.
Vous trouverez ici plus de détails PreparedStatement