#author("2024-08-24T21:01:19+09:00","default:k1rou","k1rou") #author("2024-08-24T21:02:54+09:00","default:k1rou","k1rou") *SQLインジェクション とは [#e0c86690] **名称 [#c1407e07] -SQL Injection **概要 [#t43de739] -WebページのフォームにSQLを含めた不正な入力データを与えることで、データベースへの不正なアクセスを実行させる攻撃。 -WebページのフォームにSQLを含めた不正な入力データを与えることで、データベースへの不正なアクセスを実行させることができてしまうWebアプリケーションの[[脆弱性]] -CWE-89 *SQLインジェクションの分類 [#j86c9ead] -エラーメッセージを利用 --SQLの構文エラー等を発生させる原因として、SQLの値を指定する箇所に漏洩対象の情報を差し込むようにすることで、出力されるエラーメッセージに情報を出力させる。 -和集合(union select)を利用 --実行されるSQLに和集合で漏洩対象のデータを抽出するselect文を差し込む事で、差し込んだselect文の実行結果で情報を出力させる。 -認証を回避 --認証で使われるSQLの抽出条件の式を成立(true)する文字列を差し込むことで、正しいIDとパスワードを入力しなくても、ログイン成功させる。 --SQLの抽出条件の式を成立(true)にする差し込み文字列 ' or '1'='1 -終了記号(;)を利用 --実行されるSQLの抽出条件に、差し込みたい任意のSQLの直前に終了記号(;)を付けた文字列を差し込むことで、任意のSQLを実行させる。(select文, delete文, update文など) -OSコマンドを実行 --終了記号(;)とOSコマンドを付けた文字列を差し込むことで、OSコマンドを実行させる。 --DBエンジンによって、当操作が実行できるものとできないものがある。 *対策 [#e1b37fca] -バインド機構を使う --SQLの変数部分にプレースホルダを使う(プリペアードステートメント) --プレースホルダ:「?」などの特殊文字。 --SQLの実行時にプレースホルダに値を割り当てて処理する方法 -バインド機構を使わない場合は、入力値をエスケープ処理する。 --サニタイジング([[サニタイズ]]) --SQLで特別な意味のある文字([[メタキャラクタ]])をエスケープ処理する。 ---「'」->「''」 ---「;」->「\;」 ---「%」->「\%」 ---「+」->「\+」 -詳細なエラーメッセージをブラウザに送らない --データベースの種類やエラーコード、エラー原因などサーバーの環境が判別できるようなエラーメッセージ -データベースへのアクセス権限が最小限となるよう設定する --アカウントが最小限のクエリしか発行できないようにする -[[WAF]]を使う *ツール [#p55023a9] ***sqlmap [#c9908613] -https://sqlmap.org/ -https://github.com/sqlmapproject/sqlmap *SQLインジェクション事件 [#g399c4c3] -セキュリティ対策が不十分であることでシステム開発業者が債務不履行責任を問われた判例 -東京地判平成26年1月23日判時2221号71頁 *関連サイト [#z7368e49] -CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')~ https://cwe.mitre.org/data/definitions/89.html -CWE-89 SQLインジェクション [[JVN]]~ https://jvndb.jvn.jp/ja/cwe/CWE-89.html -The Lord of the SQLI~ SQLI injection の演習問題サイト~ https://los.rubiya.kr/ *関連用語 [#o51d97b0] -[[インジェクション]] -[[脆弱性]] -[[セキュリティ]]