ブラウザがちょっとドキドキ！脆弱性体験 XSS攻撃やってみた

# 「セキュリティの脆弱性を実際に試してみたい」と思ったことはありませんか？
今回は、セキュリティ脆弱性を実際に体験できるツール『[DVWA (Damn Vulnerable Web Application)](https://github.com/digininja/DVWA)』を紹介します。このツールは、PHPとMySQLで構築された、意図的に脆弱なWebアプリケーションです。これを使って、実際にセキュリティ脆弱性を学び、どのように攻撃が行われるかを体験できます！
具体的な設定方法や構築については、[こちらの公式ドキュメント](https://github.com/digininja/DVWA/blob/master/README.pt.md)を参考にしてください！今回は構築手順を省略し、実際の攻撃の手法について説明します！:runner_tone1:

# 含まれる脆弱性

- ブルートフォース(Brute Force)
- コマンド実行(Command Execution)
- クロスサイトスクリプティング(Cross Site Request Forgery (CSRF))
- 安全でないCAPTCHA(Insecure CAPTCHA)
- ファイルインクルージョン(File Inclusion)
- SQLインジェクション(SQL Injection)
- 安全でないファイルアップロード(Insecure File Upload)
- クロスサイトスクリプティング(Cross Site Scripting (XSS))
- イースターエッグ(Easter eggs)
  ファイルパスディスクロージャ(Full path Disclosure), 認証バイパス(Authentication bypass)やその他の脆弱性が隠されています。


## DVWAのセキュリティ機能

DVWAでは、セキュリティレベルを以下の**3段階**で設定できます。

### 🔒 **High（安全なレベル）**
- **特徴**: 完全に安全で、脆弱性はありません。
- **目的**: 安全なコーディング例を学ぶために使用。
- **使い方**: 脆弱なコードと比較して、セキュアな実装方法を理解する。

### ⚠️ **Medium（不完全なセキュリティ）**
- **特徴**: 開発者が安全にしようと努力したが、不十分な例。
- **目的**: 一見安全に見える実装がどこで失敗するかを学ぶ。
- **注意**: 攻撃可能な箇所が残されている。

### ❌ **Low（完全に脆弱なレベル）**
- **特徴**: 全く安全でない状態。
- **目的**: 典型的な悪いコーディング例を通じて、脆弱性がどのように発生するかを理解する。
- **例**: SQLインジェクションやXSSが容易に成功する。


## 実践！反射型クロスサイトスクリプティング (Reflected XSS)
ここでは、実際に反射型XSS（クロスサイトスクリプティング）攻撃を体験！XSSは、攻撃者が悪意のあるスクリプトを仕込み、ユーザーのブラウザで実行させる攻撃手法です！:lifter_tone1:

## 反射型XSSの手法と流れ
**1: 攻撃者が悪意のあるURLを用意する**
攻撃者は次のような **スクリプト付きのURL** を作成します。
このURLにはブラウザで実行されるJavaScriptが含まれています。
````````
https://example.com/vulnerable.php?q=<script>alert('XSS')</script>
````````
- q パラメータ に悪意のあるスクリプトを仕込みます。
- 攻撃者はこのリンクを メールやSNS を通じて「見てみて！」とユーザーに送りつけます。

**2: ユーザーがリンクをクリックする**
被害者（ユーザー）は、攻撃者から送られたURLを信じてクリックしてしまいます。

**3: Webサーバがスクリプトを含む応答を返す**
脆弱なWebアプリケーションは、入力されたパラメータ q の内容 をそのまま画面に表示します。
このため、次のようなHTMLが生成され、ブラウザに返されます。
````````
<p>検索結果: <script>alert('XSS')</script></p>
````````

- サーバは 入力値の検証やエスケープ処理 を行わないため、
悪意のあるスクリプトがそのまま出力されます。

**4: ユーザーのブラウザでスクリプトが実行される**
ユーザーのブラウザは、返されたHTMLを解析し、含まれているJavaScriptコードを実行します。例えば、alert('XSS') が実行されると、ブラウザにポップアップメッセージが表示されます。

**<具体的な動作例>**
- **ポップアップ表示:** alert('XSS') が実行され、警告メッセージが表示される。
- **Cookieの窃取:** JavaScriptを使ってCookie情報が攻撃者のサーバに送信される。
- **ページ改ざん:** 悪意のあるスクリプトがページ内容を書き換える。

````````
┌────────────┐        ① 攻撃者がURLを送信
│ 攻撃者      │ ───────────► ユーザー (クリック)  
└────────────┘
                        ▼
             https://example.com?q=スクリプト
                        │
                        ▼
┌────────────┐        ② ユーザーがリンクを開く
│ Webサーバ　　　│ ◄─────────── 
│ (脆弱なサイト) │   スクリプトを含む応答  
└────────────┘
                        ▼
┌────────────┐        ③ ユーザーのブラウザで実行あ
│ ブラウザ      │───────────► JavaScriptが動作
│ (ユーザー画面)│  
└────────────┘
````````

## 反射型XSSのポイント

- **原因:** 入力値が適切にエスケープされず、そのまま出力されてしまう。
- **危険性:** 攻撃者が用意したスクリプトが ユーザーのブラウザ で動作し、サイト改ざんやCookie情報の窃取が可能になる。
- **対策:** 入力値の サニタイズ や エスケープ処理 を行い、信頼できない入力をそのまま表示しないこと。

## やってみよう:sunny:実際にDVWAで反射型XSSを試す
まず、セキュリティレベルを Medium に設定します。

1.左メニューから 「DVWA Security」 を選択し、セキュリティレベルを Medium に設定します。
「Submit」ボタンを押して適用。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/5ae579c2-950a-8570-3c05-13ead4eb4fc8.png)


2.左メニューからXSS(Reflected)を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/87a80e35-071b-2fa6-d079-3bafa27c3e85.png)

3.入力フィールドに次のコードを入力して実行します。
````````
<script>alert('XSS')</script>
````````

入力後、「Submit」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/6753b833-ddd8-7021-b14a-cdaefc542d8a.png)



4.すると、以下のようにアラートが表示されます！あらまぁ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617398/260565c7-0d56-1b40-fbb6-a3fbbc956a19.png)

## まとめ
今回、DVWAを使用して反射型XSSを体験することで、脆弱性がどのように攻撃され、どのように対策を取るべきかを学ぶことができました！　セキュリティを強化するためには、入力値を適切に処理し、悪意のあるコードが実行されないようにすることが重要です:writing_hand_tone1: