SQLインジェクションとは?脆弱性を突いた攻撃を防ぐ対策について
SQLインジェクションとは、WEBサイトの検索や入力ボックスに実行プログラムを書きこまれる事で、サーバーに本来意図しない結果を表示させる攻撃です。
これまで大小問わず数多くのWEBサイトが攻撃を受け、個人情報の流出・サイト改ざんや乗っ取り被害に遭っています。その損害額は計り知れません。
SQLインジェクションを無効化するSQL対策、WAF等のサーバー側の対策、特にWordpressはバージョンアップなどの対策が必要です。
SQLインジェクションによるサイバー攻撃の増加
WEBサイトへのサイバー攻撃およびセキュリティ対策はWEBサイト運営者の命題ともいえる課題の一つです。
このサイバー攻撃による被害は現在もとどまるところを知りません。
厄介なのは今はだれでも簡単にサイバー攻撃ができる時代であり、Wordpressサイトという特にターゲットにされやすいシステムが世に出回っている事でしょう。
誰でも簡単に攻撃できる時代
その理由は、ネット上での知識やウイルス作成ツール等が比較的簡単に入手できるような環境にある事です。
つまりある程度の知識があって調べれば、少年でも大企業に対してサイバー犯罪を行える環境が整っているのですね。
そしてそのサイバー攻撃の代表格として、一番使われやすいのがSQLインジェクションです。
SQLインジェクションによるサイバー攻撃は、2008年くらいから急増し始めました。
今回はSQLインジェクションの概要や被害状況・対応策などについてまとめています。
SQLインジェクションとは
ではSQLインジェクションとはどのようなサイバー攻撃なのでしょうか。
まずはSQLインジェクションを、「SQL」と「インジェクション」とに分けて説明します。
SQLとは
SQLインジェクションのSQL(エスキューエルと呼びます)は、Wordpressなどで使われる代表的なデータベースを操作する言語です。
「MySQL」や「Postgre SQL」など様々な種類のデータベース言語が存在しており、様々なWEBサイトへの情報表示の際データを格納するために使われています。
インジェクションとは
インジェクションとは、英語で「注入する事」を意味しています。
不正なプログラム命令を攻撃対象のWEBサイトに注入するという意味でSQLインジェクションと呼ばれています。
ではこのSQLインジェクションとはどのようなサイバー攻撃なのでしょうか。
入口はWEBサイトの情報入力ボックス
例えばほとんどのWEBシステムの場合、お客様が入力した情報(検索)データをサーバーが受け取り、サーバーの中にあるデータベース情報にアクセスして適切なデータを表示させます。
YahooTOPの検索ボックス
これをサーバーリクエストと呼びます。
例えば物件情報サイトなどで「東区の物件を探す」のならば「東区 戸建て」などの検索する事ができますね。
このサーバーリクエストに対して適切な答えを返す事で、ユーザーにいろいろな情報が提供される仕組みです。
入力ボックスにプログラムが書き込まれる
SQLインジェクションは、このSQLによる「プログラム命令」が検索ボックスや入力フォームを通して、サーバーリクエスト内容に入り込む事で起きる攻撃です。
YahooやGoogleの検索時によく目にするあの入力ボックス内に「物件名称」や「キーワード」ではなく、「プログラム」がそのまま書き込まれる訳です。
悪意ある攻撃者が入力フォームにSQLプログラムを入れ込む(インジェクションする)と、中でSQL文のプログラムが実行されてしまいます。
その結果WEBアプリケーションが開発者の意図しない動作をしてしまうのです。
サーバーが正直に反応する事を利用
サーバーはリクエストがある限り、そのあらゆる要望に対して正直に返事を返そうと動きます。
このSQLプログラムが入り込む事で「このサービスの会員情報を全て表示してくれ」という命令リクエストと判断すれば、これに対応してしまう可能性があるのです。
このようなSQLプログラムの存在を覚えれば、誰でもWEBサイトの脆弱性を突いた攻撃ができる訳です。
SQLインジェクションの仕組み
以下の例をもとにSQLインジェクションがどのように実行されるのか、その過程をおさらいます。
通常のデータベース操作の場合
前提条件
・usersというユーザー情報が格納されている情報の箱(テーブル)がある
・入力されたidにマッチするユーザー情報を検索できる機能がある
・設定されたSQLの命令が以下である
SELECT * FROM users WHERE id= '$ID'
SQL命令の説明
SELECT…データを抽出します
*…usersテーブルに含まれる項目全てという意味
FROM users…この場合抽出先の箱テーブルはusersであるという意味
WHERE…抽出条件を指定する欄
上記はアプリケーションが$IDの内容に相当する番号入力を受けた場合に、その番号を代入してマッチする情報を抽出するという命令ですね。
わかりやすく言うとidが5番の人を探す場合は
SELECT * FROM user WHERE id=‘5’
となります。フィールド項目に5を入力すると$IDのところに「5」が入り、idが5番の人の情報がusersのデータから抽出されてくるという事になります。
これが通常の機能の状態ですね。
SQLインジェクションを受けた場合
ではインジェクションを受けた場合の一例を以下に示します。
番号を入力するフィールドに、5に続いて「or‘a’=‘a'」と記号まであえてセットで入れたとしましょう。
これが単純に番号だけではなく「SQLプログラム」を注入した事を示します。
その場合、SQLで実行される命令は$IDのところに「5 or‘a'=‘a'」が入る訳ですから
SELECT * FROM users WHERE id=5 or‘a'=‘a'
となりますよね。サーバーは忠実に守ります。
命令文のポイント
そしてこの時のWHERE以降の内容が重要です。
まずid=5 つまり「番号が5の人」がまず命令として成り立ちますよね。
次の or は「または」という意味でor条件といいます。
その次の「‘a’=‘a’」何の意味があるのか?と思うでしょうが、意味はありません。
とにかく構文として成り立っていれば中身は「1」でも何でもよいのです。上記の形にする事が重要です。
WHERE条件をリセットしてしまう
WHERE条件には「or」が入っているので「idが5の場合」か「‘a’=‘a’」いずれかを適用する事になります。
この時、idが5番の方に関係なく「‘a’=‘a’」側の判定により、WHERE条件指定が「特に入っていない」事と同じなるのです。
つまり解釈としては下記の様に「WHERE条件なし」命令として扱われるのです。
SELECT * FROM users
WHERE条件が無いという事は、usersに入っている全ての情報が出力される事になります。
この結果idの5番だけでなく、抽出なしで全てのユーザー情報が表示されます。
セキュリティ実装が正しく行われていれば
仮にSQLインジェクションを想定したセキュリティ実装が正しく行われていれば、上記で出てきたシングルクォート「'」は、問い合わせ命令文の中の「普通の文字」として処理されます。
つまりプログラムの一部ではなく「文字」として扱われるのです。
つまり$IDが「‘a'=‘a'」という文字の人、という判定です。
そんなIDがついている人なんている訳がありませんから、id=5だけが反映される事になりますね。
しかしセキュリティ対策行われていないと、シングルクォート「'」に続く「全てを出力」という命令文がそのまま、データベースへの命令として実行されてしまうのです。
サーバーは格納しているデータの重要度はわからない
中に入っている情報はその機密の程度に関わらず一律です。
ただのデータでしかない訳ですので、その一つ一つに優先順位や重要度などは設けられていません。
そしてサーバー側も正直に投げかけられた要求に応えようとするのです。
インジェクションに対応していなければ、どんなに重要な機密情報であっても吐き出されてしまいます。
SQLインジェクション攻撃で想定される被害
秘密情報・個人情報の漏洩
脆弱性をそのままにしたWEBシステムがSQLインジェクションを受けると、外部からデータベースを自由に操作されてしまいます。
結果データベースに記録されたデータの閲覧や盗難、変更、消去などを行われる可能性があるのですね。
その被害として代表的なものが、個人情報の情報漏えいです。
WEBサイトを利用者する場合、ユーザーのユーザー名やパスワード、ECサイトであればクレジットカードの番号をはじめとするあらゆる個人情報がデータベースに格納されています。
攻撃者がWEBサイトにこのSQLインジェクション攻撃をしかけると、それらの個人情報が全て奪われてしまう可能性があるのです。
個人情報を悪用された二次被害
全て表示されてしまうという事は「奪われている」事と同じになります。お客様名簿などの一覧が手に入るのと同じです。
その名簿リストを別の悪事に利用される可能性もありますよね。
そしてクレジットカード番号や名義が盗み出された場合は、その情報をさらに悪用される二次被害も考えられます。
蓄積データの全削除もある
またデータ自体を削除されてしまえば、WEBサイト内にデータが全く入っていない初期状態になってしまいます。
これではそれまでのサービスを継続する事はできません。
だからこそ不用意に情報が表示されないように厳格なセキュリティを設ける必要があるのです。
ウェブサイトの改ざん
特に企業や政治団体などのWEBサイトの改ざんが最近多くなっている様です。
攻撃者によってWEBサイトの内容が書き換えられたり削除される被害が増えています。
そしてさらに最近は、改ざんされたWEBサイトにウイルスが埋め込まれており、閲覧ユーザーの端末がそのウイルスに感染してしまうという二次被害も増加しています。
不正ログイン・乗っ取り被害
この他にもシステムへの不正ログインや乗っ取りといった被害が出ます。
不正ログインの手法も年々高度になり、対策を立てることが困難になってきているのですね。
SQLインジェクションの被害に遭ってしまうと、自分のサイトが自分のサイトでなくなってしまう事もあり得るのです。
甚大な被害額・ユーザー離れ・検索順位下落
WEBサイトの情報漏えいや改ざんなどの被害が発生すると、ビジネスやサービスの中断および停止が予想されます。
それによって生じた損失への補償、復旧対応に要する費用は計り知れません。
そしてそれはサイトを訪問するユーザーにも多大な影響が発生します。
ユーザー離れが加速する
停止したWEBサイトを復旧する間、当然そのサイトを訪問していたユーザーに見てもらえなくなりますよね。
すると競合他社のサイトの方に行ってしまう事を防ぐ事ができません。
しかもサーバーが停止している状態はGoogleにもすぐわかります。
そうなるとそれまで確保していた検索順位も下落してしまいます。稼働が停止しているWEBサイトを上位表示させる訳にはいかないからですね。
SQLインジェクションによる被害実例
2019年1月25日個人情報流出
株式会社釣りビジョンは同社WEBサイトのサーバーが何者からかの不正アクセスを受け、個人情報が流出した可能性があると明らかにしました。
攻撃を受けたデータベースには、2006年以降のプレゼント応募や番組人気投票などのフォーム入力情報、6万3,656件が含まれていました。
同社は謝罪を表明するとともに、再発防止策に取り組んでいます。
2018年6月7日情報漏洩
三菱地所・サイモン株式会社は同社が運営するサービス「ショッパークラブ」がサイバー攻撃を受けた事、およびその詳細を明らかにしました。
同社発表により攻撃者は脆弱性を持つWEBサイトに対して「SQLインジェクション」を用いて不正アクセスがされていた事が判明しています。
被害件数が合計約27万件であると同時に、同社の保有する情報の漏洩があった事を報告しています。
2018年5月14日不正アクセス
株式会社MS&Consultingは、ミステリーショッピングリサーチに関するWEBサイトに対して、WAFの設定ミスを利用した不正アクセスが行われていた事を発表しました。
WAFの設定ミスでSQLインジェクション攻撃を防げていなかった事を認めています。
同社は2018年5月14日時点で6,119件と述べていましたが、外部調査機関調査により、5月2日以前も不正アクセスを受けていたことが判明しています。
結果として漏洩可能性のある個人情報も約57万件へと上方修正する事となりました。
2017年Wordpress改ざん
Wordpressを利用しているサイト150万件以上が改ざんの被害に遭っています。
REST APIを悪用した遠隔操作によるサイト改ざん攻撃です。
認証されていないユーザーでもサイトを書き換える事ができる大きな脆弱性が発見され、甚大な被害につながっています。
2017年2月個人情報流出
日販グループの日販アイ・ピー・エスのWEBサーバーが不正アクセスを受け、クレジットカード情報など顧客の個人情報が流出していたことがわかりました。
2016年12月23日から27日にかけて、SQLインジェクション攻撃により同社が運営する「CLUB JAPAN」「MagDeli」で最大13万1936件分の顧客情報が流出しています。
流出情報の大半は会員のメールアドレスやIDでしたが約30件のカード名義・カード番号などのクレジットカード情報も同時に流出しました。
2017年12月19日会員情報流出
「ヤマケイオンライン」が不正アクセスを受け、一部の会員情報が流出したと発表しました。
判明している流出データは1160人分の氏名、メールアドレス、住所や電話番号などです。
情報流出の原因は「SQLインジェクション」が使われたとのこと。
先月11月29日よりヤマケイオンラインの会員からフィッシングメールが届いたとの報告を受けて、ヤマケイオンラインでは調査を開始しました。
その結果今回の不具合が発覚しています。不正アクセスは10月31日、11月22日、11月23日に痕跡があり、原因を究明して脆弱性は12月5日までに解消したという事です。
2016年9月30日個人情報12万件窃盗
16歳が不正アクセス、個人情報12万件盗んだ疑い
宮城県警は不正アクセス禁止法違反などの疑いで、千葉県成田市の高校1年生の男子生徒2人を仙台地検に書類送検したと発表した。
不正に入手した他人のIDやパスワードで買い物サイトにアクセスした疑いです。
二人は「SQLインジェクション」使い、ホテル予約サイトなどが設置されているWEBサーバーに不正アクセスし個人情報を盗み出していました。
2013年4月クレジットカード情報漏えい
「エクスコムグローバル」で、約11万人分のクレジットカード情報(名義・カード番号・セキュリティコードなど)が漏洩したという被害が報告されています。
2011年4月個人情報漏えい
ソニーが展開するゲーム用サービス「PlayStation Network」で、SQLインジェクション攻撃が行われた報道がありました。
この攻撃によって約7,700万人分の個人情報が奪われてしまったとされています。
奪われた情報の中にはサービス用の会員ID・パスワードだけでなく、会員の氏名・住所・メールアドレス・生年月日までが含まれていました。
この様に例年大小とわず様々なWEBサイトがSQLインジェクションの被害に遭っている事がわかります。
SQLインジェクション対策
WEBサイトアプリケーション側での対策
エスケープ処理
SQLインジェクション攻撃対策の中で、最も基本的なのが「エスケープ処理」と呼ばれるものです。
エスケープ処理とは、プログラム言語を扱う上で特別な意味をもつ文字・記号が入力された際、それを「別の文字列」に書き換えてしまう事を指します。
データベースにとって命令の意味を持つ「シングルクォート(’)」や「セミコロン(;)」などの記号を、全て「普通の文字」として解釈するように設定するのです。
これによって、攻撃者がSQLインジェクションにより不正なSQL文をWEBサイトへ送り込もうとしても、それを無効化することができるのです。
命令文として使われる記号を「文字情報」と判定する
つまり「'」や「;」等はプログラム命令でよく使われる記号なのですね。
それを「文字であり、記号ではない」とあらかじめ指示して置けばサーバーは無視をするという事ですね。
通常検索をしたりする人は「'」や「;」を入れて検索はしません。ですのでこれで基本的には問題がないのです。
ネットワークでの対策
WAFの導入
WAFは、WEBサイトをサーバーレベルではなくアプリケーションレベルで防御するファイアーウォールのことです。
HETEMLレンタルサーバーのWAF設定欄
ネットワークの外部からネットワークレベルで不正なアクセスを検知し遮断する事ができるのが、一般的にWEBサーバーが持つファイアーウォールです。
しかしSQLインジェクションは攻撃をする前に普通にWEBページを開く訳ですから、WEBサイトへのアクセスとしては正常です。
アクセスした後に不正なデータをサイトへ送りつける訳ですから、この攻撃をWEBサーバーのファイアーウォールで防ぐ事はできません。
WAFは「Web Application Firewall」の略です。
WAFはアプリケーションの中を監視する
それに対してWAFは、攻撃者がWEBサイトへアクセスしたあとに「不正と認識されるような動き」をアプリケーションレベルで検知ししています。
そこでSQLインジェクションの様に不正なデータを送り付けるというあやしい動きがあった場合、このデータ送信を防ぐことができるのです。
このWAFは標準仕様で導入がすぐ出来るようになっているレンタルサーバーが多いですのでぜひ活用してみましょう。
ただしこのWAFを導入すると他のCGIプログラム等に影響が出る事があるので、稼働テストは必要です。
WEBサイトに脆弱性がないかの検査
SQLインジェクションに限らず、WEBアプリケーションの脆弱性は定期的にチェックしておくべきです。
WEBサイトで使用中の全てのソフトウェアやアプリケーションのバージョンを把握し、パッチやアップデートが公開されたら迅速に適用することがベストです。
しかしこれはなかなか難しいのが現状です。
脆弱性対策情報データベース
脆弱性対策情報データベースでは、国内外問わず脆弱性対策情報も日々公開されています。
脆弱性が発見された場合にはなるべく早くアップデートするようにしましょう。
脆弱性診断サービス
外部から擬似的な攻撃を行い、悪用されると危険な脆弱性があるかどうかを確認する「脆弱性診断」というサービスがあります。
参考サイト:脆弱性診断サービス「LAC」
検査する脆弱性の内容はサービスによって異なりますが、多く使用されているものや、「OWASP Top 10」などに挙げられているものには対応しているケースが多くなっています。
別のサービスに付帯しているケースも多いので、調べてみるとよいでしょう。
「OWASP Top 10」とは
「OWASP Top 10」はWEBアプリケーションのセキュリティに関する脅威や危険性のトレンドをまとめた資料です。
「OWASP」がWEBに関する脆弱性やリスク、攻撃手法、事例、情報漏洩、悪性ファイルやスクリプト、攻撃コードやマルウェアなどを研究しています。
その結果、WEBセキュリティ上で多発する脅威の中で、その危険度が最も高いと判断された10個のトピックを「OWASP Top 10」として発表しています。
開発者による対策
WEBアプリケーションやデータベースの開発者は、SQLインジェクションを発生させないプログラミングをする必要があります。
セキュアプログラミングやシフトレフトなどとも呼ばれますが、脆弱性を生み出してしまわない様な設計をする事もできるのです。
独立行政法人情報処理機構(IPA)
独立行政法人情報処理機構(IPA)が公開している「別冊: 安全なSQLの呼び出し方」に基づいて開発をする事で、安全なWEBサイト構築ができます。
発注者の責任になる事もある
WEBサイト制作を外注する場合は、WEBアプリケーションの脆弱性の責任は「発注者側」にあると判断されることが多いです。
予算を削る時に制約が無ければ、このようなセキュアプログラミングの部分が削られたりするのでしょうね。
ですので、発注者は要求仕様にセキュリティ要件を盛り込んでおくべきです。
WordpressへのSQLインジェクション対策について
私が構築したものでは無いのですが、先日もクライアントのWordpressサイトが不正ログインを受けました。
TOPページやログイン画面がリダイレクトされて操作ができないという事態になりました(現在は復旧しています)。
非常に多くのユーザーが利用しているWordpressですので、このようなサイバー攻撃の標的になりやすいと言えます。
基本的に一般ユーザーは自分の会社は大企業じゃないし、流出する情報なんてないと思っていますので、その隙を突いてくるのです。
Wordpressは狙われる宿命にある
厄介なのはWordpressサイトはMySQLデータベースを確実に使用している事、そして
・一般公開された基本システム
・他者が作ったテーマ
・他社が作ったプラグイン
という構成になっています。
簡単に導入ができる分、他人が作ったどれだけ脆弱性があるか不明なツールを、そのまま利用しているという「リスク」をはらんでいます。
Wordpressは非公開のWEBシステムではなく、一般的に公開されたオープンソースシステムとしてさらけ出されています。
ですのでいい点も悪い点も攻撃者間で研究され共有できてしまうリスクと常に隣り合わせです。
Wordpressがバージョンアップを繰り返しているのは、新しい攻撃脅威へのセキュリティ対策が一番の原因です。
Wordpress・プラグインのバージョンアップは必須
まずは何よりもバージョンアップでしょう。新しいバージョンが出たら積極的にバージョンアップするべきです。
バージョンアップを怠っていると新しい脆弱性への攻撃を防ぐ事ができません。
そしてプラグインの一つ一つに対しても随時脆弱性が発見されますので、その都度新しいバージョンが提供されます。
システムだけでなくプラグインも常に最新版に更新するように心がけて下さい。これだけでかなり脅威を防ぐ事ができます。
自衛するためにはWAFが一番
基本的に業者に頼んでいない限りはセキュリティ対策はご自身で行う必要があります。
SQLインジェクション攻撃を未然に防ぐには、セキュリティリスクのあるテーマやプラグインの使用を控えることが大切です。
ですがどのテーマやプラグインが安全かは分かりませんし、いつ新しい脆弱性が発見されるかわかりません。
そういった不測の事態に備えるには、先述したWAFの導入が一番効果的です。
プラグインでWAFを利用する場合
WordPressならプラグインをインストールするだけでWAFを導入できます。
ご自身がレンタルしているサーバーにWAFが導入されていないのであれば、以下のプラグインを使ってみると良いでしょう。
このように手軽にプラグインでWAFを導入する事ができますが、できればWAF機能を搭載しているレンタルサーバーを使う方が安全です。
WAF機能を搭載するレンタルサーバーを利用
プラグインの場合は、Wordpress本体に脆弱性があった場合にそれに完全に対応できる保証はありません。
それにWordpressで管理されていないファイルに対してはプラグインのWAFでは保護されない可能性があります。
そもそも、WAFのプラグイン自体に脆弱性があれば本末転倒です。
WAFを提供しているレンタルサーバーはたくさんあるので、新規に作る場合はWAFが常備してあるサーバーを選びましょう。
既に稼働中であればWAFがあるレンタルサーバーに引っ越しを検討されて下さい。
まとめ
WEBサイトなどの脆弱性をついて相手のデータベースを攻撃するSQLインジェクション攻撃はずっと以前から知られています。
そして現在でも個人情報漏洩・サイト改ざんなど多数の被害をもたらしているのが現状です。
そのためWEBサイトの運営者の方は、SQLインジェクション攻撃を防ぐための対策が必要です。
対策の方法としては、エスケープ処理やWAFの導入、脆弱性診断による危険性の洗い出しなどが挙げられます。