こんにちは!ぱかぱかです!
ここ数回の記事ではAndroidのアプリ開発について書いていたのですが、今日は少し趣向を変えてセキュリティのお話をしたいと思います。
というのも私、セキュリティ関係のプロジェクトに配属されている先輩から以下の本を1年以上借りっぱなしになっているのです…
セキュリティ界隈では有名で徳丸本と呼ばれているこの本。
読もう読もうと思いつつ、資格勉強やモバイル開発の勉強を優先してしまいずっと後回しにして今に至ります…
流石に返したいのですが、こんなに長いこと借りているのに全く理解できていないのは先輩にも合わせる顔がないので、ブログにまとめつつ出来る範囲で理解して記憶に残しておきたい…
応用情報でもセキュリティの分野の出題が多くとっかかりの知識はできたので、もう少し深められればと思います!
今日は基本情報の頃から登場していて耳馴染みのあるSQLインジェクションについてです。
SQLインジェクションとは
SQLインジェクションは「SQLの呼び出し方に不備がある場合に発生する脆弱性」のことです。
DBへの問い合わせを行うWebサイト上で入力内容に悪意ある操作を行うSQL文を埋め込んで不正な操作を行います。
これによって以下のような様々な不正を行うことができてしまいます。
・情報漏洩
・データ改竄
・認証の回避
・プログラムの実行
・ファイルの参照・更新
なんでもありですね…
非常に影響の大きな脆弱性として位置付けられています。
実際にやってみる
ここで実際にSQLインジェクションをやってみたいと思います!
といっても実際のWebサイトに試行するのは不正アクセス禁止法違反となり、3年以下の懲役または100万円以下の罰金に処せられる可能性があるそう…やばい…!
ということで今回は、Burp Suiteと箱庭BadStoreという脆弱性診断環境を作って不正行為に及んでみたいと思います。
環境のセットアップは以下ブログを参照させていただきました。
Burp Suiteとは
Burp Suiteはローカルプロキシツールの一つで、Web アプリケーションのセキュリティや侵入テストに使用されるものです。
リクエストとレスポンスを見て通信を解析したり、ボディを書き換えて擬似的に攻撃を行ったりできる模様。
これ、セキュリティに限らず通信の準正常系のテストとかにも使えるのでは…?と思ったり。便利ですね。
箱庭BadStoreとは
箱庭BadStoreは脆弱性が組み込まれたやられ用のwebアプリケーションです。
本家のBadStoreはもう現在アクセスできないため、拡張として動作するよう書き直してくれている以下GitHubからインストールしました。
立ち上げるとこんな感じの画面が出てきます!
それでは早速SQLインジェクションをしてみましょう…!
トライ①:パスワードを知らないけどログインしちゃう
まずはBadStoreのログイン画面を開きます。
前提として「test1@test.com」というメールアドレスのアカウントが存在することだけを知っていることとします。
(事前にRegisterからこのアドレスで登録して実施しています。)
でもパスワードはわからない…
ここでとりあえず適当なパスワードを入力してみると
パスワードが違うので怒られました。
しかしEmail Addressの欄に以下を入力すると…
test1@test.com' or 'a' = 'a
パスワードに何も入力していないのにログインできてしまいました…!
種明かし
BadStoreのコードをあさってみるとEmail Addressの欄に入力した内容は以下SQL文の「id」の部分に入ります。
SELECT * FROM userdb WHERE email='id' AND passwd='passwd'
ここに先ほどのtest1@test.com' OR 'a' = 'aが入ると
SELECT * FROM userdb WHERE email='test1@test.com' OR 'a' = 'a' AND passwd='passwd'
初めはパスワードはAND条件となっており必ず見られていましたが、OR 'a' = 'a'のOR条件が間に挟まったことで、パスワードを見ずに前方のemail='test1@test.comの条件がtrueになるものを取得することができてしまいます。
トライ②テーブルの情報を取得しちゃう
また別の不正行為に及んでみます。
エラーベースインジェクション
商品検索のフォームにSQLの構文として意味を持つ「'」を入力してみます。
すると、画面いっぱいにゴリゴリのスタックトレースが表示されてしまいました。
悪い人たちはここから「ほう、DBはSQLiteを使っているのか」「カラム名はitemnum,sdesc,ldescか」と情報を読み取ってしまいます。
これをエラーベースインジェクションといいます。
テーブル構成がわかるとさらに悪いことができてしまいます。
ユニオンインジェクション
UNION句では結合時に指定するカラム数やデータ型を一致させる必要があります。
先ほどのような方法でテーブル構成の情報を手に入れてしまえば、あれこれ試さずとも簡単にUNION句を使えてしまうのです。
商品検索のフォームに以下を入力してみます。
' UNION SELECT null,null,sql,null FROM sqlite_master --
するとテーブルのメタ情報を記録しているsqlite_masterテーブルの情報が結合して表示され、データベースにどのようなテーブルが存在するのか、そのようなカラム構成なのか詳しくわかってしまうのです…
次は商品検索のフォームに以下を入力してみます。
' UNION SELECT null,email,fullname,null FROM userdb --
すると、メールアドレスとユーザー名の情報が一覧で取得できてしまいました!
これは危ないですね…