LoginSignup
121
80

More than 1 year has passed since last update.

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

Posted at

はじめに

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

やりたいこと

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

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

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

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

↓ログインページ
image.png

↓ログイン後ホーム
image.png

クッキーにセッション ID らしきものが入っているのも確認できる。
image.png

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

りんご で検索した場合

image.png

こうなる

image.png

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

image.png

でかい Hello が表示される。

image.png

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

image.png

何も起こらない。

image.png

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

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

image.png

アラートされた。

image.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

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

ダメだった

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

確かに HttpOnly というところにチェックが入ってた。
image.png

終わりに

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

121
80
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
121
80