個人情報の宝庫 データベースを狙うテロ行為「SQLインジェクション」を知ろう。

あどうもです。
某カレー屋の3辛を舐めていた、もょもとです。
あれめっちゃ辛いすね。
 
前回の記事では、世界で最も使用されている言語 としてデータベース言語のSQLをご紹介しました。世界で最も使用されている言語「SQL」
 
今回は、そのSQLのセキュリティに関するお話です。
身の毛もよだつ、口に出すのも恐ろしいお話です。
これを読めば、あなたも第二の稲川になれること間違いなし。
コギャルやイケメンをヒーヒー言わせよう。

 SQLインジェクション

zubuzubu
SQLは、みなさんの個人情報が入っているデータベースを操作する際に使用されますが、そんなSQLを利用して情報を抜き出したり、不正に操作される攻撃SQLインジェクションをご存知ですか?
 
怖いですね~データベースは個人情報とズブズブの関係ですからね。
 
データベースは与えられた命令を実行します。
どんな命令でも忠実に実行します。
例えそれが悪意のある命令であっても。
 
データベースは知りません、その命令がご主人様のものなのか、知らないおじさんのものなのか。

Let’s SQLインジェクション

ではWEBサービスにログインする時を例にあげてみてみましょう。
ログインIDとパスワードを入力してログインするケースをイメージして下さい。

login
この時、以下のようなSQLで皆さんが入力した内容のユーザーが存在するか、データベースに問い合わせるとします。

SELECT * FROM users WHERE uid = ‘moyomoto‘ AND password = ‘m3Li1M!5

赤字の部分にログイン画面でユーザーが入力した内容が入ります。
翻訳すると

「ユーザー情報の中に、ユーザーIDがmoyomotoでパスワードがm3Li1M!5のユーザーっている?」

といったような内容になります。
 
では、試しにこのような文字列を入力してみましょう。
‘ OR 1=1–
なんじゃらほいですね。
 
するとSQLがこうなります。

SELECT * FROM users WHERE uid= ‘‘ OR 1=1–‘ AND password = ‘3Li1M!5’

翻訳すると

「ユーザー情報の中に、ユーザーIDが「空」もしくは1=1ってありますか?」

ログインIDとパスワードの部分だけが変わるはずなのに、全然違う意味のSQLになってしまいましたね。
 
本来ならメールアドレスとパスワードが一致した時に初めてログインの認証が通るはずですが、このSQLだと1は1だからOKとなり、問答無用で認証が通ってしまいます。

つまりどういうこと?

SQLデータベースを操作・命令するための言語です。
 
データベースの中の情報を検索したり、変更したり削除したり条件をつけたりするために、様々な文法が用意されています。
 
そして、WEBアプリケーション側では、変数を用いて、ユーザーが入力した内容を代入するSQLの文を準備しています。
攻撃者はデータを削除してやろうと思ったら、WEBアプリケーション側でデータベースにアクセスする為にSQL文を作成しているであろう箇所に対して、データを削除するSQL文が作られるように攻撃するのです。
flow
そして、本来とは違う意図していない処理を発生させるのです。
 
攻撃は今回のような入力フォームであったりアドレスバーから行われます。
form

対策

escape
このような攻撃に対して、WEBアプリケーション側で対策を行いましょう。
そのためには、例え攻撃されても、SQLが影響を受けないようにしなければいけません。
 
有効な方法としてエスケープ処理があげられます。
SQLにおいて特別な意味をもつ記号を、何でもない文字に変換させます。
こうすると、別の意味のSQLに書き換えられるのを防ぐことができます。
flow2

「ラストナンバー行くぜ!!」

どうでしたか?
怖いですね~。
後は、どれだけ怖く話せるかです。
ある有名人の方が言っていました、何かについて話す時、まず3人に話せと、そうすれば自分の頭の中で整理されて上手く話せるようになると。
これで、もう怪談話の時に自分の番が来ても怖くありませんね。
 
もょもとでした。
 

LINEで送る
Pocket

こんな記事も読まれています