Re:ゼロから始めるクラッキング生活〜SQLインジェクション編〜

#「SQLインジェクションとは」から入って、「改修・対策」まで　システム担当者は「まとめ」必読
攻撃用サイトにクラッキングしていくぅ

過去作はこちら
・[OWASP ZAPを使った脆弱性診断入門〜環境構築編〜](https://qiita.com/samuragouchi-monzaemon/items/0fb834f4988387b8b85b)

執筆にあたって、以下の書籍を参考にさせていただいています。
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/4797393165/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797393165&linkCode=as2&tag=samuragouchim-22&linkId=5fb6447e993b06302367fa0cab36de84"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4797393165&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=samuragouchim-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=samuragouchim-22&l=am2&o=9&a=4797393165" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4797393165/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797393165&linkCode=as2&tag=samuragouchim-22&linkId=8f9cc83d5750675abea81f7a29044c12">体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=samuragouchim-22&l=am2&o=9&a=4797393165" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

##目的
SQLインジェクションについて、理論だけでは限界があるので、実際にクラッキングすることによって根本から学ぶ。

##SQLインジェクションとは
>SQLインジェクションの「SQL」とは、データベースを操作する代表的な「データベース言語」のことです。またSQLインジェクションの「インジェクション」とは、英語で「注入」を意味します。不正な「SQL」の命令を攻撃対象のウェブサイトに「注入する（インジェクションする）」のが、SQLインジェクションです。
SQLの呼び出し方に不備がある場合に発生します。

例えばセキュリティ対策が十分でないサイトに、任意のキーワードで検索できる検索フォームがあるとします。攻撃者がそのフォームへ悪意あるSQL文を入力することで、そのSQL文の内容が実行されてしまいます。これによりデータが奪われてしまったり、ウェブサイトが改ざんされてしまったり、認証を回避されてしまったりします。

##想定される被害
SQLインジェクション攻撃による主な被害として、個人情報の漏洩と改ざん、認証の回避があげられます。以下、それぞれの被害内容について簡単に解説します。
###①個人情報の漏洩
ウェブサイトが利用するデータベースには、そのウェブサイトを利用者するユーザーのID・パスワード・暗証番号をはじめとした個人情報が含まれています。攻撃者がウェブサイトに対してSQLインジェクション攻撃をしかけることで、不正なSQLの命令が実行されてしまい、それら個人情報がすべて奪われてしまう可能性があるのです。

たとえば脆弱性のあるウェブサイトのウェブフォームに、「データベースに登録されている会員情報すべて表示しなさい」という内容のSQLの命令を入力するとします。対策がきちんとされていなければ、その命令がそのまま実行されてしまい、会員情報がすべて奪われてしまうというわけです。

####実際の被害
過去には様々な被害がありました。
・「PlayStation Network」に対するSQLインジェクション攻撃によって、約7,700万人分の個人情報の流出
・株式会社釣りビジョンのWebサイトに対するSQLインジェクション攻撃によって、63,656人の個人情報の流出

最近では、人材派遣会社のアスカが、SQLインジェクションにより3万件の個人情報を流出させました。

###②ウェブサイトの改ざん
またSQLインジェクション攻撃により、対象のウェブサイトを改ざんすることもできます。そのうえで改ざんされたサイトへアクセスすることによって、ウイルス感染させられるという場合もあります。

###③認証の回避
ログイン画面にSQLインジェクションの脆弱性がある際に、認証を回避され、パスワードを知らなくてもログインできてしまいます。

##実際に攻撃してみる
今回はこちらのサイトを使用させていただいて攻撃をしていきます。
[メモリリーク、デッドロック、リダイレクトループ、JVMクラッシュ...バグだらけのWebアプリケーションを使ってバグを理解する](https://qiita.com/tamura__246/items/7275c7406706fb0057e8)



###個人情報の漏洩
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273596/a1d26f89-cf6d-a327-60ff-304638b37a7d.png)
このような検索画面に対してSQLインジェクションを仕掛けていく。
今回は暗証番号検索だが、ログイン画面等、どのアプリケーションでもあるような機能が、SQLインジェクションの対象である。

####準備ができたら実際に攻撃
一般的にデータベースから情報を取得する際、以下のようなSQL文が使われる。

```

SELECT * FROM ユーザマスタ WHERE ユーザID = '{$userId}' AND パスワード = '{$password}'
```
ここで、
```
パスワード = '{$password}'
```
に注目してほしい。
先ほどの暗証番号検索画面にて、入力した値が、パラムとして{$password}に入ってくる。

例えばパスワード欄に「ぽーくぴっつ」と入力したら、上記SQL文には
```
パスワード = 'ぽーくぴっつ'
```
と入り、~~ユーザの中から「ぽーくぴっつ」な人を照会する仕組みだ。~~
ユーザマスタから、パスワードがぽーくぴっつの人を照会する仕組みだ。

ここで、悪意あるユーザが、ユーザマスタから全ての暗証番号を取得したい際に入力するパラメータは、以下のようになる。
```
'OR'1'='1
```
これを入力すると、上記のぽーくぴっつが置き換わるだけなので、
```
パスワード = ''OR'1'='1'
```
となる。
1=1のものを取得する＝全て取得できるというわけだ。
これを行なって取得した結果が以下となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273596/ab1beff7-bafe-1cf5-a530-a134eec4fe4f.png)

ご覧の通り、全ての暗証番号が一覧となって取得されている。


