セキュリティシェファードOWASPアプリのXSS部分で立ち往生しています。私は解決策を教えてくれる人を探していません。自分でそれを見つける方法を学ぶ必要があるだけです。私はXSSで少し錆びています。だから私がこれまでに知っていること。
<script>
"空白スペースですから、フィルターは何年も前から慣れ親しんでいるものではありません。多くのことを試してみましたが、それを回避する方法を見つけることができませんでした。ここで私を殺しています...:/どんなヒントも歓迎し、将来的には他の人々を助けることを願っています。
私の答えは予想よりも長くなりました、それであなたに答えを与えるためだけに:<body onpageshow="alert(1)">
はおそらく機能し、そうでなければ、<body onpaonpageonpagonpageonpageshowshoweshowshowgeshow="alert(1)">
は機能します。
カスタムフィルターをバイパスする方法
あなたは自分で方法を学ぼうとするので、ここに私がとるべき最初のステップをいくつか示します。
I
も置換されますか、それともi
だけですか?:
_は許可されていませんが、_:
_は許可される場合があります(ほとんどのコンテキストで同じように機能します)。i
は常にフィルタリングされますか、またはscript
のみで行われますか、それとも文字で囲まれますか、...)フィルターは一度だけ適用されますか(例:_<scri<script>pt>
_は_<script>
_になります)?最後のポイントは最も複雑なものです。たとえば、i
は常に_.
_の代わりに使用するとします。しかし、コメントで_<scri<script>pt>
_が_<scri<scr.pt>pt>
_になると言います。したがって、おそらくi
はscript
でのみ置換されますか?
また、on
はフィルターされているとも言っています。本気ですか?または、特定のイベント属性の一部のみがフィルタリングされていますか? onFooBar
を試しましたか?フィルターされている場合、すべてのon
属性がフィルターされます。しかし、そうでない場合、一部はフィルターをバイパスする可能性があります。もしそうなら、あなたは特に新しいHTM5のものを試すべきです、それらのいくつかはしばしば忘れられます。チェックするのは イベント属性のリスト です。
あなたのケースでうまくいくかもしれないこと
明確な答えを出すには、ルールを具体的に説明していません[*]。しかし、いくつかのアイデアがあります:
<meta http-equIv="refresh" content="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">
_は、i
フィルターで大文字と小文字が区別されない(可能性が低い)場合、またはscript
にのみ適用される場合に機能します(例ではそうです)。 _:
_の代わりに_:
_が機能することに注意してください。i
フィルターで実際に大文字と小文字が区別されない場合、非常に多くのペイロードが機能する可能性があります:_<scrIpt src=http://localhost/s.js></scrIpt>
_(_<script>
_を含まない)、<a href="javascrIpt: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:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">
_:機能しません。 i
は実際には常に_.
_で置き換えられるわけではありません(そのようなフィルターはすべての実際の入力を破壊するため、理にかなっています)が、_&
_を使用できないため、データURLを使用します。<a href="javascript:alert(1)">click</a>
:script
、および_&
_の問題。最初の1つは、言及していないルール(_&
_ replace)が原因で失敗するだけであることがわかります。
しかし、今は機能するソリューションです。レベル2の場合:
on
、onclick
、onmouseover
、onload
、またはonerror
ではないondblclick
属性。たとえば、<body onpageshow="alert(1)">
など、たくさんあります。レベル3のトリックは、on
属性フィルターがもっと多いことです(すべてかどうかは確認しませんでした)が、何も(4回)置き換えられていません。つまり、キーワード自体を5回含めると、フィルターをバイパスします。
<body onpaonpageonpagonpageonpageshowshoweshowshowgeshow="alert(1)">
結論
フィルターの説明に一貫性がなく、不完全であるため、フィルターに基づいた答えを得ることができません。
このようなフィルターをテストするときは、定義したルールを中心にできる限り多くのケースを試して、できるだけ現実に近いフィルターの説明を取得する必要があります。
次に、これらのルールをバイパスするための正しいペイロードを見つけるだけです。