WebGoatを用いたSQLインジェクション #02

前回の続きから解説します.

SQL Injectionとは

SQLインジェクションとは,データベース駆動型のサイトに対して行われる攻撃行為です.攻撃には,OSコマンドやスクリプト,データベースクエリなどが用いられます.SQLインジェクションを防ぐには,このような入力データを確認する必要があります.

 

String SQL Injection

 初めに,String SQL Injectionの練習としてWebGoatの「String SQL Injection」で提供されている問題に取り組みます.この問題では,SQLインジェクションを行って,登録されたクレジットカード番号を表示させることが目標です.「与えられたフォームは本来自分のクレジットカード番号しか表示できない」というシステムをどう利用するかがポイントです.解答は,「Solution Videos」で確認することもできます.

考え方

 ここでは,SQLについてほとんど知識がない,という状態を想定して,知識がなくてもできるアプローチ方法を考えます.主に,「わからなければ逐次調べる」というやり方です.今回の問題の指示通り「Smith」という名前を用いてSQLインジェクションして見ます.想定している方法は下のリスト通りです.

  • 書かれているSQL文を読む
  • 与えられた名前を試してみる
  • どのようになればいいか考える

1.書かれているSQL文を読む

 初めに,ヒントとして与えられている『SELECT * FROM user_data WHERE last_name = ?』というSQL文について調べてみます.「SELECT」をキーワードにして調べるとに下のリンクが出てくるので参考にします.

SQL講座|SELECT文とは

リンクより,SQLでは下のようなルールでデータベースを検索できることがわかります.

  • SELECT 〇〇: 表示するデータベースの列を選ぶ.全ての列の場合は〇〇の箇所に「*」を入れる.
  • FROM ▲▲: ▲▲という表にある〇〇という列を表示する.
  • WHERE ◇◇: 検索する際の条件

 よって,今回与えられたSQLでは,「サイトのユーザーデータが入っている表(user_data)中の,苗字(last_name)が?である全ての列を表示する」という意味であることが分かります.

2. 与えられた名前を試してみる

 次に,与えられたSQL文でどのように処理されているかを確認するために,与えられたユーザー名「Smith」を入力してみます.

f:id:y-cubed:20170611193152p:plain

 すると,下のようにSmithさんのクレジットカード情報が表示されました.SQL文を見てみると,Smithと入力したことで実際に「サイトのユーザーデータが入っている表(user_data)中の,苗字(last_name)がSmithである全ての列を表示する」処理がなされたことが分かります.

f:id:y-cubed:20170611193356p:plain

3. どのようになればいいか考える

 では,元のSQL文を利用してSQLインジェクションを行う場合には,?に何を入力すれば良いでしょうか.今回の場合,抽出条件をWHEREで抽出する際に,一工夫すれば良さそうだと考えられます.

 

解答 − シングルクォートによる攻撃

 SQLインジェクションの基本の攻撃文として,「'(シングルクォート)」を用いる方法があります.今回の場合は,?の部分に「' OR 'a' ='a」を入力すれば解決することがわかります.

 ******

 SQLインジェクションの有名な攻撃文は,以下のリンク等で確認できます.ただ,種類が多いので,参考程度の確認で大丈夫だと思います.

SQL Injection Cheat Sheet | Netsparker

まとめ

 復習として実践するための課題としては,下のような内容が挙げられます.