##改修・対策
それでは、SQLインジェクション攻撃による被害を予防するためには、どんな対策をとればよいのでしょうか。参考にさせていただいている徳丸浩さん著「<a target="_blank" href="https://www.amazon.co.jp/gp/product/B07DVY4H3M/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07DVY4H3M&linkCode=as2&tag=samuragouchim-22&linkId=4f6141efa34ff0e6d043bc3b80740ed8">体系的に学ぶ 安全なWebアプリケーションの作り方 第2版［固定版］　脆弱性が生まれる原理と対策の実践</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=samuragouchim-22&l=am2&o=9&a=B07DVY4H3M" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」によると、確実な対策としては１つだけで、プレースホルダを利用してSQLを呼び出すことです。

###静的プレースホルダによるSQL文組み立て
静的プレースホルダは、実行前にSQL 文の構文解析などの準備をしておく方式である。セキュリティの観点で、最も安全であり、SQL インジェクションの脆弱性は生じない。

```pypy.java
PreparedStatement prep = conn.prepareStatement("SELECT * FROM users WHERE name=?");
prep.setString(1, "samuragouchi");
```
ここで、パラメータ部分を示す記号?のことをプレースホルダと呼び、そこへ実際の値を割り当てる。

```pypy.java
prep.setString(1, userId);
```
ここで与えている数字は、何番目のプレースホルダであるか、です。
なので先ほどの名前とパスワードを入力する例としては、

```pypy.java
PreparedStatement prep = conn.prepareStatement("SELECT * FROM users WHERE ユーザID=? AND パスワード=?");
prep.setString(1, userId);
prep.setString(2, password);
```
となります。

##追加でやるべき対策
ここまでで説明したように、SQLインジェクションに対する根本的対策はプレースホルダを利用することでしたが、ここでは、プレースホルダの利用に加えて実施すると良い追加策をいくつか紹介します。

###脆弱性診断サービスでチェック
脆弱性診断サービスとは、攻撃者の立場にたってさまざまな疑似攻撃を行ってセキュリティのリスクがないか洗い出すサービスです。脆弱性診断サービスでは、今回紹介したSQLインジェクションをはじめとして、システムが幅広い攻撃を受ける危険性がないか調査します。

脆弱性診断サービスには無料・有料いずれも数多くの種類があります。そのうちの1つ「OWASP ZAP」は、よく知られる無料のウェブアプリケーション用脆弱性診断サービスで、今回紹介したSQLインジェクションやクロスサイトスクリプティングといったウェブサイトに対する代表的な攻撃に対する脆弱性の診断を行うことができます。

ただ、あくまでOWASP ZAPはSQLインジェクションやクロスサイトスクリプティングにしか使えないと思っておいた方がいいので、対顧客向けサービスは必ず、プロに任せましょう。
ちなみにWebアプリケーション診断は診断会社によって違いますが、プラットフォーム診断はほぼどこも変わりません(ツールで診断するためです)。
選ぶべきポイントは、診断観点です。まずは自社のセキュリティ規定をみましょう。そしてそれを充足している診断観点で診断してくれるベンダーを探しましょう。まあこの会社なら大丈夫でしょうではなく、セキュリティ担当者が診断観点を理解した上でベンダーを選定することが重要です。

###そのほかの対策方法
代表的な対策方法を紹介しましたが、さらに安全性を高めるために、以下にあげるような対策も有効です。
・データベースのアカウント権限を最小限にとどめる
・エラーメッセージをそのまま表示させないようにする
データベースのアカウント権限を最小限にとどめることで、仮に攻撃者に不正なSQL文を送信されても、その被害をおさえることができます。またシステムがだしたエラーメッセージをそのまま表示すると、攻撃者に対してシステムに関するヒントを与えてしまうことになるので注意して下さい。

##リスク低減、リスク保有の言い訳
ありません

##まとめ
ぶっちゃげSQLインジェクションは超有名な攻撃です。筆者も入社後の研修でプレースホルダを用いたエスケープ処理を実装しました。そのくらい新入社員だろうと知っておくべき知識なのです。サイバー攻撃が巧妙化する中で、こんな超有名な攻撃への対策を知らなかったでは済まされません。システム所管部の皆様、あえて厳しいことを言うと、所管しているシステムからSQLインジェクションの脆弱性が発見された時点で**恥ずべきこと**と心得てください。

改修コストが〜とか対費用効果が〜とか利用者が限定されているため〜とかつらつら言い訳を述べてくる担当者もいますが、IPAやその他国際団体が定める「リスク高」の脆弱性を改修しない言い訳は存在しないと考えといてください。

長くなりましたが、SQLインジェクションは超基礎だよ〜ってことです。
次回も超基礎の攻撃のどれかについてまとめます。

##参考
システムに携わる人は皆これをみとくべき
筆者は書籍とKindle版どっちも持っています。
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B07DVY4H3M/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07DVY4H3M&linkCode=as2&tag=samuragouchim-22&linkId=94855b99784ba51b83344ea8977ad6eb"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B07DVY4H3M&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL250_&tag=samuragouchim-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=samuragouchim-22&l=am2&o=9&a=B07DVY4H3M" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
・<a target="_blank" href="https://www.amazon.co.jp/gp/product/B07DVY4H3M/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07DVY4H3M&linkCode=as2&tag=samuragouchim-22&linkId=4f6141efa34ff0e6d043bc3b80740ed8">体系的に学ぶ 安全なWebアプリケーションの作り方 第2版［固定版］　脆弱性が生まれる原理と対策の実践</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=samuragouchim-22&l=am2&o=9&a=B07DVY4H3M" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

・[【初心者向け】SQLインジェクションの概要と対策方法](https://www.kagoya.jp/howto/network/sql-injection/)