utsuroi xss labs Lab 01 / 5 — Apprentice
01

Reflected XSS — 記事共有メッセージへの注入

Reflected XSS into HTML context with nothing encoded

うつろい journal — うつろい社が運営する美容コラムサイト。各記事ページには ?shared_by=ユーザ名 というクエリパラメータで「誰が共有した記事か」を表示する SNS 連動機能がある。

例: https://journal.utsuroi.example.com/articles/123?shared_by=miharu_beauty と開くと、記事の上部に「miharu_beauty さんが共有した記事」と表示される。

しかし、サーバ側のコードはこの値をエスケープせずにそのまま HTML に文字列連結している。Reflected XSS の脆弱性が存在する。

shared_by パラメータにペイロードを入れて、記事ページ上で alert を実行させてください。alert が呼ばれた瞬間に「成功」が表示されます。

URL: 未送信
journal.utsuroi.example.com
サーバ側のコード(脆弱な実装)
$shared_by = $_GET['shared_by'];
echo '<div class="shared-by">'
   . $shared_by
   . ' さんが共有した記事</div>';

ユーザ入力をそのまま HTML に文字列連結している。エスケープ処理が一切ない。

あなたの入力
miharu_beauty
生成される HTML
<div class="shared-by">miharu_beauty さんが共有した記事</div>
解析結果
    ヒント 1 — まずは何を入力すべきか

    JavaScript を実行させるには、HTML の中で JavaScript として解釈される部分を作る必要があります。最も基本的なのは <script> タグです。

    ヒント 2 — script タグの中身

    Mission は alert を実行させること。<script>alert('XSS')</script> のような形をペイロードに入れてみてください。

    正解(ネタバレ)

    ペイロード:
    <script>alert('XSS')</script>

    このペイロードが shared_by に入ると、記事ページの HTML はこうなります:

    <div class="shared-by">
      <script>alert('XSS')</script> さんが共有した記事
    </div>

    ブラウザは <script> を見つけたら中身を JavaScript として実行するので、alert が呼ばれます。