#121 Reflected XSS
ユーザーが入力できる項目が多いWebサイトは、複雑になりがちで、熟練した開発者でも思わず脆弱性を作り込んだりしてしまいます。Reflected XSS(反射型XSS)はその典型で、気をつけていても、ついやってしまいます。
反射型XSSとは、ユーザー入力が適切にエスケープされないままレスポンスに含まれることで発生するXSSです。scriptタグなどを埋め込むことによって任意のJavaScriptを実行できるため、セッション情報の窃取やCSRFにつながる可能性がある脆弱性です。
XSSは比較的発見しやすいので、自動化できないか試してみました。
反射型XSSの検知
HTMLエスケープ
HTMLの文法で扱われる”(ダブルクオート)や<>(小なり、大なり)などは、必ずHTMLエスケープしなければいけません。エスケープされると、それぞれ"、<、>といった特殊な表現に置き換えられます。逆に言えば、きちんとエスケープされていない箇所を探せば、XSSを検知できます。
タグの要素
タグの属性(aタグのhrefなど)をシングルクオートで囲ったり、まったく囲わないでもブラウザ上では正しく表示されます。しかし、この場合はXSSに脆弱となります。シングルクオートは通常エスケープされないので、ユーザーの入力値が属性内に埋め込まれた場合、イベント属性などを追加してJavaScriptを発火することができます。例えば、下記のようにするとonclick属性を追加して、クリック時にアラートを出現させることができます。
<a href='/test?search=query'onclick='alert(1)'>Click</a>
これは、正規表現で発見できそうです。
ツールに組み込みました。
まだちゃんとテストしてませんが、PortSwiggerのWeb Security Academyなどで試してみてください!
EOF