web-dev-qa-db-ja.com

XSS攻撃とスタイル属性

次のような既知のスタイル属性XSS攻撃があります。

<DIV STYLE="width: expression(alert('XSS'));">

または

<DIV STYLE="background-image: url(javascript:alert('XSS'))">

すべての例 私は見たことがある 式またはURL機能のいずれかを使用します-基本的に、 "("および ")"を必要とするような関数です。

私はスタイルタグをフィルタリングする次の方法を考えています、私は次の(およそ)文法を使用してそれらをチェックします:

identifier: [a-zA-Z_][a-zA-Z0-9\-]*
number: [0-9]+
string: '[a-zA-Z_0-9 ]*'
value : identifier | number | string | number + "(em|px)" | number +"%"
entry: identifier ":" value (\s value )*
style: (entry ;)*

したがって、基本的にASCIIプロパティに数値または非常に限定された文字列値(基本的にフォント名の場合)を含む)を許可し、呼び出しのようなものは使用できないようにします。

問題はこれで十分ですか?そのようなことをする可能性のある攻撃はありますか?

<DIV STYLE="this-is-js-property: alert 'XSS';">

そして成功?

そのようなテストのXSSの脆弱性について誰かが考えることができますか?

明確にするために

TinyMCEなどの多くのツールがスタイル属性を使用し、無害なスタイル属性をフィルターで除外すると機能が大幅に低下するため、スタイル属性が必要です。

したがって、@ import、url、式などを使用する可能性のあるすべてのものを削除する一般的なケースを渡すことを好みます。また、基本的なcss構文が適切であることを確認してください。

回答

いいえ、クリックジャッキングの脆弱性のため、安全ではありません。

27
Artyom

これはclick-jackingの脆弱性により機能しません。

例:

<a href="http://example.com/attack.html" style="display: block; z-index: 100000; opacity: 0.5; position: fixed; top: 0px; left: 0; width: 1000000px; height: 100000px; background-color: red;"> </a> 

見つけた場所: http://www.bioinformatics.org/phplabware/forum/viewtopic.php?id=164

コードは完全に検証されますが、深刻な損傷を引き起こす可能性があります。

したがって、経験則では、非常に厳密なホワイトリストを使用するか、スタイル属性を許可しません。

14
Artyom

[〜#〜] owasp [〜#〜] と呼ばれるオープンなファンデーションがあり、これが役立ちます。

あなたの質問に答えるためにAre there any attacks....;はい!

そこにはたくさんのドキュメントがあり、すべてのXSSコードを正しくエスケープするために使用できるライブラリがあります。

XSS防止シート をお読みください。

3
Shervin Asgari

セキュリティルール#1:疑いが最も少ない場合は、穴があると仮定します。

何を達成しようとしていますか?信頼できないソースからのCSSを引き起こす機能は何ですか?

1
aaaaaaaaaaaa

はい、スタイル属性でXSS攻撃を使用できます。

これらのスタイルは、特定のjspページのタグで宣言されていなかったため挿入されましたが、セキュリティグループによって監査されたときに通過しました。

<img src="<path here>" style=x:ex/**/pression
(alert(54163)) ".gif"

ここでHTTPフィルターを使用して停止することを考えていますが、まだ調査中です。

また、隠された入力フィールドも保護されておらず、これも通過しました。

<input type="hidden" name="<variable name here>" value="<value here>"  style=x:ex/**/pression(alert
(54163)) "">

Burpsuiteのようなツールを使用すると、このようなタグにXSSを挿入するようにその場でリクエストを変更できます。ただし、OWASPのESAPI APIを使用すると、保護を追加できます。 JSTLタグは古いレガシーコードであるため、使用していませんでした。これが、短期間の最良のソリューションでした。

私が使用した隠し入力には、

<input type="hidden" name="id" value="<%=ESAPI.encoder().encodeForHTMLAttribute(id)%>"

imgタグのjs onloadイベントでXSS を使用することもできます。

0
James Drinkard