サイバー攻撃(Dos/XSS/CSRF)について深掘りしてみた

この記事は[Fusic Advent Calendar 2024](https://qiita.com/advent-calendar/2024/fusic) 10日目の記事です。
昨日は、@daiki7noheさんのExpo SDKのexpo/fetch APIについての記事でした。

https://tech.fusic.co.jp/posts/expo-streaming-fetch-api/

## はじめに
今年の10月からFusicに入社し、前職では組み込みエンジニアとして開発業務に携わっていました。今回は研修の一環として読んだ「[Web技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E7%AC%AC2%E7%89%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4815625948/ref=sr_1_1?adgrpid=81750527692&dib=eyJ2IjoiMSJ9.kKSDuWeQK4FtMlU5xXOQC1a89h_t7CXl1fOlljr-L745tdvEbL1I9bVE1CEuCy4Me3SsXYT5mUknuQoKJCxdgCP19B5Ygeq_74i9p4eh2o6B0lWErLy-1DOYw2xmsaOsfnCOFTLy5aTkCemnOLdpdk2kGyT_ymcWAU_H0ZbRFnA8730WD6YJ6Z4H9Jt3gqBQFNUKgeKHIjtdeifsuRPSwL_hMqtiV8vTfioCjMwf39FIO9PIud5U9UMCKxFC-0vXfcfYCV_o-wtEB5ftCoYHOSPtNXJ3WJzeAE9drbv-hqw.ms6FVB7W2oODC8LYf2JvhHayoNB3tXxjppHCMkJs-Zo&dib_tag=se&hvadid=651132114381&hvdev=c&hvlocphy=9197727&hvnetw=g&hvqmt=e&hvrand=8430355436444971213&hvtargid=kwd-811307210612&hydadcr=2964_13658736&jp-ad-ap=0&keywords=web+%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC&qid=1733221101&sr=8-1)」から3つのサイバー攻撃をピックアップし、記事に纏めました。

## 今回取り上げたサイバー攻撃
- Dos攻撃
- クロスサイトスクリプティング(XSS)
- クロスサイトリクエストフォージェリ(CSRF)

## Dos攻撃
Dos攻撃とは、Denial of Service Attackの略称で短時間にサーバーが処理出来ないような大量なアクセスやデータを送付することでサービス停止に陥らせる攻撃のことです。
Dos攻撃とDDos攻撃とありますが、Dos攻撃は1台のPCから、DDos攻撃は複数台のPCから分散して攻撃します。
Dos攻撃には大きく2種類に分かれます。

### フラッド型
大量のデータを送信してサーバーを圧倒する攻撃方法です。
<dl>
<dt>例：SYNフラッド攻撃</dt>
<dd>
TCPのやりとりにおけるSYNパケットだけを大量に送り付け、サーバーを接続待ち状態にさせることで別のユーザーからの新たな接続を確立出来ない状態にします。
</dd>
</dl>

![Dos攻撃1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/5ef00a9f-6966-eeab-8a82-88ff4b805a6d.png)

**【補足：SYNパケット】**
インターネット上などでデータを送受信する際に使用するTCPプロトコルでは、データを送信する前にユーザー(クライアント)とサーバー間で通信可能か確認することによって、コネクションを確立させます。このやりとりのことを3ウェイハンドシェイクと言い、その際に使用するパケットをSYNパケット、SYN+ACKパケット、ACKパケットと呼びます。

![3ウェイハンドシェイク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/12b922fb-f4fe-4f3e-ae58-a8d9472e57b8.png)

### 脆弱性型
サーバーやソフトウェアの脆弱性を利用して不正な処理を大量に行わせることで、サーバーを機能停止に追い込む攻撃方法です。
<dl>
<dt>例：LAND攻撃</dt>
<dd>
SYNパケットに送信元IPアドレスと送信先IPアドレスに同じアドレス値を入れて攻撃対象のサーバーに送ることにより、サーバー側はSYN+ACKパケットを返信しようとするが送信先が自分自身のため、自分自身に返してしまいます。
これによりシステムの負荷が高まり、最終的には機能停止してしまいます。
</dd>
</dl>

![LAND攻撃.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/2597d3da-f57e-c905-ad52-35db9f0ee36b.png)

### 対策
#### ①ファイアウォールのパケットフィルタリング機能を使用
送信元/送信先のルールを設定し、その設定に基づいて通信の可否を判断することで、不正な送信元/送信先のパケットをサーバーに通さないようにします。
#### ②IDS,IPSの導入
- **IDS(Intrusion Detection System）**
不正侵入検知システムと呼ばれ、通信の監視と管理者への警告を行います。
　
- **IPS(Intrusion Prevention System）**
不正侵入防止システムと呼ばれ、通信の監視と管理者への警告に加えて、通信の遮断までを行います。

**【IDS,IPSの検知方法】**
- **シグネチャ型(不正検知型)**
シグネチャとは、既知の攻撃手法における通信パターンが登録されたデータベースのことで、監視対象の通信とシグネチャを比較し、シグネチャに登録されたパターンと一致する通信を不正アクセスと判断します。
　
- **アノマリー型(異常検知型)**
普段との通信とは大きく異なる通信や、通常は発生しないような通信を不正アクセスと判断します。

#### 参考サイト
[DoS攻撃とは？意味やDDoS攻撃との違い、対策などをわかりやすく解説](https://www.onamae.com/business/article/16801/)

## クロスサイトスクリプティング(XSS)
クロスサイトスクリプティングとは、攻撃者が送り込んだ悪意のあるスクリプト(簡易的なプログラム)をそのページを閲覧した不特定多数のユーザーにブラウザ上で実行させる攻撃のことです。
ユーザー側の端末で不正なスクリプトが実行されると、ユーザーの情報が格納されたCookieを盗まれてしまい、SNSアカウントの乗っ取りやネットバンクでの不正な出金といった被害を受けてしまう危険性があります。

### Cookieとは？
WebサイトやWebサーバーにアクセスした人の情報を、ブラウザに一時的に保存するための小さなデータファイルです。
Cookieが有効化されると、使用中のブラウザで初めてアクセスしたWebサイトに、Webサイト側が指定した訪問ユーザーを識別できる情報が保存されます。
そのWebサイトで入力したIDや閲覧情報も記録されるため、２回目以降の訪問時には、これらの情報を基に情報を提供できるようになる仕組みです。

![cookie.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/14f65eeb-209f-7121-c0c3-26cc0fd89e23.jpeg)

引用：[Cookieとは？わかりやすく解説｜同意しないとどうなる？基本的な仕組みや無効化・削除する方法](https://staff.persol-xtech.co.jp/hatalabo/it_engineer/567.html)


### 攻撃の流れ
①攻撃者は、掲示板サイトなどの入力フォームにスクリプト付のリンクを入力して罠を仕掛けます。
②ユーザーは、スクリプトを仕込まれたリンクをクリックします。
③リンクをクリックしてスクリプトが実行されると、攻撃者が用意した偽のWebサイトに遷移します。
④偽のwebサイトが表示される際に利用者のブラウザ上でスクリプトが実行され、パソコンに保存されていたCookie情報が盗まれます。
⑤遷移したWebサイトにユーザーが個人情報などの情報をユーザーに書き込ませることで個人情報も窃取されてしまいます。

![XSS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/6574f184-6533-b34e-0972-d2b79832ad83.png)

### 対策
#### ①サニタイジング（スクリプトの無害化）
スクリプトの構成に必要な&，<，>，”，’の５文字の特殊文字に着目し、これらが文字列としてそのまま画面に表示されるように置換し、スクリプトの無害化を行います。
#### ②入力値の制限
不正なスクリプトの埋め込みを防ぐため、入力値に制限を設けます。例えば、電話番号や郵便番号の入力欄は数字のみに制限し、不正なスクリプトを入力できないようにします。
#### ③WAFの導入
WAFとは、Web Application Firewallの略称で、Webサイトを含めたWebアプリケーションの脆弱性を狙ったサイバー攻撃を防御するセキュリティ対策サービスのことです。

**【WAFの検知方法】**
- **ネガティブセキュリティモデル(ブラックリスト方式)**
IDS,IPSのシグネチャ型のように特定のパターンのデータを持つ通信を遮断します。
遮断するデータのパターンは拒否リストと呼ばれ、基本的にはWAFの開発元が提供するものを利用するが、新たな攻撃手法が発見された場合は拒否リストにそのパターンが追加されるまで対応出来ません。
　
- **ポジティブセキュリティモデル(ホワイトリスト方式)**
ネガティブセキュリティモデルとは逆に、正常なパターン(許可リスト)を登録しておき、それに適合する通信のみ通します。
確実に正常と判断出来る通信のみ通過させるため、非常に高いセキュリティが期待出来ますが、Webサイトへの正常な通信が誤って遮断されないようにすべての通信パターンをあらかじめ登録しておく必要があり、正確な許可リストの作成は専門的な知識が必要となります。

**【参考：ファイヤーウォール、IPS/IDS、WAFの違い】**

![WAF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/46c5f646-0dc2-af60-a664-1e6a453a3d86.png)
引用：[WAFとIPS／IDSの違いとは？そもそも防御できる攻撃も違う！](https://www.shadan-kun.com/waf_websecurity/difference_between_waf_and_ips/)

#### 参考サイト
[クロスサイトスクリプティングって何？サイトのセキュリティを高めるために](https://www.kagoya.jp/howto/it-glossary/security/xss/)
[クロスサイトスクリプティング（XSS）とは？わかりやすく解説](https://www.shadan-kun.com/waf_websecurity/xss/)

## クロスサイトリクエストフォージェリ(CSRF)
クロスサイトリクエストフォージェリとは、攻撃者が罠として用意したWebサイト内で、ユーザーがリンクを踏むなどの操作を行うことで、ユーザーが全く意図していない偽造されたリクエストが強制的に正規のWebサイトへ送られてしまう攻撃のことです。

### 攻撃の流れ
①ユーザーがWebサイトに通常通りログインします。
②Webサイト側が、ユーザーがログインした状態でセッションIDを発行します。
③ユーザーは、ログアウトせずWebサイトを閉じます。（ログイン状態を維持）
④攻撃者はメールなどでURLを送信し、罠サイトへ誘導します。
⑤ユーザーが罠サイトでリンクのクリックなどを行うことにより、攻撃者の仕込んだ「不正なリクエスト」がWebサイトに送信され、ユーザーが意図しない処理（強制退会など）が実行されてしまいます。

![CSRF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/17984599-96bb-a019-eaa7-927aef88a911.png)
引用：[安全なウェブサイトの作り方 - 1.6 CSRF（クロスサイト・リクエスト・フォージェリ）](https://www.ipa.go.jp/security/vuln/websecurity/csrf.html)

### 対策
#### ①セッションIDと機密情報(トークン)の両方で、リクエストの可否を判断							
掲示板やWebフォームの入力画面を表示する際、「hiddenパラメーター」に機密情報を持たせて、セッションIDと一緒にWebサーバーへ送信します。
そうすると、Webサーバー側ではセッションIDと機密情報を別々に保有し、リクエストがあった際に両者が合致した場合のみ、そのリクエストを許可出来るようになります。						
もし攻撃者がユーザーのセッションIDを乗っ取り、Webサーバーへ不正なアクセスを試みたとしても、攻撃者は機密情報を持っていないためリクエストを通過することが出来ません。

**【補足：hiddenパラメーター】**
hiddenパラメーターとは、HTMLのinputタグで使用する属性のことで、データを実際に画面には表示せずに保持しておくことが出来るパラメーターです。
例：Ruby on Railsの場合
```html
<input type="hidden" name="authenticity_token" value="機密情報(トークン)が設定されます">
```

#### ②処理を実行する直前でパスワードの入力を求める
設定変更など重要な処理を実行する直前でパスワードの入力を求め、入力されたパスワードが正しい場合のみ処理を実行することで攻撃を防止します。

#### ③Refererヘッダで正しいリンク元かを確認							
Refererヘッダには「リクエストを送信したユーザーが、どのURLからリクエストを行っているのか」の情報が含まれています。						
仮に、Refererヘッダを見て「本来あるべき画面を遷移していない」場合、攻撃者によるCSRFの可能性が高いため、	WebサーバーでRefererヘッダをチェックすることで、正しいリクエストであった場合のみリクエストを通過させるようにします。						

**【補足：Refererヘッダ】**
Webブラウザ(ユーザー)とWebサーバーの間ではHTTPメッセージを使用して情報のやりとりをします。
WebブラウザからWebサーバーへ送られるメッセージ：「HTTPリクエストメッセージ」
WebサーバからWebブラウザーへ送られるメッセージ：「HTTPレスポンスメッセージ」
HTTPリクエストメッセージは「リクエストライン」「HTTPヘッダ」「メッセージボディ」から構成され、HTTPヘッダにRefererヘッダが設定されています。
<p>
  <img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/f2cca56a-7a6d-b0f8-57b1-1836423add0b.png" />
  <img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941987/d58049c5-1d66-d16d-4063-b54a1f95f0a8.png">
</p>

引用：[ITまとめノート HTTP](https://shukapin.com/infographicIT/http)


#### 参考サイト
[必見!クロスサイトリクエストフォージェリ(CSRF)とは？仕組み・対策を解説](https://www.lanscope.jp/blogs/cyber_attack_pfs_blog/20231020_15621/)

## まとめ
昨今、AWSなどサーバーをクラウド化が進んでおり、サーバーを立てることが容易になる反面、セキュリティに対して正しく知識を持っていなければ、リスクになり得ることを今回の投稿を通して理解出来ました。
今後は、Webアプリ開発において今回で得た知識を活かして堅牢な設計開発が出来るように取り組んでいきたいです。
***
[Fusic Advent Calendar 2024](https://qiita.com/advent-calendar/2024/fusic) 11日目は@sawai-aさんが書きます！皆様お楽しみ！