私の直感は、以下が攻撃可能であるはずだということです。
$("<td><a href=somefile.php?url="+encodeURIComponent(somevar)+">Download Here</a></td>");
とは対照的に
$("<td><a href=\"somefile.php?url="+encodeURIComponent(somevar)+"\">Download Here</a></td>");
ユーザーがsomevar
を制御できるクロスサイトスクリプティング攻撃の場合、特定の攻撃を見つけることができないようです。私は間違っていますか?
から [〜#〜] mdn [〜#〜] :
encodeURIComponent
は、アルファベット、10進数、
- _ . ! ~ * ' ( )
通常、別の属性(onclick
など)を追加するにはスペース文字が必要ですが、残念ながら、これはURIの一部としてエンコードされます。
ただし、 OWASP XSS(クロスサイトスクリプティング)防止に関するチートシート から:
引用符で囲まれていない属性は、_
[space] % * + , - / ; < = > ^ and |
_を含む多くの文字で区切ることができます
したがって、_-
_または_*
_文字を試して、新しい属性を作成することができます。
例えばsomevar
をhttp://www.example.com-onclick=alert('xss')
またはhttp://www.example.com*onclick=alert('xss')
に設定します
マイレージはブラウザ間で異なる可能性があり、残念ながら_=
_はURLエンコードされたままなので、克服するためのハードルもあります。したがって、値が適切に引用またはエンコードされていなくても、このエンコードの欠陥をXSSの悪用に変えることができない場合があります。
2番目の例はより安全ですが、値は実際にはHTMLエンコードされているはずです。
_$("<td><a href=somefile.php?url=\""+htmlEscape(encodeURIComponent(somevar))+"\">Download Here</a></td>");
_
ここで htmlEscape
は:-
_function htmlEscape(str) {
return String(str)
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
_