Java脆弱性対策 – SQLインジェクション




SQLインジェクションってなに?

詳しい説明は、後述の参照先をご確認ください。

ざっくり言うと・・・
  • サイトを攻撃するための手法の1つ
  • プログラム内でSQLを組み上げる際の間隙を狙ったニッチ産業
  • プログラム内でSQLを組み上げる際の間隙をついて、攻撃する方法
  • 攻撃者が、データベースを破壊できたり、データを取得、改ざんできたりする

説明より、攻撃例(↓)を見たほうがわかりやすいかもです。。

悪い人になって、SQLインジェクション攻撃をしてみる

ここに、こんなサイトがありました


よくある、サイト内を検索するフォームですね。

試しに、「’」を入力して、検索してみます


攻撃する気はないんです。単なる興味ですよ。「’」を探したいだけなんです。

あらら、エラーページが出てきました。

「データが見つからない」ではなくて、「エラーが発生」しました。
チャンスかもしれません。カモを見つけたようです・・。怪しいので、攻撃してみます。
おかしいなぁ。少し調べてあげよう。悪気はないんですよ。むしろ善意です。

とりあえず、抽出対象テーブルのデータをすべて引き出してみる

「’ or 1=1 or ”=’」を入力して、検索してみます。

やっぱり出てきた( *´艸`) ほうほう。なるほどなるほど。誰かに攻撃される前に、忙しいサイト管理者に代わって、いろいろバックアップしてあげよう。俺って優しいなぁ。
ん~、セキュリティが甘いなぁ。サイト管理者に報告してあげよう。

・・・ということで、攻撃者の目論見通り、データがすべて抽出されます。(OutOfMemoryErrorとかは、さておき・・)
この段階では、テーブル名、項目名はわからないにせよ、攻撃者は、以下のようなSQLを推測しています。

プログラムが発行しているであろうSQL
攻撃により実行されるであろうSQL
ここまで来ると、あとは攻撃者のやりたい放題です(;´Д`)

SQLインジェクションの対策

対策は簡単です。

  • SQLを発行する際は、Statementではなく、PreparedStatementを使う。
  • プレースホルダを使って、SQLに埋め込んだ「?」に、あとから値をセットする。

が・・・、すでに作ってあるアプリケーションを修正するには、心が折れます(*_*;
アプリケーションを作るときは、必ずポリシーを持って、作り始めましょう。

PreparedStatementでアクセスするには?

PreparedStatementでSELECTを発行する方法は、こちらを見てください。

Java PreparedStatementクラスを使ってSQLを発行する

2018.02.22
PreparedStatementでデータを更新する方法は、こちらを見てください。

Java PreparedStatementクラスを使ってデータを更新する

2018.02.23

SQLインジェクションに関わる参考資料

いくつか、SQLインジェクションに関わる説明をされているサイトがありますので、こちらもご確認ください。

参照:SQLインジェクション対策について 情報処理推進機構(IPA)
参照:SQLインジェクション対策の極意はSQL文を組み立てないことにあり CodeZine
参照:今夜分かるSQLインジェクション対策 @IT
参照:SQL インジェクション攻撃とその対策 Microsoft