徳丸試験（ウェブ・セキュリティ基礎試験）の試験情報と勉強方法

ウェブ・セキュリティ基礎試験を受験してきました。
とてもいい資格なので少しでも合格者が増えるように勉強方法含め情報共有します。

## ウェブ・セキュリティ基礎試験とは

徳丸本の愛称で有名な[体系的に学ぶ 安全なWebアプリケーションの作り方](https://www.amazon.co.jp/dp/4797393165/)の理解度を問う試験です。
問題作成をご担当されている徳丸先生にちなんで**徳丸試験**と呼ばれています。
Webアプリケーションを開発するにあたって、知っておくべきセキュリティや脆弱性の知識を身に付けることができます。
**「徳丸本読まずしてWebアプリケーションを作るなかれ」**と言うぐらい必須の知識です。（私が勝手に言ってるだけです。）

詳細は以下をご覧ください。
https://www.phpexam.jp/tokumarubasic/

## 試験の基本情報

試験の形式は以下の通りです。（執筆時点）

<table>
  <tr>
    <td>問題数</td>
    <td>40問</td>
  </tr>
  <tr>
    <td>時間</td>
    <td>60分</td>
  </tr>
  <tr>
    <td>問題形式</td>
    <td>全問4択</td>
  </tr>
  <tr>
    <td>合格ライン</td>
    <td>70%</td>
  </tr>
</table>

徳丸本ではPHPのコードをベースに解説されているものが多いですが、試験ではPHPの知識は不要です。

## 出題傾向

公式情報では徳丸本全てがテスト範囲となっていますが、結構偏っていた印象です。

|テキストの章|問題数|
|:--|:--|
|1章 Webアプリケーションの脆弱性とは|1問|
|2章 実習環境のセットアップ|0問|
|3章 Webセキュリティの基礎 ～ HTTP、セッション管理、同一オリジンポリシー|3問|
|4章 Webアプリケーションの機能別に見るセキュリティバグ|30問|
|5章 代表的なセキュリティ機能|3問|
|6章 文字コードとセキュリティ|0問|
|7章 脆弱性診断入門|0問|
|8章 Webサイトの安全性を高めるために|2問|
|9章 安全なWebアプリケーションのための開発マネジメント|1問|

> 個人的観点からの集計です。出題傾向を保証するものではありませんし、今後変更される可能性もあります。参考程度に考えてください。

4章が徳丸本のメインなので試験でも多く出題されています。
2、7章はツールの話なので出題がないのは予想通りですが、6章から0問だったのは意外でした。（たまたまかもしれません。）

## 勉強方法

私は徳丸本を2周しました。
1周目に要点をScrapBoxにまとめて、2周目に理解が薄いところ、読むのをサボったところを重点的にさらっと読みました。
直前にはScrapBoxを見直して試験に挑みました。
徳丸本は600ページ以上あるので1周読むのにも時間がかかります。
そこで、出題傾向から「ココに注意して読むと効率が良いよ」というところをまとめました。

### 1. まずは3章を正確に理解せよ

3章ではHTTPの仕組みや、ドメインとクッキーの関係、CORSの考え方など、Webアプリケーションの脆弱性を考える上で必要不可欠な知識の説明がされています。
この章が重要な理由は2つです。

- 3章がわからないと、脆弱性の影響範囲が理解できない
- 3章がわからないと、脆弱性の対策が理解できない

試験では以下のような脆弱性の影響範囲を問う問題がよく出題されました。

```
問.セッションハイジャックの影響範囲として適切な選択肢を選べ
 
1. 同じドメインとサブドメインのページに影響がある
2. 同一オリジンのサイトに影響がある
3. 脆弱性のあるページのみに影響がある
4. 個人情報を扱うページに影響がある
```
> ※実際の問題とは異なります。

ドメインとは何か、同一オリジンとは何か、正確に把握していないと回答できません。
また、**3章を理解していないと4章以降の脆弱性の原因や影響、対策が理解できません。**
先を急がず、まずは3章を正確に理解することに時間をかけましょう。

#### おすすめ勉強法
図に書いたり、他の人に説明したりするのがおすすめです。
理解が深まりますし、間違った理解のまま試験を受けることを防止できます。
徳丸本だけでわからない場合は、他の資料も参考にしましょう。

### 2. 3大脆弱性を完全に理解せよ
3大脆弱性とは以下の3つです。

- XSS（クロスサイトスクリプティング）
- SQLインジェクション
- CSRF（クロスサイトリクエストフォージェリ）

これらの脆弱性は、多くのWebアプリケーションで考慮する必要がある重要なもので、試験でも最優先で理解する必要があります。
理由は2つです。

- 出題傾向が高い
- ほとんどの脆弱性はこの3つのどれかに似ている

単純に出題傾向が高い以外に、**他の脆弱性の理解の助けになります。**

例えば、OSコマンドインジェクションという脆弱性があります。
これは```cp```や```rm```などのシェルコマンドをアプリケーションから実行されてしまう脆弱性です。
SQLインジェクションのOSコマンドバージョンと言って良いと思います。
攻撃方法や対策もよく似ていますので、SQLインジェクションさえ理解していればスムーズに読み進めることができます。
他の脆弱性も多くは上記の3つのどれかに似ているので、まずは3つを理解することで効率的に勉強できます。

#### おすすめの勉強法
徳丸本には脆弱性の対策の実装方法が載っています。
少し時間はかかりますが、3つの脆弱性だけでも実際に実装してみることをおすすめします。
特にCSRFは文章だけだと理解しづらいので、対策も含めて実装することで理解が深まるでしょう。

### 3. 脆弱性と対策を紐づけよ
脆弱性と対策はセットで覚えましょう。
理由は1つです。

- 選択肢の中に別の脆弱性の対策を混ぜてくる

試験では以下のような設問が目立ちました。

```
問.XSSの対策として不適切な選択肢を選べ

1. 「<」を「&lt;」にエスケープする。
2. 入力値をチェックする。
3. 改行を消去する。
4. 入力内容を英数だけに限定する。
```
> ※実際の問題とは異なります。

「3. 改行を消去する」は、HTTPヘッダインジェクションやメールヘッダインジェクションの対策です。
不適切な選択肢には、**全く的外れなものではなく、他の脆弱性の対策を混ぜてきます。**
脆弱性と対策の紐付けがあいまいだと苦労しますのでしっかり区別して覚えましょう。

#### おすすめ勉強法
ノートなどに脆弱性と原因、影響、対策をまとめておくと良いでしょう。
資格試験だけでなく実際の開発の時にも役立ちます。

### その他注意すること
HTTPのリクエストヘッダやレスポンスヘッダの設定についてもいくつか出題されました。
これも表にして覚えることで得点源にできます。

## 所感
勉強してよかったと思える試験でした。
「こんな攻撃手法良く思いつくなぁ」っていうハッカー目線で勉強しても面白いですし、ネットサーフィンしててやばそうなURLを踏んでしまった時に、「やばい、もしCSRF仕込んであったらどうすべき！？」とか色々考えることもできるようになります。もちろん開発業務で役に立つことは間違いありません。