web-dev-qa-db-ja.com

永続的なXSSフィルターバイパスの質問

私が作成したテストサイトで保存されたXSSをテストしましたが、これは脆弱であるため、通常の"><script>alert('XSS')</script>を実行しようとしたときに問題が発生します

代わりに機能しませんでした。ただし、この特定の"><script>alert("XSS")</script> javascriptが代わりに機能します。

バックエンドコードは完全に脆弱であるため、フィルタリングやサニタイズを含めなかったため、最初は理解できませんでした。


しかし、以下に示すように、XSSコードを格納するバックエンドSQLクエリを確認しようとすると、.

UPDATE users set name = 'XSSINPUT';

上記のSQLクエリに基づいて、最初のjavascriptが機能しない理由を理解できました一重引用符で囲まれているため、JavaScriptコード全体が入力される前にSQLクエリが閉じられ、以下に示すようにSQLクエリが中断されるため

UPDATE users set name = '"><script>alert('XSS')</script>';

したがって、これにより、JavaScriptポップアップを実行できなくなります。


以下のサーバー側コードが正常に実行された場合

UPDATE users set name = '"><script>alert("XSS")</script>';

これは二重引用符で囲まれ、SQLクエリを壊さないためであり、DBがそのSQLクエリを正常に実行できるようにします。

つまり、私の質問です。私の理解は正しいですか?

1
Cash-

あなたは正しいです。単一引用符を含む更新ステートメントは、名前の値の終了と更新のアドホックな性質のために壊れます。単一引用符を閉じた後の余分なテキストが有効なSQLではないため、エラーが発生しないのは驚くべきことです。

私はこれらの両方の例の例を設定しました(例として設定する方が簡単なのでSELECTとして) here を見つけることができます。

あなたがこれをまだ知らないのは疑わしいですが、永続的なXSSはかなり深刻な脆弱性であり、好奇心が強い場合は、いくつかの影響がよく強調されています here

1
alert_xss