Web Application
XSS用文字列の例
- "><script>alert(document.cookie)</script><"
これをURLエンコード*1したもの
%22%3E%3Cscript%3Ealert%28document.cookie%29%3C%2Fscript%3E%3C%22
脆弱性検証方法
上記の文字列をWebサーバに送信する値に設定します。
使用ツール
- Paros
(公式サイト)
- Parosの解説ページ
- 要はプロキシなのですが、いろいろ便利な機能がついてます。
フリーでかつソースも公開されているので、自分用に改造することも可能。
- Javaで作られているので、実行する場合はJRE1.4.2以上がインストールされている必要があります。
検証手順
- XSSを検証する遷移元ページ(以下SRC)をブラウザで表示。
- ParosのTrapタブにある「Trap request」と「Trap response」を有効にする。
- 診断対象タグ(以下対象タグ)以外に正常遷移する値を入力。
- 対象タグは未入力のままフォームを送信する操作(【登録】ボタンや【削除】ボタン押下など)を行う。
- Parosがトラップするので、Trapタブの下方に表示されているフォームの送信内容から対象タグを探し、XSS用文字列を設定して【Continue】ボタンを押下する。
- フォームの送信内容の表示方法を切り替えるプルダウンリストがグレーアウトするまで【Continue】ボタンを押下し続ける。
- プルダウンリストがグレーアウトしたらブラウザで遷移先ページ(以下DST)を確認する。
- DSTにダイアログが表示されたらXSS脆弱性あり、と判断する。
対策
エスケープ処理(無害化、サニタイズ)
HTMLタグとしてブラウザに解釈されないようにするために、画面に文字を表示する際に、HTMLタグに使用される文字( < や " [ダブルクォーテーション]など)を '<' や '"' のようにエスケープしてください。
Java
上記サイト
より引用
タグの属性値として値出力する場合は、このタグを使用するより fn:escapeXml() を使ったほうが可視性を損なわなくて済みます。
0
1
| | <input type="text" value="<c:out value="${name}">">
<input type="text" value="${fn:escapeXml(name)}">
|
JSTLリファレンス:<c:out>
c:outタグを使用するとデフォルトで " や < といった記号を変換してくれます。
明示的な指定は escapeXml="true"
0
1
2
3
4
5
6
7
8
9
10
11
| | <%@ page language="java" contentType="text/html;charset=Windows-31J"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html><body>
<c:set var="data" value="てすと!!" />
<c:set var="data" value="てすと!!" escapeXml="true"/>
<c:out value="${data}" />
<c:out value="${data}" escapeXml="true"/>
</body></html>
|
※入力時チェック
ブラウザから送信された文字列がシステムの要求と合致しているかを確認してください。
例)電話番号は半角数字のみで最大11桁、処理IDは先頭3文字が半角大文字の英字で始まり、5桁の数字が続く8文字、など
クライアント側の検証だけではなく、必ずサーバ側でも検証してください。
※クロスサイトスクリプティング対策の原則は「表示時にエスケープ処理」です。入力時チェックは「念のため」or「気休め」です。
関連する脆弱性
画像ファイルへのスクリプト挿入
画像ファイルにPHPやJavaScriptといったスクリプトのコードを仕込んでアップロードしておき、これをブラウザで表示すると仕込んだスクリプトが発動する、という攻撃手法が存在します。
以下は詳細な解説があるサイトです。
参考
- 日本語情報
- 英語情報