サイバー攻撃はシステムの脆弱性を悪用するケースが多く、その中でも SQLインジェクション の脆弱性がよく悪用されます。SQLインジェクションとは何なのか、どのような対策をすればいいのか、簡単な攻撃例の動画を交えて説明していきます。
SQLインジェクションはアプリケーションの脆弱性を攻撃するサイバー攻撃の1つです。
脆弱性のあるウェブサイトに不正なSQL命令を注入することで、本来は隠されているはずのデータが奪われてしまったり、ウェブサイトが改ざんされてしまう恐れがあります。
どのような攻撃なのか
SQLインジェクションは、Webアプリケーションに存在する脆弱性を悪用して、外部からデータベースの内容を不正に操作する攻撃です。
ショッピングサイトなどの多くは、データベースを操作するためのコンピュータ言語であるSQLを利用して、登録者の個人情報を管理しています。ユーザーがWebアプリケーションを利用するとき、ユーザー自身が入力した情報を元にして、WebサーバーがSQL文を組み立てます。そして、SQL文がデータベースにデータを追加したり、検索やテーブルの更新などを行います。
このとき、Webアプリケーションのセキュリティ対策が不十分で脆弱性がある場合、攻撃者は、「不正なSQL文」を実行することができます。これによりデータベース内の重要情報の漏えい、ウェブサイトの改ざんといった攻撃を実行することが可能になります。
SQLインジェクションの脆弱性が悪用されると、外部からデータベースを操作され、データベースに記録されたデータの閲覧や盗難、変更、消去などを行われる可能性があります。
■ 情報漏えい
SQLインジェクションの被害として代表的なものが、情報漏えいです。
WEBアプリケーション側は、「悪意のあるSQL文」が入力されたとしても、不正アクセスの意図があるとは分かりません。このため、外部から送信された不正なSQL文を正規のSQL文と誤解してしまいます。その仕組みを悪用して、「情報を開示しろ」とSQL形式で命令を送ります。
その結果、上述の管理サーバが正規の命令だと認識する「誤解」が生じてしまい、企業が一般公開していない機密情報や個人情報を盗み出されてしまう可能性があります。
■ Webサイトの改ざん
SQLインジェクション攻撃の被害で最近多くなっているものが、企業や政治団体などのWebサイト改ざんです。
不正な命令を含むSQL文がWebアプリケーションで実行可能ということは、同様に、Webサイトやアプリケーション自体の改ざんも容易にできることになります。攻撃者によってWebサイトの内容が書き換えられたり削除される被害が増えており、昨今はWebサイトにウイルスが埋め込まれ閲覧者がウイルスに感染するという被害も増加しています。
■ システムへ不正ログインや乗っ取り
より深刻なケースでは、システムへの不正ログインによってサーバ自体を乗っ取られてしまう被害が出ます。不正ログインの手法も年々高度になり、対策を立てることが困難になってきています。
発生日時 | 概要 |
2011年4月 | ソニーが展開するゲーム用のサービス「PlayStation Network」において、SQLインジェクション攻撃が行われ、約7,700万人分の個人情報が奪われました。 |
2019年1月 | 「釣りビジョン」というウェブサイトにおいて、会員のメールアドレスや氏名・住所など6万件以上もの情報が盗まれました。 |
2020年4月 | 株式会社光言社のWebサイトに対し、SQLインジェクション攻撃が行われ、同サイトの会員情報が一部流出した可能性が判明しました。 |
上記のようなログインページがある場合、UsernameとPasswordを入力する必要があります。
Usaername | password |
yamada | 123 |
■通常のサーバ内ので動き
SELECT * FROM ユーザマスタ WHERE ユーザID = '{$userId}' AND パスワード = '{$passwd}'
↓
ユーザが(Username)に「yamada」と(password)に「123」を入力
↓
SELECT * FROM ユーザマスタ WHERE ユーザID = 'yamada' AND パスワード = '123' として認識
↓
データベース内にあるUsernameとpasswordが「一致したこと」を確認してログインOKを処理をする
↓
ログイン
■SQLインジェクションを利用した動き(シングルクォートを使用した条件式の終了)
SELECT * FROM ユーザマスタ WHERE ユーザID = '{$userId}' AND パスワード = '{$passwd}'
↓
悪意のある者が(Username)に「yamada」と(password)に「' OR 'A' = 'A」を入力
↓
SELECT * FROM ユーザマスタ WHERE ユーザID = 'yamada' AND パスワード = ' OR 'A' = 'A'
↓
データベース内にあるUsernameとpasswordは「一致していない」が、ログインOK処理をする
↓
ログイン
パラメータとして入力値「’」を含ませることで、パスワードに関するWHERE句の条件式を一旦終端させて次にORを含ませると、「’A’ = ‘A’」という恒真式がORの対象になる。
よって、WHERE句全体が常に真となり、パスワードを入力せずにユーザID「yamada」としてログインすることが可能となる。
上の項目で使用したシングルクォートの式をデモサイトで使用し、ログインできるか確認する。
■動画での動き
①通常ログイン
②パスワードをに不備がある場合でのログイン
③SQLインジェクションを用いて不正ログイン
Username | password |
admin (管理者権限) | ” OR ‘A’ = ‘A’ |
WAFを利用するのも、有効なSQLインジェクション対策のひとつです。WAFは、Webアプリケーション上のデータの送受信を把握・管理することで、不正侵入を防御するファイアウォールです。従来のファイアウォールがネットワークレベルでの管理であるのに対し、WAFはWebアプリケーションのレベルで管理を行います。
WAFでは、アプリケーションプログラムに渡される入力内容を検査し、不正と判断したアクセス要求を遮断します。SQLインジェクションの不正な要求を「攻撃」と見なして、アプリケーションとの通信を遮断することで、攻撃から守るしくみです。
サイバー攻撃が発生しても被害を最小限にするため、Webサイトへのアクセスを監視して、普段の正常なアクセス状態を把握しておきます。万一SQLインジェクションが起きた場合、アクセス状態が明らかに異なることが多いので、異常に気づくことができます。そうすれば、Webサイトの公開を一時停止するなどの早めの対処が可能となります。
脆弱性診断サービスは、攻撃者の視点からサイトやアプリケーションの脆弱性を調査してくれるサービスです。セキュリティ会社が実際に疑似攻撃を行うことで、サイトやアプリケーションにどの程度のセキュリティリスクがあるのかを調査します。脆弱性診断サービスには有償のものと無償のものがあります。無償のものは利用するためにはある程度の専門知識が必要になるので、脆弱性診断サービスを提供しているセキュリティ会社を選ぶのも手段の一つです。
コンテンツ管理システム(CMS)として代表的なWordPressは、定期的に脆弱性が発見されセキュリティパッチが適用されたバージョンがその都度発表されます。中にはSQLインジェクションを引き起こす脆弱性もあるため、セキュリティアップデートが発表された場合は迅速なアップデートをする必要がある場合があります。その為、情報サイトを常に目を見張ることが重要です。
プログラム言語では「ユーザID = ‘{$userId}’」のようにシングルクォートは命令文を識別するための特殊な意味があります。SQLインジェクションはプログラム言語の特殊性を悪用して行われます。そのため、シングルクォート「’」が使われた場合には特殊なプログラム言語ではなく普通の言語(文字)として認識するように処理する必要があります。
SQLインジェクション脆弱性を狙った大規模な攻撃が繰り返し行われ,Webページが改ざんされる事件が何度も発生しています。SQLインジェクションは対策をすることのできる脆弱性ですが、セキュリティ知識がなかったり、セキュアコーディングができていないことで被害は絶えません。情報漏洩が一度発生すると信用問題になります。定期的な脆弱性診断やWAFの導入、サイトの監視をすることで被害者にならないよう、対策を行うことが重要です。
[blogcard url=”https://cyberfortress.jp/contact/”]
HOME カゴヤのサーバー研究室 ネットワークの基礎知識 【初心者向け】SQLインジェクションの概要と対策方法 【初心者向け】SQLインジェクションの概要と対策方法
SQLインジェクションでの被害事例まとめ
SQLインジェクション対策について
SQLインジェクションの仕組み
SQLインジェクションのまとめ
ソフトウェア等の脆弱性関連情報に関する届出状況
被害は7700万人分の個人情報。悪名高き攻撃「SQLインジェクション」への対策方法とは?
Written by CYBERFORTRESS, INC.
Tweet