一部のXSSフィルタリングをバイパスしようとしています。一重引用符を挿入するたびにバックスラッシュが表示されるため、このペイロードを記述しました。
\';alert(1);\'
ソースコードでは次のようになります。
<script>
a = '\';alert(1);\''
</script>
まだアラートボックスが表示されません。なにが問題ですか?
サーバーが実行するコードを確認せずに確実に知ることは不可能ですが、知識に基づいた推測を行うことができます。
次のようなテンプレートがあります。
a = '{escape(input)}';
'
は\'
に置き換えられます。
\'
は上記のルールの例外であるようです(おそらく、あなたが試みていた攻撃そのものを防ぐためです)。これは少し意外です。通常行うのは、\
を\\
に置き換えることです。そのため、\\\'
が得られます。エスケープしたいコンテキストを理解することが重要です。この場合、それはJavaScript文字列リテラル(または OWASPチートシート のルール#3)です。それから抜け出すには、2つのオプションがあります。
一般的なJavaScriptコンテキストに切り替えます。これは、エスケープされていない'
をそこに入れることによってのみ実行できると思います。コンテキストに関係なく\'
が常に影響を受けない場合は、\\'
を試してください。運が良ければ、最初のバックスラッシュについては何も行われません。念のため、さまざまな数のバックスラッシュを試してください。
スクリプトブロックを終了して、HTMLコンテキストに入ります。このようなものを試してください:
</script><script> alert(1); </script><script>
ほとんどの場合、<
は<
にエスケープされますが、試してみる価値はあります。
この関連質問 も参照してください。
このフィルターをバイパスするには、最後に//を追加して、残りのリクエストにコメントを付ける必要があります。ただし、一部のXSSチャレンジでは、「/」の前に「\」を追加するため、このメソッドを使用してフィルターをバイパスすることはできません( " http://Sudo.co.il/xss/level5-2.php?p=test "):
\';alert(1);//
以下を取得するには:
<SCRIPT>var a="\\";alert(1);//";</SCRIPT>"
しかし、残念ながらそれは私にとってはうまくいきませんでした、そして私は次の出力を得ました:
<script>
a = '\\';alert(1);\/\/'
</script>
最初の方法がうまくいかなかった場合は、リンクに以下を追加して、私にとってはうまくいった別の解決策について考える必要があります。
\';alert(1);<!--
上記のコードを使用すると、フィルターをバイパスできます。
<script>
a = '\\';alert(1);<!--'
</script>
エスケープされた二重引用符をバイパスする
あなたの説明に基づいてこれはうまくいくはずです:
\ "); alert(" xss
「」は「\」としてエスケープされるため、「」はエスケープされますが、「」はエスケープされません。
これを防ぐには、少なくとも\を\としてエスケープする必要があります。
エスケープされた二重引用符と二重円記号を単一の円記号にバイパスする
あなたのコメントに基づいて、私はフィルタリングの実際の関連部分が次のように機能すると想定しています:
" -> \"
\\ -> \
これも安全ではありません。注射は次のようになります。
\\ "); alert(1
"はステップ1で\"としてエスケープされ、ステップ2で\\ "に変換されます。これは、ステップ2で\"に変換されます。注入された文字列では二重引用符を使用できませんが、単一のXSSの場合は問題ありません。引用符または完全に引用符なしで完全に可能性があります。
これを確保するには、単一のバックスラッシュに変換するのではなく、二重のバックスラッシュをエスケープする必要があります。これにより、上記の注入で\\\\\が得られ、安全です。