駆け出しエンジニアぱかぱかの成長記録

引くほど忘れっぽい新卒2年目駆け出しSEぱかぱかの備忘録です。

【セキュリティ】箱庭BadStoreでSQLインジェクションしてみる

こんにちは!ぱかぱかです!
ここ数回の記事ではAndroidアプリ開発について書いていたのですが、今日は少し趣向を変えてセキュリティのお話をしたいと思います。
というのも私、セキュリティ関係のプロジェクトに配属されている先輩から以下の本を1年以上借りっぱなしになっているのです…

セキュリティ界隈では有名で徳丸本と呼ばれているこの本。
読もう読もうと思いつつ、資格勉強やモバイル開発の勉強を優先してしまいずっと後回しにして今に至ります…
流石に返したいのですが、こんなに長いこと借りているのに全く理解できていないのは先輩にも合わせる顔がないので、ブログにまとめつつ出来る範囲で理解して記憶に残しておきたい…
応用情報でもセキュリティの分野の出題が多くとっかかりの知識はできたので、もう少し深められればと思います!
今日は基本情報の頃から登場していて耳馴染みのあるSQLインジェクションについてです。

SQLインジェクションとは

SQLインジェクションは「SQLの呼び出し方に不備がある場合に発生する脆弱性」のことです。
DBへの問い合わせを行うWebサイト上で入力内容に悪意ある操作を行うSQLを埋め込んで不正な操作を行います。

これによって以下のような様々な不正を行うことができてしまいます。

・情報漏洩
・データ改竄
・認証の回避
・プログラムの実行
・ファイルの参照・更新

なんでもありですね…
非常に影響の大きな脆弱性として位置付けられています。

実際にやってみる

ここで実際にSQLインジェクションをやってみたいと思います!
といっても実際のWebサイトに試行するのは不正アクセス禁止法違反となり、3年以下の懲役または100万円以下の罰金に処せられる可能性があるそう…やばい…!
ということで今回は、Burp Suite箱庭BadStoreという脆弱性診断環境を作って不正行為に及んでみたいと思います。

環境のセットアップは以下ブログを参照させていただきました。

hex-0xff-255.hatenablog.com

Burp Suiteとは

Burp Suiteはローカルプロキシツールの一つで、Web アプリケーションのセキュリティや侵入テストに使用されるものです。
リクエストとレスポンスを見て通信を解析したり、ボディを書き換えて擬似的に攻撃を行ったりできる模様。
これ、セキュリティに限らず通信の準正常系のテストとかにも使えるのでは…?と思ったり。便利ですね。

箱庭BadStoreとは

箱庭BadStoreは脆弱性が組み込まれたやられ用のwebアプリケーションです。
本家のBadStoreはもう現在アクセスできないため、拡張として動作するよう書き直してくれている以下GitHubからインストールしました。

github.com

立ち上げるとこんな感じの画面が出てきます!

なんか怪しげ…

それでは早速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 --

すると、メールアドレスとユーザー名の情報が一覧で取得できてしまいました!
これは危ないですね…

対策

SQLインジェクションの対策方法は以下の通りです。

プレースホルダーを利用する
 ここでJava Goldの知識が生きる時…!
 以下の記事にも登場したJDBCのPreparedStatementのようなフレームワークの仕組みを使うことで想定外のSQL文組み立てを防げます。

radish-se.hatenablog.com

エスケープ処理を実施する

SQL的に意味のある’や-の文字列を無害化することで防ぐことができます。


長くなりましたが今日はここまでにします。
ありがとうございました。