jdbc
JDBC - Uttalandeinjektion
Sök…
Introduktion
SQL-injektion är en kodinjektionsteknik, som används för att attackera datadrivna applikationer, där oskäliga SQL-satser infogas i ett inmatningsfält för exekvering (t.ex. för att dumpa databasinnehållet till angriparen).
I det här avsnittet kommer vi att prata om det och dess relation till JDBC-uttalandet.
Uttalande & SQL Injektion ond
Notera i det här exemplet kommer vi att använda PostgreSQL DBMS, men du kan använda valfri DBMS
Vi kommer att använda en databas bd_test
häxa innehåller ett Schema: sch_test
och två tabeller users
och 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
)
Enkel inloggning med uttalande
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();
}
}
Fram till nu är varje sak normal och säker.
Logga in med falska användarnamn och lösenord
Hackaren eller testaren kan helt enkelt logga in eller lista alla dina användare som använder detta:
String username = " ' or ''='";
String password = " ' or ''='";
SKAFFA en ny användare
Du kan infoga data i tabellen med:
String username = "'; INSERT INTO sch_test.utilisateur(id, username, password)
VALUES (2, 'hack1', 'hack2');--";
String password = "any";
RADERA Alla användare
tänk på att hackaren känner till schemat i din databas så att han kan ta bort all din användare
String username = "'; DELETE FROM sch_test.utilisateur WHERE id>0;--";
String password = "any";
DROP-tabellanvändare
Hackaren kan också ta bort ditt bord
String username = "'; drop table sch_test.table2;--";
String password = "any";
DROP DATABASERING
Det värsta är att släppa databasen
String username = "'; DROP DATABASE bd_test;--";
String password = "any";
och det finns många andra.
Varför allt detta?
Allt detta eftersom Statement
är tillräckligt säkert det kör frågan som är det, för det rekommenderas att använda PreparedStatement
istället, det är säkrare att Statement
.
Här hittar du mer information PreparedStatement