Zoeken…


Invoering

SQL-injectie is een techniek voor code-injectie, die wordt gebruikt om datagestuurde toepassingen aan te vallen, waarbij schadelijke SQL-instructies worden ingevoegd in een invoerveld voor uitvoering (bijvoorbeeld om de database-inhoud naar de aanvaller te dumpen).

In deze sectie zullen we daarover praten en de relatie met JDBC Statement.

Statement & SQL Injection kwaad

Merk op dat we in dit voorbeeld PostgreSQL DBMS zullen gebruiken, maar u kunt elk DBMS gebruiken

We zullen een database gebruiken bd_test die een Schema: sch_test en twee tabellen users en 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
)

Eenvoudig inloggen met behulp van 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();
    }
}

Tot nu toe is alles normaal en veilig.

Login met valse gebruikersnaam en wachtwoord

De hacker of de tester kan eenvoudig inloggen of een lijst maken van al uw gebruikers met behulp van dit:

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

PLAATS een nieuwe gebruiker

U kunt gegevens in uw tabel invoegen met:

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

DELETE Alle gebruikers

denk eraan dat de hacker het schema van uw database kent, zodat hij al uw gebruikers kan verwijderen

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

DROP-tafelgebruikers

De hacker kan ook uw tabel verwijderen

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

DROP DATABASE

Het ergste is om de database te laten vallen

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

en er zijn er nog veel meer.

Waarom dit allemaal?

Dit alles omdat Statement niet veilig genoeg is om de zoekopdracht uit te voeren zoals het is, omdat het wordt aanbevolen om PreparedStatement gebruiken, het is veiliger dan die Statement .

U vindt hier meer informatie PreparedStatement



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow