jdbc
JDBC - Verklaring injectie
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