6

疑問は次のようなものから生じました:
&#x を含む HTML 要素の ID をブラウザーが変更するのはなぜですか?

次の Web ページがあるとします。

<html>
  <head>
    <script type="text/javascript">
      // --------------------------------------------------------
      // could calling this method produce an XSS attack?
      // --------------------------------------------------------
      function decodeEntity(text){
        text = text.replace(/<(.*?)>/g,''); // strip out all HTML tags, to prevent possible XSS
        var div = document.createElement('div');
        div.innerHTML = text;
        return div.textContent?div.textContent:div.innerText;
      }
      function echoValue(){
        var e = document.getElementById(decodeEntity("/path/&#x24;whatever"));
        if(e) {
          alert(e.innerHTML);
        }
        else {
          alert("not found\n");
        }
      }
    </script>
  </head>
  <body>
    <p id="/path/&#x24;whatever">The Value</p>
    <button onclick="echoValue()">Tell me</button>
  </body>
</html>

要素のにidは、<p>XSS 攻撃を防ぐためにエスケープされた文字が含まれています。HTML 部分と JS 部分はサーバーによって生成され、サーバーは両方の部分に同じエスケープ値 (セキュリティで保護されていないソースに由来する可能性があります) を挿入します。

&#xサーバーは、次の文字範囲を次の形式でエスケープします。

  • 0x00 – 0x2D
  • 0x3A – 0x40
  • 0x5B – 0x5E
  • 0x60
  • 0x7B – 0xFF
  • 0x0100 – 0xFFFF

つまり、エスケープされない唯一の文字は次のとおりです。

  • 0x2E – 0x39 ( ., /, 0123456789)
  • 0x41 – 0x5A ( AZ)
  • 0x5F ( _)
  • 0x61 – 0x7A ( az)

<p>ここで、 javascriptを介してアクセスする必要があります。参照されている質問の関数は、ブラウザが HTML 部分に変換されますが、JS 部分のままでechoValue()あるため、常に失敗しました。&#x24;$&#x24;

そこで、Garethはシンプルで機能する答えを思いつきました。

decodeEntity()私の懸念は、参照されている回答で提供されている関数を使用すると、動的文字列をエスケープすることで排除された XSS 攻撃の可能性が再び発生することです。

セキュリティ上の懸念があるかどうか (どれ? ) ないか (なぜ?)指摘できますか?

4

2 に答える 2

4

最初に、JavaScript の HTML サニテーションと Javascript の XSS について説明している次のリンクをご覧になることをお勧めします。

セキュリティの教訓その 1: 車輪の再発明をしないこと。以前に何かが行われた場合、その場しのぎの解決策よりも優れた仕事をした可能性があります。

あなたの単純な正規表現を悪用する方法を頭の中で見つけることはできませんが、それが本当にすべてのケースを捉えているとは確信していません。最初のリンクは、より精巧で、徹底的にレビューおよびテストされたソリューションを提供します。

XSS Filter Evasion Cheat Sheetもご覧になることをお勧めします。人々が思いつく可能性のある厄介なものの種類を本当によく示しています。

于 2013-01-25T13:02:55.593 に答える
0

入力に追加の制約を適用すると、この攻撃が失敗する可能性がありますが、 への任意の入力を想定してdecodeEntity、スクリプトを実行する例を次に示します。

decodeEntity("<img onerror='alert(\"test\")'\nsrc='test'>")

とが同じ行にある/<(.*?)>/場合にのみ一致するため、これが実行されます。<>

于 2013-01-25T13:02:07.653 に答える