web-dev-qa-db-ja.com

charフィルタリングをバイパスする-セキュリティシェファード

セキュリティシェファードOWASPアプリのXSS部分で立ち往生しています。私は解決策を教えてくれる人を探していません。自分でそれを見つける方法を学ぶ必要があるだけです。私はXSSで少し錆びています。だから私がこれまでに知っていること。

  • char "i"とIを ""に置き換えます。
  • <script> "空白スペース
  • 「!」を「:」に置き換えます
  • 「on」にも置き換えられるため、onloadなどは代わりに負荷を示します。

ですから、フィルターは何年も前から慣れ親しんでいるものではありません。多くのことを試してみましたが、それを回避する方法を見つけることができませんでした。ここで私を殺しています...:/どんなヒントも歓迎し、将来的には他の人々を助けることを願っています。

3
cfernandezlinux

私の答えは予想よりも長くなりました、それであなたに答えを与えるためだけに:<body onpageshow="alert(1)">はおそらく機能し、そうでなければ、<body onpaonpageonpagonpageonpageshowshoweshowshowgeshow="alert(1)">は機能します。

カスタムフィルターをバイパスする方法

あなたは自分で方法を学ぼうとするので、ここに私がとるべき最初のステップをいくつか示します。

  • 大文字と小文字を確認:すべてのフィルターで大文字と小文字が区別されるわけではありません。 Iも置換されますか、それともiだけですか?
  • 代替エンコーディングを確認してください:_:_は許可されていませんが、_&#58;_は許可される場合があります(ほとんどのコンテキストで同じように機能します)。
  • フィルターが実際に行っていることを確認します。置換は常に行われますか、それとも特定のコンテキストでのみ行われますか(例:iは常にフィルタリングされますか、またはscriptのみで行われますか、それとも文字で囲まれますか、...)フィルターは一度だけ適用されますか(例:_<scri<script>pt>_は_<script>_になります)?

最後のポイントは最も複雑なものです。たとえば、iは常に_._の代わりに使用するとします。しかし、コメントで_<scri<script>pt>_が_<scri<scr.pt>pt>_になると言います。したがって、おそらくiscriptでのみ置換されますか?

また、onはフィルターされているとも言っています。本気ですか?または、特定のイベント属性の一部のみがフィルタリングされていますか? onFooBarを試しましたか?フィルターされている場合、すべてのon属性がフィルターされます。しかし、そうでない場合、一部はフィルターをバイパスする可能性があります。もしそうなら、あなたは特に新しいHTM5のものを試すべきです、それらのいくつかはしばしば忘れられます。チェックするのは イベント属性のリスト です。

あなたのケースでうまくいくかもしれないこと

明確な答えを出すには、ルールを具体的に説明していません[*]。しかし、いくつかのアイデアがあります:

  • _<meta http-equIv="refresh" content="0;url=data&#58;text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">_は、iフィルターで大文字と小文字が区別されない(可能性が低い)場合、またはscriptにのみ適用される場合に機能します(例ではそうです)。 _&#58;_の代わりに_:_が機能することに注意してください。
  • iフィルターで実際に大文字と小文字が区別されない場合、非常に多くのペイロードが機能する可能性があります:_<scrIpt src=http://localhost/s.js></scrIpt>_(_<script>_を含まない)、<a href="javascrIpt&#58;alert(1)">click</a>など。

[*]そしてあなた自身も少し矛盾しています。 _<script>_が空白スペースになり、iが_._になる場合、_<scri<script>pt>_が_<scri<scr.pt>pt>_ではなく_<scr. pt>_につながる理由あなたのルールに一致しますか?

あなたのケースで実際のフィルターは何ですか

XSSフィルターを見ることができます here

フィルターの説明から、レベル2(またはレベル3)にいることになります。フィルターは:

  • scriptは_sc.pt_になります
  • onclickは_o.ick_になります
  • onmouseoverは_o.ver_になります
  • onloadは_o.oad_になります
  • onerrorは_o.err_になります
  • ondblclickは_o.dbl_になります
  • _&_は_!_になります
  • _:_は_!_になります

または、レベル3の場合も同じですが、onフィルターの方が少し悪いです。

これらのフィルターをバイパスするペイロード

フィルターの適切な説明ができたので、フィルターを簡単にバイパスできます。

しかし、最初に、実際には機能しないバイパス:

  • _<meta http-equiv="refresh" content="0;url=data&#58;text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">_:機能しません。 iは実際には常に_._で置き換えられるわけではありません(そのようなフィルターはすべての実際の入力を破壊するため、理にかなっています)が、_&_を使用できないため、データURLを使用します。
  • <a href="javascript&#58;alert(1)">click</a>script、および_&_の問題。

最初の1つは、言及していないルール(_&_ replace)が原因で失敗するだけであることがわかります。

しかし、今は機能するソリューションです。レベル2の場合:

  • ononclickonmouseoveronload、またはonerrorではないondblclick属性。たとえば、<body onpageshow="alert(1)">など、たくさんあります。

レベル3のトリックは、on属性フィルターがもっと多いことです(すべてかどうかは確認しませんでした)が、何も(4回)置き換えられていません。つまり、キーワード自体を5回含めると、フィルターをバイパスします。

  • <body onpaonpageonpagonpageonpageshowshoweshowshowgeshow="alert(1)">

結論

フィルターの説明に一貫性がなく、不完全であるため、フィルターに基づいた答えを得ることができません。

このようなフィルターをテストするときは、定義したルールを中心にできる限り多くのケースを試して、できるだけ現実に近いフィルターの説明を取得する必要があります。

次に、これらのルールをバイパスするための正しいペイロードを見つけるだけです。

3
tim