jdbc
JDBC - ステートメント注入
サーチ…
前書き
SQLインジェクションは、データ駆動型アプリケーションを攻撃するために使用されるコードインジェクション技術であり、悪意のあるSQL文が入力フィールドに挿入されて実行されます(データベースの内容を攻撃者にダンプするなど)。
このセクションでは、そのことについて、そしてJDBCステートメントとの関係について説明します。
ステートメントとSQLインジェクションの悪
我々はPostgreSQLのDBMSを使用しますが、任意のDBMSを使用することができます。この例では注意してください
私たちはSchema: sch_test
含むデータベースbd_test
witchを使用しますSchema: sch_test
と2つのテーブルの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
)
ステートメントを使用した簡単なログイン
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テーブルのユーザー
ハッカーはあなたのテーブルを削除することもできます
String username = "'; drop table sch_test.table2;--";
String password = "any";
DROPデータベース
最悪なのは、データベースを削除することです
String username = "'; DROP DATABASE bd_test;--";
String password = "any";
他にもたくさんあります。
なぜこのすべてですか?
Statement
は十分安全ではないので、 PreparedStatement
代わりに使用することをお勧めします。そのため、 Statement
はより安全です。
詳細はこちらPreparedStatement
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow