xss 脆弱性のあるサイトを作ってセッションハイジャックを試す

## はじめに

xss については何となく理解したけど、結局それがどう攻撃に使われるのかが良く分からなかったので、セッションハイジャックと言うものを試してみた。


## やりたいこと

攻撃者の立場に立ち、被害者に対して攻撃用 URL を送りつけ、被害者のセッション ID を取得する。


## 脆弱性のあるサイトを作る

まずは被害者がログインできるサイトを作る。
javascript + express で作ったけど、あんまり使ったことないフレームワークだったから認証の仕組みを入れるのに時間がかかった。
といっても認証の方法は「どんなユーザー名でもパスワードでもログインできる」という感じ。
（ログイン状態さえ作り出せれば良いため）

↓ソースコード
https://github.com/ahyaemon/express-training

↓ログインページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/54805870-d551-fe23-6b9d-260f9db49c4f.png)

↓ログイン後ホーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/49876e11-5da6-2e68-5991-b0a4a6aa468f.png)

クッキーにセッション ID らしきものが入っているのも確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/27eeed46-f369-f765-14b5-8c007ce6983d.png)

CSRF も試していたため「レモンをカートに追加」というボタンがあるけど今回は関係ない。
「xss 脆弱性のあるページに遷移」の方のインプットに文字を入れて「search」を押すと、入力した文字列をクエリパラメータとしてページ遷移する。
遷移後のページでは js でクエリパラメータを取得して、**脆弱性を作り出すために** innerHTML で画面に表示するようにしている。

#### `りんご` で検索した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/c1a970ac-cdf0-1484-e381-30ae120f3b91.png)

こうなる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/31980387-ea9e-cd46-a4dd-1f4af218e715.png)


#### `<h1>Hello!</h1>` で検索した場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/90c652f4-1652-5c97-9b13-a5a47cac5ed6.png)

でかい Hello が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/b45b87a4-23a7-8f80-71a0-b95fd5f159c3.png)

#### `<script>alert(0)</script>` で検索した場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/31ab7683-8469-a7c0-895f-8a9d8990e774.png)

何も起こらない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/58a45006-a6d2-a802-7b95-4986196c3eaf.png)

script タグは埋め込んでも実行されないようになってる？

#### `<svg onload="alert(0)">` で検索した場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/20d8c711-4866-7a2a-59cc-6bb12bab452e.png)

アラートされた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/0f87726b-809d-a3e1-0560-d3a192189c68.png)

## 攻撃する

ここからは攻撃者の立場で。
`<svg onload="alert(0)">` で `alert(0)` が実行されることがわかったので、このスクリプト部分を色々いじってセッション ID を奪取する。
やり方としては、`document.cookie` でクッキーの中身が取得できるので、それを fetch を使って攻撃者が作ったサーバーに送るか、メール送信するかを考えた。
まずは document.cookie でちゃんとセッション ID が取れるか確認したかったので、`<svg onload="console.log(document.cookie)">`を実行させるような URL を作って被害者にクリックさせる。
（攻撃者も被害者も自分が演じているので、被害者側のデベロッパーツールを開いて console.log の出力を確認する）

`<svg onload="console.log(document.cookie)">` を URL エンコードしてできた URL がこれ。

```
http://localhost:3333/search?search=%3Csvg+onload%3D%22console.log%28document.cookie%29%22%3E
```

攻撃者が被害者に何らかの手段でこの URL を送ったことを想定し、被害者側としてこの URL を開く。

結果・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/ac909ac4-9b66-019f-a4ce-1b6b7bb6e4d3.png)

空文字しか表示されなかった、、


# ダメだった

なぜセッション ID が表示されないか調べたところ、クッキーに `HttpOnly` がついてるから javascript からアクセスできない、ということらしい。

https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies#cookie_%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%88%B6%E9%99%90

確かに HttpOnly というところにチェックが入ってた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/cc7e27c1-6d3d-407c-b626-688484a117c2.png)


# 終わりに

こういうの自分でやってみないと理解できない。