Webセキュリティ勉強会 Part-1

[OWASP Juice Shop]:https://owasp.org/www-project-juice-shop/
[Volta]:https://volta.sh/
[自作の脆弱性サイト]:https://vulnerable-web-site.vercel.app/
[Webセキュリティ勉強会 Part-2]:https://qiita.com/megmogmog1965/items/f7dbb541242baa842563

# これは何？

社内で Web アプリケーション開発におけるセキュリティ知識の向上を目的としたハンズオン勉強会を今年始めに開催しました。その際に作成した資料です。

Day 1 (2時間) と Day 2 (2時間) の、合計４時間構成としています。

:::note warn
本書では、解き方等は答えになっちゃうので敢えて書いてありません。
:::

# コンテンツ

基本的には [OWASP Juice Shop] を題材にピックアップしてます。

一部の問題はハンズオンでは難しかったので [自作の脆弱性サイト] で再現＆実践しています。

| 教材 | 脆弱性 |
|:----|:------|
| [OWASP Juice Shop] | SQL Injection (UNION Attack) |
| | Sensitive Data Exposure (重要ファイル公開されてる系) |
| | Improper Input Validation (API 入力チェック不備) |
| | DOM XSS (Cross Site Scripting) |
| | Reflected XSS (Cross Site Scripting) |
| [自作の脆弱性サイト] | Stored XSS (Cross Site Scripting) |
| | CSRF (Cross Site Request Forgeries) 
| | Clickjacking | 
| | SSRF (Server Side Request Forgeries) |

# 前置き

https://pwning.owasp-juice.shop/companion-guide/latest/introduction/architecture.html

序文では、[OWASP Juice Shop] のアーキテクチャだけは認識しておきましょう。よくあるシングルページアプリケーション (脆弱性モリモリ) です。

![ebef2a52-60ed-00f6-5595-5f8ce19cceef.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60131/56694f17-5040-f328-89d2-e3954c116422.png)
※ 画像は [OWASP Juice Shop] 公式より転載

# 事前準備

## Node.js 21.5.0 インストール

[OWASP Juice Shop] は Node.js `21.5.0` で動かします。 バージョン管理に [Volta] を利用している場合は以下の通りに実行します。

```shell
volta install node@21.5.0
```

## OWASP Juice Shop の起動

[OWASP Juice Shop] を初回起動するのに少し時間が掛かるので、先にしておきます。

https://github.com/juice-shop/juice-shop

```shell
git clone https://github.com/juice-shop/juice-shop
```

npm install します。これが３分程掛かります。

```shell
cd ./juice-shop/
npm install
```

次のコマンドで [OWASP Juice Shop] を起動します。

```shell
npm start
```

ブラウザでアクセス。

* http://localhost:3000/

## Tamper Dev (Chrome 拡張機能) のインストール

Tamper Dev (Chrome 拡張機能) をインストールして下さい。 

https://chromewebstore.google.com/detail/tamper-dev/mdemppnhjflbejfbnlddahjbpdbeejnn

URLバー右隣の拡張機能でピン留めして実行できます。また `Alt + T` でも実行できます。

## SQLite Playground

SQL Injection を実行するにあたり、まずは SQL を試してみる際に Playground を使いましょう。

https://www.db-fiddle.com/f/wjgSP1MpD25vaL34cL6v4F/4

# アジェンダ

Day 1 には、前章で説明済の準備・解説の項目を含んでいます。

## Day 1

Day 1 は、ほぼ「SQL Injection」に注力しています。

流れとして `Injectionできる箇所を探す` → `最も基本的な攻撃手法を知る` → `攻撃手法 UNION Attack を知る` → `スキーマを特定する` → `やりたい放題` という流れです。

