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



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow