そのホームページ大丈夫? クリック・ジャッキングって何? それは「HP(ホームページ)で利用者に意図しない操作を行わせる攻撃方法」です!
こんにちは!
IT・プログラミング関連講師の荒川栄一郎です。
本日は「SQLインジェクション」について記述します。
★「セキュリティ」って何?
まず「SQLインジェクション」についてお伝えする前に
情報セキュリティについて知る必要がありますので
「セキュリティ」の概要についてお伝えします。
インターネットには、様々なユーザが接続しています。
その中には、インターネットを利用して
虎視眈々と悪さをしようと企んでいるユーザもいます。
インターネットに接続するコンピュータを安全に利用するためには
どのような脅威があり、その対策方法などを知っておく必要があります。
セキュリティは
「安全」「防護」「保障」などの意味を持つ英単語で
ITの分野では、「情報セキュリティ」のことを指し
コンピュータを安全に利用できるようにすることです。
現在はインターネットを利用して
HP(ホームページ)を閲覧したり
FacebookやTwitterなどのSNS(Social Networking Service)で
情報のやり取りを行うことができますよね。
このようなWebシステムを利用して
●クレジットカード情報
●個人情報
●メールの内容
●ログイン情報
のような情報を簡単に取得することも可能になっていますので
Webシステムの利用者は
いろいろな脅威があることを知っておいたほうがいいと考えます。
また、Webシステムを作成する側は
利用者が安心して利用できるように考慮しなければいけません。
しかし、情報セキュリティ対策は万全だと思っていても
日々いろいろな脅威が発生し、その対策方法が講じられていることも事実です。
★SQLインジェクションって何?
インターネットには、様々なユーザが接続しています。
その中には、インターネットを利用して
虎視眈々と悪さをしようと企んでいるユーザもいます。
現在では
●SNS
●オンライン・ショッピング
●オンライン予約
などのWebシステムではデータベースが利用されており
SNSの投稿内容やオンライン・ショッピングやオンライン予約の個人情報などは
データベースに書き込まれています。
もしこれらの情報が
悪意のある攻撃者によって閲覧することができたら
大変なことになるかもしれませんね。
SQLインジェクションは
データベースシステムを不正に操作する攻撃方法です。
SQLとは
データベースへの命令文になります。
インジェクションとは
注入という意味があります。
SQLインジェクションは
データベースの命令文に不正な命令を注入することで
データベースを不正に操作し悪さをすることです。
SQLインジェクションの攻撃方法は
利用するWebシステム内でデータベースと連携しているだろうと
推測できる部分を利用して行います。
例えば
●ログイン処理
●商品の一覧表示処理
●商品の検索処理
などはデータベースとの連携が行われている可能性を十分にあります。
ログイン処理では
通常IDやパスワードを入力してログインを試みますが
SQLインジェクションによりIDとパスワードが一致しなくても
ログインできるようにする可能性も秘めています。
商品の検索処理では
指定したIDや商品名を元に検索を試みますが
SQLインジェクションにより検索だけでなく
商品情報を全て削除することも可能になる可能性を秘めています。
このようなことは
データベースを利用するWebアプリケーションを設置している
Webサイト全てに存在しうる問題になります。
個人情報等の重要情報をデータベースに格納しているWebサイトでは
特に注意が必要となります。
SQLインジェクションの攻撃方法は
SQLというデータベースへの命令方法を知っていれば極めて簡単です。
SQLインジェクションは
SQL文の盲点をついた攻撃で
SQL文の組立て方に問題があります。
例えばログイン処理で
テキストボックスに入力したIDと一致した人がログインできるというシステムで
テキストボックスに入力するデータに
IDではなくSQL文の一部を入力しログインすると
もしSQL文の不備があった場合は
IDが一致しなくてもログインすることも可能になります。
例えば
ログインする個人の情報が登録された「Members」テーブルというものがあり
そのテーブルからIDが「■■■」のメンバーを検索するSQLは下記になります。
SELECT * FROM Members WHERE id = '■■■';
IDが「0001」のメンバーを検索する場合は
下記のような利用方法になります。
SELECT * FROM Members WHERE id = '0001';
ログイン処理などでは
この「0001」のようなIDがテキストボックスから入力され
●該当するIDのメンバーがいなければログインできない
●該当するIDのメンバーがいればログインできる
という仕組みになっています。
ログインできるかできないかの判定は
条件に当たる「id = '0001'」の判定結果が
「真(true)」か「偽(false)」によって決まります。
しかし
下記SQLの■■■の部分に
悪意のある攻撃者が不正なSQLを注入して
判定結果が「真(true)」となりログインできるとすればどうでしょうか?
SELECT * FROM Members WHERE id = '■■■';
テキストボックスに
「' OR '100' = '100」と入力してログインすると
ログインできてしまいます。
■■■の部分に「' OR '100' = '100」を割り当てると
下記のようなSQLになります。
SELECT * FROM Members WHERE id = '' OR '100' = '100';
条件「id = ''」の判定結果は「偽(false)」ですが
条件「'100' = '100'」の判定結果は「真(true)」です。
この2つの条件は「OR」により
どちらかが「真(true)」であれば
全体の判定結果は「真(true)」となりますので
ログインが成功します。
このように
SQLの盲点をついた攻撃により
ログインできたり個人情報を閲覧することができるようになります。
システム開発側はこのようなシステムを作ると
利用者からクレームがくるでしょうし
多額な賠償請求を迫られる可能性もあるかもしれません。
システム開発側は
必ずSQLインジェクション対策を施さなければ
利用者が安心して利用できません。
SQLインジェクション対策は
(1)SQLの組み立ては全てプレースホルダで実装する。
(2)SQLでよく利用される「シングルコーテーション」などをSQL内に埋め込ませないようにする。
(3)エラーメッセージをそのままWebブラウザに表示しない。
(4)データベースアカウントに適切な権限を与える。
などの方法があります。
(1)SQLの組み立ては全てプレースホルダで実装する。
プレースホルダとは
実際の内容を後から挿入するために
とりあえず仮に確保した場所のことです。
もう少し簡単に言うと
SELECT * FROM Members WHERE id = '■■■';
のSQLを
SELECT * FROM Members WHERE id = ?;
のような形で準備しておき
後で「?」の部分に数値や文字列などのデータを割り当てるようにします。
プレースホルダを使用することで
シングルコーテーションを記述せずに
「?」の部分に数値や文字列などのデータを割り当てることができるようになります。
「?」の部分に「' OR '100' = '100」を割り当てると
下記のようなSQLになりSQLとして成立していないので
不正なSQLの注入を回避することができます。
SELECT * FROM Members WHERE id = ' OR '100' = '100;
(2)SQLでよく利用される「シングルコーテーション」などをSQL内に埋め込ませないようにする。
SQLでよく利用される記号は
「'(シングルコーテーション)」や「\(円記号)」などがあります。
悪意のある攻撃者は
このような記号を絡めて「SQLインジェクション」という攻撃を仕掛けてきます。
回避する方法としては
SQLを実行する前にSQLの文字列を調べて
もし「'(シングルコーテーション)」や「\(円記号)」があった場合は
違う文字に置換することでSQLとして成立させないようにします。
例えば
●「'」→「''」
●「\」→「\\」
のように置換します。
そうすると
テキストボックスに
「' OR '100' = '100」と入力してログインすると
下記SQLの■■■の部分に置換したもの「'' OR ''100'' = ''100」を割り当てると
下記のようなSQLにすることができます。
SELECT * FROM Members WHERE id = '■■■';
SELECT * FROM Members WHERE id = ''' OR ''100'' = ''100';
こちらもSQLとして成立していないので
不正なSQLの注入を回避することができます。
(3)エラーメッセージをそのままWebブラウザに表示しない。
Webシステムにより
データベース処理を行うと
●データベースの種類
●データベースのエラーの原因
●実行エラーを起こしたSQL
のエラーメッセージの情報が
Webブラウザの画面に表示されるケースも多々ありますが
これらはSQLインジェクション攻撃につながる有用な情報となりえます。
またエラーメッセージは
攻撃の手がかりを与えるだけでなく
実際に攻撃された結果を表示する情報源として悪用される場合があります。
データベースに関連するエラーメッセージは
利用者のWebブラウザに表示させないことがベストです。
(4)データベースアカウントに適切な権限を与える。
Webシステムによりデータベース処理を行う場合
使用するユーザアカウントの権限が必要以上に高い場合
攻撃による被害が深刻化する恐れがあります。
Webシステムからデータベースに渡す命令文を洗い出し
その命令文の実行に必要な最小限の権限を与えるようにすることがベストです。
Webサイトには様々な脅威が潜んでいますので
常に最悪の事態も想定したりして
対策方法を考慮することが大切だと考えます。
Webサイトを構築する側の人は
Webサイトの利用者が安心して利用できるシステムを作成するように
心掛けなければいけません。
Webサイトを利用する側も
インターネットを利用するシステムには
様々な脅威が潜んでいることを頭に入れておかなければいけません。
ネット社会では
企業だけでなく個人にとっても脅威が潜んでいます。
セキュリティ対策は
しっかりと行う必要がありますね。
★SQLインジェクションのまとめ
SQLインジェクションって
難しいと思われている方も多々いると思いますが
データベースシステムを不正に操作する攻撃方法です。
セキュリティ対策という言葉を聞いたことがある方は非常に多いと思いますし
セキュリティを意識している人も非常に多いと思います。
SQLインジェクションは
今やPCやスマートフォンでインターネットを利用する上で
潜んでいる脅威だと考えますが
明確に内容や仕組みを理解している人は少ないと思います。
ただSQLインジェクションというものは
●データベースシステムを不正に操作する攻撃方法
●Webサイトの作る側も利用する側も考えなければいけないこと
ということだけでも
このコラムを通じて理解していただけましたら幸いに思います。
SQLインジェクションは
データベースシステムを不正に操作する攻撃方法です。
もしSQLインジェクションに興味を持たれたら
少しずつ勉強してみてはいかがでしょうか?
ユーザとしては知る必要がありませんが
少しずつ覚えていくことで、点が線で繋がることも多々あります。
そうなると結構楽しくなるかもしれません。
これからIT業界を目指している人には
知っておいてほしい知識だと思いますが
少しずつ勉強していってほしいと思います。
★SQLインジェクションについて学ぶ方法は
SQLインジェクションについては
新入社員研修やIT・プログラミング関連の研修で
学ぶことができるようになっています。
【IT・プログラミング研修】
●「Java(Webアプリ開発)」の詳細情報
https://itlaboj.com/courses/java_training/java_web/
●「Java(Webアプリ開発 - Spring Framework -)」の詳細情報
https://itlaboj.com/courses/java_training/java_spring/
●「Python(Webアプリ開発)」の詳細情報
https://itlaboj.com/courses/python_training/python_web/
●「PHP(Webアプリ開発)」の詳細情報
https://itlaboj.com/courses/php_training/php_web/
●「C#(Webアプリ開発)」の詳細情報
https://itlaboj.com/courses/cs_training/cs_web/
●「ネットワーク基礎」の詳細情報
https://itlaboj.com/courses/it_training/network_kiso/
★「SQLインジェクション」習得に必要なもの
SQLインジェクションの内容は基本的に座学になりますが
Webアプリケーションの知識や構築方法を学んだ後に行う内容ですので
それぞれのプログラミング言語のセットアップなどが必要になります。
また、このコースは
リアルでもオンラインでも受講することが可能です。
オンラインで受講される人は
「Zoom」が利用できる環境があればいいと考えます。
このコースはシステム開発に直結する話ではあり
SEやプログラマになるための必要な内容になります。
みんなが楽しみながらWebサイトの脅威・対策方法の知識を習得してほしいと思いますし
将来のIT技術者を研修や動画コンテンツを通じて
育成していきたいと考えています。
私は日本全国に多くのIT技術者を育成できる研修を目指していきたいです。
そして一人でも多くの受講者に受講してもらい理解してもらえる研修を行いたいと思っています。