jdbc
JDBC - Инъекция заявлений
Поиск…
Вступление
SQL-инъекция - это метод впрыска кода, используемый для атаки приложений, управляемых данными, в которых в исходное поле исполняются гнусные инструкции SQL (например, для сброса содержимого базы данных злоумышленнику).
В этом разделе мы поговорим об этом и его отношении с заявлением JDBC.
Заявление и SQL Injection evil
Примечание. В этом примере мы будем использовать СУБД PostgreSQL, но вы можете использовать любую СУБД
Мы будем использовать базу данных bd_test
ведьма содержит Schema: sch_test
и две таблицы users
и 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
)
Простой вход в систему с использованием 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();
}
}
До сих пор все нормально и безопасно.
Вход с псевдонимом и паролем
Хакер или тестер могут просто войти или перечислить всех ваших пользователей, используя это:
String username = " ' or ''='";
String password = " ' or ''='";
INSERT новый пользователь
Вы можете вставлять данные в таблицу, используя:
String username = "'; INSERT INTO sch_test.utilisateur(id, username, password)
VALUES (2, 'hack1', 'hack2');--";
String password = "any";
УДАЛИТЬ Все пользователи
подумайте, хакер знает схему вашей базы данных, чтобы он мог удалить всех ваших пользователей
String username = "'; DELETE FROM sch_test.utilisateur WHERE id>0;--";
String password = "any";
Пользователи DROP Table
Хакер также может удалить таблицу
String username = "'; drop table sch_test.table2;--";
String password = "any";
DROP DATABASE
Хуже всего - отказаться от базы данных
String username = "'; DROP DATABASE bd_test;--";
String password = "any";
и есть много других.
Почему все это?
Все это из-за того, что Statement
недостаточно безопасен, он выполняет запрос, как и он, поэтому рекомендуется использовать PreparedStatement
, более безопасно это Statement
.
Вы можете найти здесь подробности PreparedStatement