はじめに
xss については何となく理解したけど、結局それがどう攻撃に使われるのかが良く分からなかったので、セッションハイジャックと言うものを試してみた。
やりたいこと
攻撃者の立場に立ち、被害者に対して攻撃用 URL を送りつけ、被害者のセッション ID を取得する。
脆弱性のあるサイトを作る
まずは被害者がログインできるサイトを作る。
javascript + express で作ったけど、あんまり使ったことないフレームワークだったから認証の仕組みを入れるのに時間がかかった。
といっても認証の方法は「どんなユーザー名でもパスワードでもログインできる」という感じ。
(ログイン状態さえ作り出せれば良いため)
↓ソースコード
https://github.com/ahyaemon/express-training
クッキーにセッション ID らしきものが入っているのも確認できる。
CSRF も試していたため「レモンをカートに追加」というボタンがあるけど今回は関係ない。
「xss 脆弱性のあるページに遷移」の方のインプットに文字を入れて「search」を押すと、入力した文字列をクエリパラメータとしてページ遷移する。
遷移後のページでは js でクエリパラメータを取得して、脆弱性を作り出すために innerHTML で画面に表示するようにしている。
りんご
で検索した場合
こうなる
<h1>Hello!</h1>
で検索した場合
でかい Hello が表示される。
<script>alert(0)</script>
で検索した場合
何も起こらない。
script タグは埋め込んでも実行されないようになってる?
<svg onload="alert(0)">
で検索した場合
アラートされた。
攻撃する
ここからは攻撃者の立場で。
<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 を開く。
結果・・・
空文字しか表示されなかった、、
ダメだった
なぜセッション ID が表示されないか調べたところ、クッキーに HttpOnly
がついてるから javascript からアクセスできない、ということらしい。
確かに HttpOnly というところにチェックが入ってた。
終わりに
こういうの自分でやってみないと理解できない。