Webエンジニアでテッペン取るならPortSwiggerでセキュリティを勉強しよう

**みすてむず[^1] アドカレ(4) の4日目の記事です**
https://adventar.org/calendars/8652

# はじめに

煽りタイトルでスミマセン🙇‍♂️

昨今情報漏洩事故が多発しており、セキュリティの重要性が叫ばれています。
事故原因は様々で、ネットワークやプラットフォームの不備、アプリケーションの脆弱性、人的要因などがあります。

Web開発とは切っても切れないWebアプリケーションセキュリティですが、皆様は **脆弱性の原理を正しく理解していますか？**
脆弱性の名前や、コードを書く際に気を付けなければならないポイントやフレームワークの使い方をおさえている方は多いかと思いますが、「なぜ」を考えていますか？

しっかり理解していくことでコード書く時以外でも設計やレビューでセキュリティの知見に立ったアドバイスができるようになります。また新しいフレームワークやアーキテクチャに出会ったときにも、漫然と推奨設定をしたりWAFに任せたりするのではなく、どうすれば現場に最適なセキュリティとなるかが考えられるようになります。

本質を知り、最適な方法でプロジェクトを導いていくのはリーダーやシニアエンジニアの重要な資質だと思います。
セキュリティは一つの要素ではありますが、こういった本質をおさえていくことで **少なくともチームのテッペンは狙える** エンジニアになれると思いますので、キャリアを伸ばしていく上で参考になれば幸いです。

# Webセキュリティの教材「PortSwigger Web Security Academy」

## 紹介

Webセキュリティの教材として有名な PortSwigger Web Security Academy を紹介します。

PortSwiggerはWebのテストツールである **Burp Suite** の開発元であり、このWeb Security Academyは脆弱性診断トレーニングとしてよく使われています。

PortSwiggerの自前の資格である[BSCP](https://portswigger.net/web-security/certification)や、有名どころだと **OffSec社(旧Offensive Security社)の [OSWE](https://www.offsec.com/courses/web-300/)** の勉強に使われることが多いものです。

- PortSwigger Web Security Academy
    - https://portswigger.net/web-security

## まず事前準備しましょう

Burp Suite Community Editionを入手しインストールしておきましょう。無料です。
 - https://portswigger.net/burp/communitydownload

### ローカルプロキシとして動かす場合

Webサイトのテストをする際、Burp Suite内からブラウザを開くことで試すこともできますが、機械翻訳などChromeの機能が使えなくなります。
そこでおすすめなのが、Chrome拡張機能の[FoxyProxy Standard](https://chromewebstore.google.com/detail/foxyproxy-standard/gcknhkkoolaabfmlnjonogaaifnjlfnp?pli=1)を導入して、Burp Suiteをローカルプロキシとして通す方法です。

Burp Suiteを起動し、Proxy から Proxy settingsを開くと、Proxy listenersに現在のプロキシがありますので、これをFoxyProxyに登録します。

そのままだとHTTPSページで証明書エラーが発生するため、BurpのProxy listenersの下にあるImport / export CA certificateから証明書をエクスポートし、信頼されたルート証明機関として取り込んでおきます。**※自己責任でお願いします！**

## はじめてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117852/56427237-be69-401e-c322-0f10e8021613.png)

初めてアクセスされる場合は 「Sign up」してください。
パスワードは先方から払い出されます。
費用は無料です。

ログインした後、[Academy](https://portswigger.net/web-security/dashboard)に進むと学習の進捗が表示されるダッシュボードが表示されます。

まずは上部のメニューにある[Learning paths](https://portswigger.net/web-security/learning-paths)を選んでみましょう。
APPRENTICE(見習い)レベルに **Server-side vulnerabilities** がありますので、このpathを開いてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117852/d3ba6c09-c427-fce4-f3d4-ecf0a0a987c0.png)

ここからはサーバーサイドの脆弱性に関する説明が出てきます。
平易な英語で丁寧に書かれており、そのままでも機械翻訳でも読みやすいです。
最初はパストラバーサルからですので読み進めていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117852/e8c83f5a-3aae-5193-d0a3-7413e58abb20.png)

## ラボの登場

ラボとは実際に脆弱性をテストできるサンドボックス環境です。
これが無料で提供されているとはすごい…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117852/5086ce38-6aaf-3bb0-f14a-3382d6d5d1a1.png)

ラボには問題文が書かれています。（以下機械翻訳文）
> このラボには、製品画像の表示にパス トラバーサルの脆弱性が含まれています。
> ラボを解決するには、/etc/passwdファイルの内容を取得します。

`ACCESS THE LAB`を押して開いてみましょう。テスト用のECサイトが表示されると思います。
たまに仮想環境の起動に時間がかかるのかエラーが出ることがありますが、再度アクセスしてみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117852/87839120-6f60-c372-3297-30e94656a506.png)

画面をしばらく放置しても同じようにエラーが出ることがあります。その場合も再度アクセスください。
なお、URLは変わっている可能性があります。

## ラボを解いてみよう

親切なことに、ラボの直前に書かれている脆弱性の説明記事にヒントが載っていますので、いろいろと試してみましょう。
製品画像の表示に脆弱性があるということですので、HTMLを見てみると下記に脆弱性があるということになります。
```html
<img src="/image?filename=15.jpg">
```

Burp SuiteのProxyのHTTP historyを開き、FilterにImagesも追加しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117852/5ca30707-3d5b-948c-1995-75cb9942889a.png)

すると下記のようなHTTPの履歴が表示されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117852/0ba89bb1-a710-1fb1-e0fa-57f9d1a8315c.png)


この履歴を右クリックして、`Send to Repeater`を押してみましょう。
そうすると`Repeater`の画面で先ほどのリクエストが表示されていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117852/caa24bf2-d183-15e3-8a18-9f8eb2394994.png)

あとはいろいろリクエストをいじって`Send`で送ってみましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117852/bf51378c-cc7d-c5c5-e03d-464231733b42.png)

### 開発現場を振り返って

パラメータの値を使って内部のファイルを取得する実装、振り返ってみると **実際の現場で見たことありませんか？**
```
/image?filename=15.jpg
```

私は過去にファイルマネージャー系のWeb画面でこのような実装を見たことがありました。
そして同様の脆弱性があったのですが、幸いリリース前で事なきを得たのを思い出します。

ラボに出てくる脆弱性はどれも誰かが過去にやらかしたもので、歴の長いエンジニアほど「どこかで見かけたなぁ」と思うでしょう。

## ラボをクリア

無事課題をこなすとCongratulationsと出てきます！
このとき脳汁出るんですよね🤪

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117852/d7da18ab-7506-b37f-1cc0-e0d2e16b3626.png)



## どこまで進めるべきか

[ラボ](https://portswigger.net/web-security/all-labs)には様々なテーマがあります。(2023/11現在)
APPRENTICE (見習い)レベルが含まれているテーマだけでも以下があります。

- SQLインジェクション
- クロスサイト・スクリプティング (XSS)
- クロスサイト・リクエスト・フォージェリ (CSRF)
- クリックジャッキング
- クロスオリジンリソース共有 (CORS)
- XML外部エンティティ参照 (XXE) インジェクション
- サーバーサイド・リクエスト・フォージェリ (SSRF)
- OSコマンドインジェクション
- パストラバーサル
- アクセス制御の脆弱性
- 認証
- Web Socket
- 安全でないデシリアライズ
- 情報開示
- ビジネスロジックの脆弱性
- HTTPホストヘッダー攻撃
- OAuth認証
- ファイルアップロードの脆弱性
- JWT
- GraphQL APIの脆弱性
- 競合状態
- NoSQLインジェクション

脆弱性診断をしない通常の開発者であれば、**APPRENTICE (見習い)レベルのラボを一通りこなすだけでよい** と思います。
見習いレベルとはいえ、座学だけではなく実際に手を動かすことで **脆弱性の基本原理がしっかり学べます** 。

もし面白いと感じてセキュリティエンジニアを目指したくなったらぜひ PRACTITIONER をやってみてください。
ただしリストを作って文字列を片っ端から送って抜け漏れを調べるといったブルートフォース系の課題も増えてきます。そうなるとCommunity版では手作業になるためやりにくくなり、Professional版なり別のツールなりを用意する必要がでてきます。

所要時間については当然ながら個人差がありますが、自分の場合は56個の見習いラボ (2023/11現在) で大体15～20時間くらいだったと思います。
業務の合間に少しずつ進めたので、集中してやればもう少し早く終わるでしょう。

# まとめ

- Webエンジニアでキャリアを積むならセキュリティも学ぼう。
- 脆弱性の原理を理解するには、実際に手を動かすハンズオンラボがある環境がおすすめ。
- 本質を知り、最適な方法でプロジェクトを導けるつよつよエンジニアになろう。

セキュリティに強いアプリケーションエンジニアは希少です。ぜひチャレンジしてみてください！

[^1]:[みすてむず いず みすきーしすてむず](https://misskey.systems/)はMisskeyサーバーの1つで、ITに関わる人が参加する分散型SNSです。