XSSラボ実践記録(前編)

レベル1

ページにアクセスすると、GETパラメータで渡されたnameの値がそのまま表示される。ソースコードを確認すると、入力値に対して一切のサニタイズが行われていないため、典型的な反射型XSSの脆弱性が存在する。

<script>alert(/xss/)</script>

レベル2

入力値がHTMLのinputタグのvalue属性内に埋め込まれている。この場合、属性値を閉じてスクリプトを挿入する必要がある。

"><script>alert(/xss/)</script>

レベル3

尖括弧(<, >)がエスケープされているため、scriptタグは使用できない。代わりに、HTMLイベント属性を利用してXSSを発動させる。フォーカス時に実行されるonfocusイベントを使用する。

' onfocus=alert(1) autofocus='

レベル4

基本的な対策はレベル3と同様だが、属性値の囲いがシングルクォートからダブルクォートに変更されている。そのため、ペイロード中のクォートを調整する必要がある。

" onfocus=alert(1) autofocus="

レベル5

scripton*といったキーワードがフィルタリングされており、strtolower()による小文字強制のため大文字による回避も不可能。この場合、<a>タグのhref属性にjavascript:擬似プロトコルを仕込む方法が有効。

"><a href=javascript:alert(1)>click</a>

レベル6

フィルタリングは継続されているが、strtolower()が削除されているため、大文字・小文字混在による回避が可能になる。

"><ScRiPt>alert(1)</sCrIpT>

レベル7

特定のキーワード(例:script)が完全に置換され、空文字列に変換されている。このような場合、「二重書き」による回避が有効。例えばscrscriptiptとすることで、中間のscriptが削除されても残りが結合して有効なタグになる。

"><scrscriptipt>alert(1)</scrscriptipt>

レベル8(保存型XSS)

リンク登録機能において、URLとしてjavascript:alert(1)を試すと、一部の文字がアンダースコアに置換される。しかし、URLエンコードされた改行文字(%0a)を用いることで、ブラウザが依然としてjavascript:として認識する可能性がある。

javascrip%0at:alert(1)

このペイロードは、ブラウザのURLバーから直接送信することで、二重エンコードを回避できる。また、HTML数値文字参照による代替手法もある:

javascript:alert(1)

レベル9

入力値にhttp://が含まれていることが必須条件となっている。この制約を満たしつつXSSを実行するには、コメントや改行を用いてhttp://を無害化する方法が考えられる。

javascrip%0at:alert('xss')//http://
javascrip%0at:alert('xss')/*http://*/
javascrip%0at:alert('xss')<!--http://-->

レベル10

隠しフォームフィールド(t_sortなど)が存在し、その値がHTMLの属性内に反映される。尖括弧はフィルタされているが、属性の構造を操作することでイベントを注入可能。

&t_sort=" type="button" onclick="alert(1)" x="

タグ: XSS Webセキュリティ ペネトレーションテスト

5月22日 10:33 投稿