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



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow