tag:crieit.net,2005:https://crieit.net/tags/XSS/feed 「XSS」の記事 - Crieit Crieitでタグ「XSS」に投稿された最近の記事 2021-05-27T12:11:46+09:00 https://crieit.net/tags/XSS/feed tag:crieit.net,2005:PublicArticle/17292 2021-05-27T12:11:46+09:00 2021-05-27T12:11:46+09:00 https://crieit.net/posts/XSS XSSについてちゃんと調べてみた <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>OWASP ZAPで脆弱性診断を行ったところ、<strong>クロス サイト スクリプティング(DOMベース)</strong> というのが出てしまいました。<br /> XSS自体はよく聞くので知っていましたが、「DOMベースって何?そもそもXSSのことちゃんと理解してないな?」<br /> と思い調べてみたので、まとめていきます。</p> <h1 id="XSSとは"><a href="#XSS%E3%81%A8%E3%81%AF">XSSとは</a></h1> <p>Webサイトの脆弱性を突き、攻撃者がそこに悪質なスクリプトを仕掛ける攻撃です。<br /> 画面を一時的に改ざんしてログイン情報を抜き取ったり、Cookieを盗み見たりなど、とにかく危険満載って感じです。</p> <p>XSSには以下の3パターンがあります。</p> <h2 id="反射型"><a href="#%E5%8F%8D%E5%B0%84%E5%9E%8B">反射型</a></h2> <p>フォーム入力などを行った次のページで発生するヤツです。<br /> <a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/dev/serial/01/javascript-security/0002">こちら</a>の例を使用させていただきます。</p> <p>検索画面で、ユーザーが「HTML5」と入力すると、<br /> <code>http://example.jp/search?q=HTML5</code>というURLで検索結果が表示されるとします。</p> <p>検索結果画面では、よく「◯◯を検索しました。◯件見つかりました。」みたいなのがありますよね。<br /> その部分がHTMLで以下の様になっているとします。</p> <pre><code class="html">語句「<span class="keyword">HTML5</span>」を検索しました。20件の文書が見つかりました。 </code></pre> <p>ユーザーが入力した「HTML5」をそのまま<code>span</code>で囲んで出力している感じですね。</p> <p>これにもし、検索キーワードとして<code><script>alert(1)</script></code>なんてものを入力された場合</p> <pre><code class="html">語句「<span class="keyword"><script>alert(1)</script></span>」を検索しました。20件の文書が見つかりました。 </code></pre> <p>となってしまいます。</p> <p>本来文字列として表示されるべき部分が<code><script></code>要素になってしまい、<br /> ブラウザ上ではJavaScriptが動作してしまうことで、XSSが発生します。</p> <p>これを利用して、<code>alert(1)</code>なんて可愛いものではなくてもっとエグいものを仕込まれることで被害が起きるという仕組みですね。</p> <h2 id="蓄積型"><a href="#%E8%93%84%E7%A9%8D%E5%9E%8B">蓄積型</a></h2> <p>DBに保存されている情報を表示させるときに発生するヤツです。</p> <p>例えば掲示板サイトがあったとして、攻撃者が本文に</p> <pre><code class="html"><script>alert(1)</script> </code></pre> <p>と入力して投稿→DBに保存されたとします。</p> <p>他のユーザーが掲示板を開くとこの攻撃者からの投稿が表示され、<br /> JavaScriptが勝手に実行されてしまい、XSSが発生します。</p> <h2 id="DOMベース型 "><a href="#DOM%E3%83%99%E3%83%BC%E3%82%B9%E5%9E%8B%E3%80%80">DOMベース型 </a></h2> <p>JavaScriptがDOMを構築するときに発生するヤツです。<br /> 今回起きてたのはコレですね。<br /> <a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/dev/serial/01/javascript-security/0006">こちら</a>の例を使用させていただきます。</p> <p>以下のようなコードがあるとします。</p> <pre><code class="javascript">div = document.getElementById("info"); div.innerHTML = location.hash.substring(1); </code></pre> <p><code>location.hash.substring(1)</code>でURLのハッシュ部分(#以降)を取得し、<br /> それを<code>id="info"</code>の<code>div</code>要素に入れることで、画面に表示させている処理です。</p> <p>URLが<code>http://example.jp/#title1</code>みたいなものなら問題ないですが、<br /> <code>http://example.jp/#<img src=1 onerror=alert(1)></code> のようなURLを開いた場合、<br /> <code><img src=1 onerror=alert(1)></code> がHTML内に展開され、JavaScriptが実行されることでXSSが発生します。</p> <h1 id="困ったことに全く心当たりがない"><a href="#%E5%9B%B0%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8%E3%81%AB%E5%85%A8%E3%81%8F%E5%BF%83%E5%BD%93%E3%81%9F%E3%82%8A%E3%81%8C%E3%81%AA%E3%81%84">困ったことに全く心当たりがない</a></h1> <p>今回起きた(診断された)DOMベースのXSSが何なのかはわかったけど、<br /> 自分のコードにおいて心当たりが全く無い!<br /> フロントエンドはVueで作成しているので、VueにおけるXSSについても調べる必要がありそうだなと。<br /> OWSP ZAPの誤検知の可能性もあるので、万が一明確な原因が見つかったら、またまとめておこうかなと思います。</p> <h1 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/dev/serial/01/javascript-security/0002?page=1">第2回 Webセキュリティのおさらい その2 XSS:JavaScriptセキュリティの基礎知識|gihyo.jp … 技術評論社</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/dev/serial/01/javascript-security/0006">第6回 DOM-based XSS その1:JavaScriptセキュリティの基礎知識|gihyo.jp … 技術評論社</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.slideshare.net/tobaru_yuta/vuejs-xss">Vue.js で XSS</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/miya_zato/items/7ea57326c86a198fcf08">XSSと、XSSの種類について - Qiita</a></li> </ul> みみみみみ