| 分 | 大項目 | 小項目 | 解説 | 難易度 |
|:------|:---------|:---------|:---------|:----:|
| 15 分 | [前置き](https://pwning.owasp-juice.shop/companion-guide/latest/introduction/architecture.html) | `--` | ※本書の前章で説明した内容です | `--` |
| 15 分 | [事前準備](#事前準備) | `--` | ※本書の前章で説明した内容です | `--` |
| 15 分 | Finding the Score Board | Score Board | [Find the carefully hidden 'Score Board' page.](https://pwning.owasp-juice.shop/companion-guide/latest/part2/score-board.html)<br /><br /><sub><i>※パスを探すにはどうすれば良いか？</i></sub> | ⭐ |
| 15 分 | Injection | Login Admin | [Log in with the administrator’s user account](https://pwning.owasp-juice.shop/companion-guide/latest/part2/injection.html#_log_in_with_the_administrators_user_account)<br /><br /><sub><i>※username が分かれば password 無しでも...？</i></sub> | ⭐⭐ |
| 15 分 | 〃 | Database Schema | [Exfiltrate the entire DB schema definition via SQL Injection](https://pwning.owasp-juice.shop/companion-guide/latest/part2/injection.html#_exfiltrate_the_entire_db_schema_definition_via_sql_injection)<br /><br /><sub><i>※SQLite でスキーマ一覧をするには...？</i></sub> | ⭐⭐⭐ |
| 15 分 | 〃 | User Credentials | [Retrieve a list of all user credentials via SQL Injection](https://pwning.owasp-juice.shop/companion-guide/latest/part2/injection.html#_retrieve_a_list_of_all_user_credentials_via_sql_injection)<br /><br /><sub><i>※スキーマ情報を知れば、SQL は作れる。</i></sub> | ⭐⭐⭐⭐ |
| 15 分 | 〃 | Login Bender | [Log in with Bender’s user account](https://pwning.owasp-juice.shop/companion-guide/latest/part2/injection.html#_log_in_with_benders_user_account)<br /><br /><sub><i>※ユーザー名さえ分かっていれば Admin と同じ。</i></sub> | ⭐⭐⭐ |
| 15 分 | 〃 | Login Jim | [Log in with Jim’s user account](https://pwning.owasp-juice.shop/companion-guide/latest/part2/injection.html#_log_in_with_jims_user_account)<br /><br /><sub><i>※ユーザー名さえ分かっていれば Admin と同じ。</i></sub> | ⭐⭐⭐ |

## Day 2

Day 2 は小さなトピックがバラバラと並んでいるので、進行上は進めづらいです😰

| 分 | 大項目 | 小項目 | 解説 | 難易度 |
|:------|:---------|:---------|:---------|:----:|
| 5 分 | Sensitive Data Exposure | Confidential Document | [Access a confidential document](https://pwning.owasp-juice.shop/companion-guide/latest/part2/sensitive-data-exposure.html#_access_a_confidential_document)<br /><br /><sub><i>※公開ファイル置き場を探すだけなので **答えを教える**</i></sub> | ⭐ |
| 10 分 | Improper Input Validation | Missing Encoding | [Retrieve the photo of Bjoern’s cat in "melee combat-mode"](https://pwning.owasp-juice.shop/companion-guide/latest/part2/improper-input-validation.html#_retrieve_the_photo_of_bjoerns_cat_in_melee_combat_mode)<br /><br /><sub><i>※なぜリンクが不正になってしまったのか...？</i></sub> | ⭐ |
| 15 分 | 〃 | Zero Stars | [Give a devastating zero-star feedback to the store](https://pwning.owasp-juice.shop/companion-guide/latest/part2/improper-input-validation.html#_give_a_devastating_zero_star_feedback_to_the_store)<br /><br /><sub><i>※UI からの攻撃のみで。Tamper は使わない。</i></sub> | ⭐ |
| 15 分 | Cross Site Scripting (XSS)<br/>[※参考](https://www.ubsecure.jp/blog/cross-site-scripting) | DOM XSS | [Perform a DOM XSS attack](https://pwning.owasp-juice.shop/companion-guide/latest/part2/xss.html#_perform_a_dom_xss_attack)<br /><br /><sub><i>※ユーザー入力が FE だけで埋め込まれる箇所。</i></sub> | ⭐ |
| 15 分 | 〃 | Reflected XSS | [Perform a reflected XSS attack](https://pwning.owasp-juice.shop/companion-guide/latest/part2/xss.html#_perform_a_reflected_xss_attack)<br /><br /><sub><i>※API へのパラメータ入力が、そのまま応答として返る箇所。</i></sub> | ⭐⭐ |
| 15 分 | [自作の脆弱性サイト] | Stored XSS | [Webセキュリティ勉強会 Part-2] で解説 | `--` |
| 10 分 | 〃 | CSRF (Cross Site Request Forgery) | [Webセキュリティ勉強会 Part-2] で解説 | `--` |
| 10 分 | 〃 | Clickjacking | [Webセキュリティ勉強会 Part-2] で解説 | `--` |
| 15 分 | 〃 | SSRF (Server-Side Request Forgery) | [Webセキュリティ勉強会 Part-2] で解説 | `--` |


# おしまい

開発組織全体としてのセキュリティ技術を上げる取り組みの一貫として本勉強会を実施しました。

短時間でメンバーの技術力を底上げするのは難しく、やってみて改善点多め (※特に Day 2) ですが、今後も定期的に実施すると思いますので、その度に本書もブラッシュアップしていきたいなと考えています。