なんだかんだしている間にqiitaで投稿する機会を失っていたので、細々と表題についてまとめていきたいと思います。
きっかけ
身近なところでSQLインジェクションが起こってしまったため、これを機会に興味を持ったというのが理由になります。
SQLインジェクションとはなにか
IPAにはこう記されています
データベースと連携したウェブアプリケーションの多くは、利用者からの入力情報を基にSQL文(データベースへの命令文)を組み立てています。ここで、SQL文の組み立て方法に問題がある場合、攻撃によってデータベースの不正利用をまねく可能性があります。このような問題を「SQLインジェクションの脆弱性」と呼び、問題を悪用した攻撃を、「SQLインジェクション攻撃」と呼びます。
SQLインジェクションの割合について調べていたところ、ある記事によれば11%、12%ほどの割合である
1700万件というところで昨年度から攻撃件数が3倍までに増えたという記事を見たので、安易にサーバー攻撃ができることで脆弱性のあるシステムが放置されたままの現状が多い今、件数が増えてきている要因の一つではないのでしょうか。
どのようにSQLインジェクションが起こってしまうのか
まず攻撃者は脆弱性のあるwebアプリケーションを探すところから始めます。
脆弱性のある可能性があるwebアプリケーションというのはダークウェブマーケット等で安易に入手することもできるっぽいので、どこでデータが漏れているかが分からない大規模開発やセキュリティルールがルーズだったりすると結構危ないということが分かりますね
脆弱性のあるwebアプリケーションを見つけた場合、SQLインジェクション攻撃が起こる場合、情報をサーバーに送信されることが多い【入力フォーム】などから不正なSQL文を入力されて事態が起こってしまいます。
不正なSQL文とは
では一体どのようなSQL文を入力されると不正なSQL文が成立してしまうのか
SELECT * FROM hoge_users WHERE id = 'hogehoge';
例えば上記はidがhogehoge だった場合に hoge_users
のレコードをとってこれる処理が上記の処理になります。
しかしこれでは 不正なSQL文が起こってしまいます。
以下が不正なSQL文に書き換えられた処理となります。
SELECT * FROM hoge_users WHERE id = 'MOKE' OR 'MOKE' = 'MOKE';
以下の記述では条件が常にtrueとなってしまうので命令が実行されるとデータベースから全てのユーザー情報が抽出されてしまいます。
'MOKE' OR 'MOKE' = 'MOKE';
どのように対策していくか
プレースホルダ-の利用
インジェクション対策として開発者ができる初めのアクションとしてはプレースホルダ-を利用することです。
プレースホルダ-はSQL文で値に変化がある部分に用いる場面で使用します。
プレースホルダ-をインジェクション対策として採用することで、入力された値は文字列として入力されているので不正なSQL文が入力されたとしてもエスケープされるのです。
エスケープ処理
データベースが持っている特殊記号を無効化する処理のことをエスケープ処理と呼びます。
具体的に言うと[']["][;]→["][""][\]として記号の意味を無効化することができます。
しかし使用しているDBによって扱い方が変わってくる場合もあるとのこと
WAFの導入
WAFとはWeb Application Firewall の略称で サイバー攻撃を防御するための対策ツールの一つとなりまし。
アプリケーション通信の内容を1つずつ監視を行い、不正なアクセスがあった場合、遮断する効果を持っています。
SQLインジェクション攻撃の為の不正なSQL文が検出された場合でもWAFが検知する機能を持っています。
以上が今回のSQLインジェクションにおける自分が学んだ対策法になります。
投稿の頻度が下がらないように継続を頑張ります