2021-05-27に投稿

XSSについてちゃんと調べてみた

はじめに

OWASP ZAPで脆弱性診断を行ったところ、クロス サイト スクリプティング(DOMベース) というのが出てしまいました。
XSS自体はよく聞くので知っていましたが、「DOMベースって何?そもそもXSSのことちゃんと理解してないな?」
と思い調べてみたので、まとめていきます。

XSSとは

Webサイトの脆弱性を突き、攻撃者がそこに悪質なスクリプトを仕掛ける攻撃です。
画面を一時的に改ざんしてログイン情報を抜き取ったり、Cookieを盗み見たりなど、とにかく危険満載って感じです。

XSSには以下の3パターンがあります。

反射型

フォーム入力などを行った次のページで発生するヤツです。
こちらの例を使用させていただきます。

検索画面で、ユーザーが「HTML5」と入力すると、
http://example.jp/search?q=HTML5というURLで検索結果が表示されるとします。

検索結果画面では、よく「◯◯を検索しました。◯件見つかりました。」みたいなのがありますよね。
その部分がHTMLで以下の様になっているとします。

語句「<span class="keyword">HTML5</span>」を検索しました。20件の文書が見つかりました。

ユーザーが入力した「HTML5」をそのままspanで囲んで出力している感じですね。

これにもし、検索キーワードとして<script>alert(1)</script>なんてものを入力された場合

語句「<span class="keyword"><script>alert(1)</script></span>」を検索しました。20件の文書が見つかりました。

となってしまいます。

本来文字列として表示されるべき部分が<script>要素になってしまい、
ブラウザ上ではJavaScriptが動作してしまうことで、XSSが発生します。

これを利用して、alert(1)なんて可愛いものではなくてもっとエグいものを仕込まれることで被害が起きるという仕組みですね。

蓄積型

DBに保存されている情報を表示させるときに発生するヤツです。

例えば掲示板サイトがあったとして、攻撃者が本文に

<script>alert(1)</script>

と入力して投稿→DBに保存されたとします。

他のユーザーが掲示板を開くとこの攻撃者からの投稿が表示され、
JavaScriptが勝手に実行されてしまい、XSSが発生します。

DOMベース型 

JavaScriptがDOMを構築するときに発生するヤツです。
今回起きてたのはコレですね。
こちらの例を使用させていただきます。

以下のようなコードがあるとします。

div = document.getElementById("info");
div.innerHTML = location.hash.substring(1); 

location.hash.substring(1)でURLのハッシュ部分(#以降)を取得し、
それをid="info"div要素に入れることで、画面に表示させている処理です。

URLがhttp://example.jp/#title1みたいなものなら問題ないですが、
http://example.jp/#<img src=1 onerror=alert(1)> のようなURLを開いた場合、
<img src=1 onerror=alert(1)> がHTML内に展開され、JavaScriptが実行されることでXSSが発生します。

困ったことに全く心当たりがない

今回起きた(診断された)DOMベースのXSSが何なのかはわかったけど、
自分のコードにおいて心当たりが全く無い!
フロントエンドはVueで作成しているので、VueにおけるXSSについても調べる必要がありそうだなと。
OWSP ZAPの誤検知の可能性もあるので、万が一明確な原因が見つかったら、またまとめておこうかなと思います。

参考

ツイッターでシェア
みんなに共有、忘れないようにメモ

みみみみみ

2歳と2ヶ月くらいの赤ちゃんです。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント