web-dev-qa-db-ja.com

XSS攻撃をブロックするのに十分なhtmlentitiesまたはhtmlspecialchars関数を使用している

この質問がネットで何度も議論されたことは知っています。そして人々はいくつかのコードを渡すことによってこれらの関数をバイパスする方法のいくつかの例を示します。しかし、ここで1つの問題、htmlentities/htmlspecialcharsのすべての例は、次のような属性値として埋め込むと関連しています

<a href="" title="<?php echo htmlentities([XSS_CODE]) ?>"></a> 

OR

<img onerror="<?php echo htmlentities([XSS_CODE]) ?>" /> 

しかし、以下のようなコンテンツとしてデータを表示する必要がある場合。

<div><?php echo htmlentities([XSS_CODE]) ?></div>

どのようにそれが安全でない可能性があります。属性の場合のようにコードにはトリガー/イベントがないので、これはすべての場合で安全です。

私は https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet を勉強しました。 XSS攻撃/フィルターバイパスのほとんどすべての例は、特定のケースでは機能しません。 urlの最後のパラグラフで指定されているように、<&>の16進エンコードされた値を試しましたが、これも失敗し、単にデータとして提供されました。

私は実際に https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#Character_escape_sequences を疑っています。これには、\ x3c、\ u003c、%3CなどのHTMLエンティティによって処理されない組み合わせがあります。私自身はそれらを使用して生成および悪用することはできませんが。

私は次のような例を試しました

$code = "\x3cstrong\x3eHello World\x3\cstrong\x3e";
// OR
$code = "\u003cstrongu003eHello Worldu003c\cstrongu003e";


<div><?php echo htmlentities($code); ?></div>

注:UbuntuマシンでFirfox 40に対するすべての攻撃を試しました。

4
kuldeep.kamboj

htmlentitiesは、考えられるすべての文字をエンコードするため、使用するのに適した関数です。

あなたの例でXSSが達成されているのを確認できる唯一の方法は、Internet Explorerを使用することです 文字セットがUTF-7に設定されている場合

文字セットがUTF-7の場合

+ADw-script+AD4-alert(document.location)+ADw-/script+AD4-

なる

<script>alert(document.location)</script>

ブラウザが解釈したとき。さらに、htmlentitiesは文字のエンコードを引き起こしません。

古いバージョンのInternet ExplorerのみがUTF-7を自動検出することを覚えておいてください-最新バージョンでは明示的に設定する必要があります(Webサイトの作成者または攻撃者が他のベクトルを使用して)-参照 この回答

5
SilverlightFox

ブラウザが「onerror」などのイベント属性を解析する場合、ブラウザはまず属性の値をデコードし、次にそれをJSエンジンに送信して実行します。そのため、このような属性に挿入するユーザーコンテンツをHTMLエンコードするだけでは不十分です。

対照的に、ブラウザーが<script>タグを解析する場合、そのコンテンツはHTMLデコードされません。コンテンツをJSエンジンに転送して実行します。

同様に、<div>タグの間にユーザーコンテンツを挿入すると、ブラウザーはデコードされないため、エンコードされた文字を画面に表示するだけであるので、ユーザーデータがHTMLエンコードされている場合にXSSが可能になる方法はわかりません。

また、コンテンツがHTMLエンコードされ、二重引用符で囲まれている場合、<a>タグのtitle属性がXSSにどのようにつながるかわかりません。方法がわかれば教えてください:)

1
stanko