つくって学ぶWebアプリケーションの脆弱性0/5

# はじめに
『安全なWebアプリケーションの作り方』(筆者の名前から俗に徳丸本と呼ばれる)…

ちょっと難易度高いよ、と感じた人はいませんか？

私はPHPもセキュリティもド素人の状態で徳丸本を理解しろ、と言われたのでかなりキツかった思い出があります。

セキュリティエンジニアとしてのキャリアをスタートした場合、初めはwebアプリケーションの脆弱性診断を担当することが多いのではないかと思います。
そんな中で頼りになるのがこの徳丸本。
徳丸本は専門家である徳丸浩氏によってwebアプリケーションに関するセキュリティが網羅されています。
とはいえ、徳丸本を読みこなすのに必要な前提知識はあまり明示されていないのが実情ではないでしょうか。
職業エンジニアならこれくらいは理解していて当然、という暗黙の了解があるのかもしれません。

ということで、これを読めば徳丸本のハードルが低くなるかも…ということをまとめました。
しかし、私自身も徳丸本を†完全に理解した†とは冗談でも言えない状態です。これは私自身の学習ノートであり、完璧な指南書ではありません。
(読者の方でこの記事に何か引っかかる点を感じた方は、コメントに残していってくださると助かります。)

さて、このノート改め**つくって学ぶwebアプリケーションの脆弱性**では
* LAMP環境を用いて簡単なwebアプリケーションを実際に自分で作成しながら
* OWASP Top10などに挙げられている有名で危険性の高い脆弱性について学びながら再現し
* 最終的にはBurp Suiteを使って簡単な脆弱性診断をしていきます。

なかなか欲張りな内容だと自分でも思いますが、去年の自分に教える気持ちでできるだけ丁寧に書いていきます。
ちなみに、ここで使うソフトウェアは全て無料で提供されているものです。ご安心ください。
この解説もシリーズ最後まで無料で読むことができます。こちらもご安心ください。
(でも、投げ銭してくれるととっても嬉しいです。)

# 想定している読者
* webアプリケーション制作に興味があるけれど触れたことのない人
* サイバーセキュリティに興味をもっているけれど何から始めればいいかわからない人
* 業務上webアプリケーションやそのセキュリティについてサクッと知る必要がある人
* 徳丸本を読んで挫折した人

# 目次
**『つくって学ぶwebアプリケーションの脆弱性』全体の目次**
* 0:この記事です。webアプリケーションとは何かを説明したのち、今回制作するサンプルアプリケーションを概観し、環境を構築するところまでを行います。
* 1:アプリケーション制作前編です。webアプリケーションの静的な部分をつくっていきます。
* 2:アプリケーション制作後編です。データベースを使用してwebアプリケーションを完成させ、『つくった側が想定した入力であれば』きちんと動くことを確認します。
* 3:セキュリティ前編です。脆弱性とは何か、また有名で危険性の高い脆弱性について説明します。
* 4:セキュリティ後編です。制作編で制作したwebアプリケーションにどのような脆弱性があるか、意図しない入力をした場合にどんな挙動をするかを見ていきます。
* 5:まとめです。制作したアプリケーションを改良し、脆弱性に対して堅牢なアプリケーションにしていきます。

webアプリケーションに関する基本的な知識は既に持っていて、セキュリティのことだけを知りたい場合、3から読み始めることもできます。
ただし、webアプリケーション自体がどういうものなのかよくわかっていない場合は1と2だけで終わらせず、5まで通読することをおすすめします。

**つくって学ぶwebアプリケーションの脆弱性:0の目次**
i. はじめに
ii. 想定している読者
iii. 目次
1. webアプリケーションとは何か
2. 今回制作するアプリケーションの概観
3. LAMP環境の構築
 3.1. Kali Linux
 3.2. Apache2
 3.3. MySQL
 3.4. PHP
4. まとめ

