web-dev-qa-db-ja.com

引用符で囲まれていないHTML属性のencodeURIComponent

私の直感は、以下が攻撃可能であるはずだということです。

$("<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を制御できるクロスサイトスクリプティング攻撃の場合、特定の攻撃を見つけることができないようです。私は間違っていますか?

5
David Mulder

から [〜#〜] mdn [〜#〜]

encodeURIComponentは、アルファベット、10進数、

- _ . ! ~ * ' ( )

通常、別の属性(onclickなど)を追加するにはスペース文字が必要ですが、残念ながら、これはURIの一部としてエンコードされます。

ただし、 OWASP XSS(クロスサイトスクリプティング)防止に関するチートシート から:

引用符で囲まれていない属性は、_[space] % * + , - / ; < = > ^ and |_を含む多くの文字で区切ることができます

したがって、_-_または_*_文字を試して、新しい属性を作成することができます。

例えばsomevarhttp://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, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
}
_
5
SilverlightFox