web-dev-qa-db-ja.com

ユーザー名としてのメールアドレスへのJavascriptインジェクション?

有効なメールアドレス(Gmailへの送信を使用した場合に機能するもの、さまざまな有効な定義(メールはエクスプロイトではなく受信されます))に、レンダリングされ、出力がサニタイズされない場合に悪用される可能性があるJavaScriptを含めることは可能ですか? (正しくエンコードされていますか?)もしそうなら、例を提供してください。

3
xenoterracide

理論的には(実際には、衛生機能に応じて)、はい、電子メールのローカル部分はXSS攻撃で使用される可能性があると言えます。

問題は、電子メールアドレスが複雑で、多数の特殊文字が含まれている可能性があることです。さらに、メールアドレスにはコメントや引用符付き文字列などの機能があり、さらに多くの特殊文字を使用できます。

電子メールアドレスのローカル部分のXSS

[情報 rfc3696 を使用しています。公式のrfcよりも読みやすいからです。]

正確な規則は、制御文字を含むすべてのASCII文字は引用符で囲まれて表示されるか、引用符で囲まれた文字列で表示される可能性があるということです。

したがって、有効なメールアドレスは次のようになります。

"<script>alert(1)</script>"@example.com

あなたはその妥当性をテストすることができます ここ 。これは明らかに安全ではありません。

さらなる可能性

引用符で囲まれた文字列がなくても、攻撃者は少なくとも近づくことができます。

引用符がない場合、ローカル部分は、アルファベット文字、数字、または特殊文字の任意の組み合わせで構成できます。 #$%& '* +-/ =? ^ _ `。 {| }〜

これは、JavaScriptコンテキストを入力するのにすでに十分です。例:

<a href='mailto:USER_EMAIL'>email me</a>

経由:

foo'onclick='alert'foo='@example.com

ここでの問題は(は許可されていませんが、これをエンコードせずにエンドユーザーに出力するのは快適ではありません。少なくとも、ユーザーはスタイルを変更できます:foo'style='color:red'title='imImportant'@example.com

ペイロードをローカルパーツのコメント内に配置することもできるため、メールプロバイダーの可能な制限は適用されません。例:("<script>alert</script>")[email protected]、 どこ [email protected]はメールアドレスです(ここでは、上記と同じルールが適用されます-<および>は引用符で囲まれた文字列の中にのみ存在できます。さらに、(および)、引用符付き文字列でも)。

そして、これはローカルな部分についてです。ドメイン部分は、攻撃者に追加の攻撃ベクトルを与えます。

適切な防御

これが、XSS防止がフィルタリングではなく、適切なエンコーディングであるべき理由です。すべての危険な文字(ほとんどのコンテキストでは- すべてではない -これらは少なくとも'"<>)は、事前に適用されたフィルタに関係なく、ユーザーに送信するときにHTMLエンコードする必要があります。

5
tim

さらに Timの優れた答えGmailはコンテンツセキュリティポリシーを実装 フィルターをバイパスするスクリプトを サポートされているブラウザー でレンダリングしないようにします。

したがって、はい、メールアドレスにはタグを含めることができますが"<script>alert('foo')</script>"@example.com Googleが正しくエンコードしていなかった場合は驚きます。そうでない場合は、ユーザーを保護するCSPがあります。とはいえ、 AndroidのGmailアプリの最近のバグ があり、アドレスからは一見偽装されているように見えるようになりました。

0
SilverlightFox