# 1:webアプリケーションとは何か
日頃私たちが利用しているwebページには静的なサイトと動的なサイトがあります。

静的なサイトの定義は、『誰が見ても同じ内容が表示されるサイト』です。
[俳優の阿部寛さんのwebサイト](http://abehiroshi.la.coocan.jp/ "阿部寛のホームページ")が有名でしょうか。
静的なサイトは表示内容をクライアント(見ている人)によって変える必要がないので、既に完成しているHTMLをそのまま表示します。

対して動的なサイトの定義は、『人によって表示内容が変わるサイト』です。
例として [AmazonのECサイト](https://www.amazon.co.jp/ "Amazon.co.jp")が挙げられます。あなたがAmazonにアカウントを持っていた場合、ログインすれば左上に『お届け先　〇〇さん』とあなたの登録している名前が表示されるはずです。
動的なサイトはクライアントの入力を受け取り、処理をしてできたHTMLを表示します。

つまりwebアプリケーションとは、この動的なサイトと静的なサイトを組み合わせて、クライアントに何らかのサービスを提供するシステムと言えるでしょう(前述のAmazonのECサイトはwebアプリケーションでもありますね)。

# 2:今回制作するアプリケーションの概観
日頃私達がよく目にするwebアプリケーションはデザインも機能も非常によくできたものが多いので、アプリケーションをつくってみよう！というとなんだか難しそう、と気後れしてしまうかもしれません。

しかし、ものすごくシンプルなアプリケーションであれば、HTMLとCSS、そこに少しPHPとSQLクエリを書き足すことでつくることができます。

今回は、登録している人だけが閲覧・書き込みできる掲示板『Archimedes Club』をつくってみようと思います。会員制交流サイトと言えばかっこいいですね。

どのようなページから構成されているかを以下の図に示します。

![概観.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204334/e0a5c396-cbef-29fc-521c-aa7bcd0c5af0.jpeg)


結構たくさんのページがありますね。
しかし、登録完了ページやサインインに失敗した場合のページなど、静的でシンプルなページもあるので、制作自体はそこまでハードではありません。

webアプリケーションに限らずwebサイトやネイティブアプリなどを制作する場合においても、このような画面遷移図を描いてみることで、どのページとどのページをつなげればいいか？どのページがログイン必須なのか？と、制作に非常に役立つと個人的に思います。

また、現在は様々な言語やライブラリを使ってサイトやwebアプリケーションを制作することができます。
今回は、その中でも基本的な(見方によれば少し古いやり方である)LAMP環境と呼ばれる環境でwebアプリケーションを制作します。

LAMPとは使うソフトウェアの頭文字を取ったもので、

L:Linux(OS)
A:Apache(サーバーソフトウェア)
M:MySQL(データベースマネージメントシステム;DBMS)
P:PHP(サーバーサイド言語)

を指します。
環境によって使用する製品や言語が少し違ったりしますが、LAMP環境というとOS・サーバーソフトウェア・DBMS・サーバーサイド言語を組み合わせで開発を行う、ということです。

ここで注意ですが、今回制作するwebアプリケーション『Archimedes Club』は重大な脆弱性を含むものです。
GitHubで全てのソースコードを公開する予定ですが、このコードをそのまま他のアプリケーションに転用し、公開することは決して行ってはいけません。
あくまで手元でアプリケーションの動きを知る、脆弱性を学ぶという使い方にとどめてください。

次章では、アプリケーション制作に必要なこれらのソフトウェアのインストールについて軽く説明していきます。

# 3:LAMP環境の構築
インストールの細かい設定については、他サイトの紹介にとどめます。

## 3.1:Kali Linux
今回はたくさんの種類があるLinuxディストリビューションの中でも、Kali Linuxを使用します。
実際の業務でKali Linuxを使ってwebアプリケーションを制作することはほとんどないかと思いますが、今回はつくったアプリケーションの脆弱性診断まで行うので、脆弱性診断に長けたOSを利用することにします。

VM VirtualBoxを使用した仮想環境を用意するのがメジャーで手軽な方法かと思います。
インストールに関する設定方法などは[こちらのサイト](https://www.dot-plus.com/server/linux/kalilinux/1851/ "dotplus.com")をご参照いただくとわかりやすいでしょう。

## 3.2:Apache
無事Kali Linuxの仮想マシンを立ち上げられたでしょうか。
次は、Kaliのターミナルを起動してApache(アパッチ)というサーバーソフトウェアをインストールします。

サーバーというと、最近はゲームなどでもよく聞きますよね。また、暗い部屋にたくさんの大きな機械が並んでピカピカ光っているというイメージを持っている人も多いと思います。
しかし、それは企業などが使う大規模で本格的なサーバーで、自分でサーバー機能を試してみるくらいであれば、コンピュータにーサーバーソフトウェアをインストールするだけでサーバーの機能を与えることができます。

サーバーの仕組みについて詳しく知りたい場合は、書籍『イラスト図解式　この一冊で全部わかるサーバーの基本』(ISBN:978-4797386660)がおすすめです。コンパクトにまとまっており、技術書ですが電子書籍でも十分に理解を深めることができます。

Apache2のインストールは、Kaliのターミナル上で
`sudo apt install apache2`
と入力し、Kaliの設定時に決めたユーザパスワードを入力(デフォルトではkali)します。

インストールが終わったら、ターミナル上で
`sudo service apache2 start`
とコマンドを入力することでサーバーを起動できます(環境構築の時点では起動しなくて構いません。起動するタイミングはまた後述します)。

サーバーを停止させる際は
`sudo service apache2 stop`
で停止させましょう。

サーバーが今起動しているか？停止しているか？という状態確認は
`service apache2 status`
で行うことができます。ステータス確認の際はsudo権限は必要ありません。

## 3.3:MySQL
MySQLはRDBMS(Relational Data Base Management System;リレーショナルデータベース管理システム)のひとつです。
表の形をしたデータベースに対し、SQLと呼ばれるデータベース操作言語を用いてデータを追加・編集・削除します。

バージョンによってApacheのインストールの際に一緒にインストールされているかもしれませんが、
`sudo apt install mysql-server`
でインストールできます。

こちらもApacheと同様、
起動の際には
`sudo service mysql start`
停止の際には
`sudo service mysql stop`
のコマンドを入力する必要があります。

さて、インストール時点でrootというユーザーが自動生成されているのですが、rootのパスワードも自動生成されています。
この初期パスワードの探し方については[こちら](https://qiita.com/RyosukeSomeya/items/c695487588f5ac28d9f4 "MySQLの初期パスワードのありか")を参照して、入力しやすいパスワードを設定しておいてください。

MySQLも環境構築時点では起動しておく必要はなく、またroot以外のユーザーやテーブルなども現時点では作成しなくて構いません。MySQLの操作についてはアプリケーション制作後編で扱います。

## 3.4:PHP
今回はサーバーサイド言語としてPHPを利用します。

サーバーサイド言語とはどういったものかという説明は他サイトに任せますが、HTMLやCSSも含め、フロントエンドの構築にまったく触れたことがないという方は[Progate](https://prog-8.com/ "Progate")というオンラインプログラミング学習サービスがオススメです。
(無料プランでも一部の言語が学習できますが、有料でも月額1000円ちょっとで10個以上の言語やライブラリについて体系立てて学習できるので、頑張れば本を買うよりお得かもしれません)

PHPのインストール方法ですが、
`sudo apt install php`
で最新バージョンのPHPがインストールされるはずです。

インストールに成功していれば、
`php -v`
でバージョンを確認することができます。

# 4:まとめ
この記事では記事シリーズ全体の説明とwebアプリケーションの概観、そして環境構築までを行いました。
次の記事ではwebページの静的な部分を制作していく予定です。

次の記事→まだ