開発者ツール · URL エンコーダーとデコーダー
URL エンコードはサニタイズされていません: デコードされたパラメータは引き続きエスケープする必要があります
· なぜそれが重要なのか
URLエンコーディング セキュリティ xss
パーセント エンコーディングは、HTML、SQL、シェルではなく、URL 構造を保護します。この投稿では、正しくエンコードされた値がデコードされた瞬間に再び危険になる理由と、どのエスケープがどこに属するかを説明します。
URL エンコードだけでは XSS 攻撃を阻止できない理由
「安全な」パラメータは、送信用にエンコードされているが、レンダリング前にデコードされている場合にスクリプトを実行できます。 %3Cimg%20src%3Dx%20onerror%3Dalert%281%29%3E としてパーセント エンコードされた onerror ハンドラーを備えた img タグのような XSS ペイロードを検討してください。これが URL 内を移動し、HTML に挿入される前にアプリケーション コードによってデコードされると、ブラウザーは元のマークアップを確認してハンドラーを実行します。パーセントエンコーディングは表現層です。根本的な脅威は変わりません。
ペイロードは、HTTP または URL パーサーにとって特別な意味を持たないエンコードされた文字列である場合、送信中にのみ安全です。解読した瞬間に元の姿に戻ってしまうので危険です。すべてのダウンストリーム コンテキストは、データの使用方法に適した独自のエスケープ ルールを適用する必要があります。 URL エンコードは、HTML エスケープ、SQL パラメータ化、シェル引数処理の代わりにはなりません。
パーセント エンコーディングの目的 — 回線上で区切り文字を明確に保つことだけです
パーセント エンコーディングが行うことは、URL 構造を正確に保護することです。アンパサンドはクエリ文字列構文の一部のままであり、区切り文字として再解釈されません。スラッシュはパスの区切り文字にはなりません。疑問符はフラグメントを開始しません。予約文字を %XX としてエンコードすると、パーサーは予約文字を構文ではなくデータとして扱います。これは、ネットワーク上で URL 構造を明確に保つという 1 つの仕事で機能します。
デコードすると、一方通行がまさに逆になります。復元されたバイトはエンコードされたものとまったく同じであり、それ以上でもそれ以下でもありません。 HTML の危険な文字列は危険なままであり、SQL インジェクション ベクターも危険なままであり、シェル コマンドも危険なままです。パーセントエンコーディングは入力検証、サニタイズ、セキュリティ境界ではありません。あくまで表現形式です。
デコードすると元のバイトが復元されるため、すべてのダウンストリーム コンテキストで生の値が再び認識されます。
コンテキスト固有のエスケープは、実際の保護が真に存在する場所です。 HTML コンテキストにはエンティティが必要です。小なりは < になり、大なりは > になり、引用符は " になり、アンパサンドは & になります。SQL コンテキストには、構造をデータから分離し、攻撃者の突破を防ぐパラメータ化されたクエリが必要です。シェル コンテキストには、単語の分割とグロビングを完全に回避する引数の配列が必要です。
各コンテキストには、正確には異なる危険な文字と異なるエスケープ ルールがあります。 HTML エンティティは SQL クエリでは無害ですが、そこでの保護には役に立ちません。バックスラッシュは、一部のデータベースでは SQL インジェクションを防止しますが、他のデータベースでは防止しません。シェルエスケープは引用スタイルによって異なります。開発者は、データの処理方法を選択する前に、宛先を理解する必要があります。
コンテキスト固有のエスケープ — マークアップの HTML エンティティ、SQL のパラメータ化されたクエリ、シェルの引数配列
うまくいった例: リンクからログ、ページまでペイロードをたどると、エンコードとエスケープが必要な場所がわかります。リンクには、クエリ パラメータとしてエンコードされた XSS ペイロードが含まれています。サーバーは、HTTP リクエスト本文でエンコードされた状態でそれを受信します。アプリケーションはクエリパラメータをデコードしてページに表示します。出力をエスケープしないと、ブラウザーはペイロードを HTML としてレンダリングして実行します。
同じパラメータがファイルに記録されている場合、ログ エントリにはデコードされたペイロードが明確に含まれています。 2 番目のアプリケーションはログを読み取り、再度デコードし、エスケープせずに HTML ページに挿入します。ペイロードが 2 回目に実行されます。各ステップで、コンテキストによって何が安全かが決まります。 URL デコードは安全でした。ファイルストレージは安全でした。しかし、エスケープなしのHTML出力は致命的でした。
成功した例: リンクからログ、ページまで 1 つのペイロードをたどる — エンコードされる場所、デコードされる場所、エスケープする必要がある場所
フィルター回避ツールとしてのエンコードは、攻撃者が二重エンコードを行い、16 進数の大文字と小文字を大幅に混合する理由を示しています。ファイアウォールが img タグを探す場合、攻撃者は %3Cimg を送信し、アプリケーションが一度デコードされることを期待しますが、ファイアウォールはデコードしません。検証で %3Cimg が拒否されたが、別のケースが許可された場合、同じバイトが同じペイロードにデコードされます。パターン マッチングのエンコードされた入力に依存するセキュリティは脆弱です。
デコードは正確で、絶対に予測可能でなければなりません。正規形式 (小文字の 16 進数、既知のエンコーディング) では一貫したポリシーが可能ですが、根本的な問題は解決されません。唯一信頼できるアプローチは、必要に応じてデコードを許可し、使用直前にコンテキスト固有の出力エスケープを適用することです。デコードは決して安全ではありません。送信にのみ必要です。
フィルター回避ツールとしてのエンコーディング — 攻撃者が二重エンコードして 16 進数を混合する理由、およびデコードが正確である必要がある理由
完全な XSS 防御には、データ フロー、各ステップで通過するコンテキスト、各コンテキストで何がエスケープされるのかを完全に理解する必要があります。 URL エンコードは 1 つの小さな部分であり、送信中にのみ構造を保持します。しかし、ワンピースはそれ自体で防御できるわけではありません。多くの開発者は、エンコードとサニタイズを混同しています。これは、どちらも文字の置換を必要としますが、まったく異なる重要な役割を果たすためです。
Web アプリケーション ファイアウォールはリクエスト ペイロード内のパターンを検出できますが、エンコードは単純なパターン マッチング手法を簡単に回避します。 WAF のチューニングは複雑であり、URL エンコードを超えています。信頼性の高い防御とは、アプリケーション コード内での出力エスケープと、特定のコンテキストや要件にとって意味のある入力検証との組み合わせです。
これでカバーされないもの — 完全な XSS 防御ガイドまたは Web アプリケーション ファイアウォールの調整
完全な XSS 防御には、データ フロー、各ステップで通過するコンテキスト、アプリケーション全体で各コンテキストをエスケープするために何が必要かを完全に理解する必要があります。 URL エンコードは 1 つの小さな部分であり、送信中にのみ構造を保持します。しかし、ワンピースはそれ自体で防御できるわけではありません。多くの開発者は、エンコーディングとサニタイズを混同しています。これは、どちらも文字の置換を必要としますが、開発全体を通じてまったく異なる重要な役割を果たすためです。
ペイロードをエンドツーエンドでテストして、プロセス全体を通じてエンコードとエスケープが真に重要となる場所を確認します。 %3Cimg%20src%3Dx%20onerror%3Dalert%281%29%3E を URL デコーダーに貼り付けて、マークアップのような文字列になることを確認します。次に、結果を HTML エンティティ エスケープに貼り付けて、安全なテキストになる様子を確認します。 2 つのツールでは、レイヤーが明確に表示されます。
要点: URL のエンコード、出力のエスケープ — URL エンコーダーおよびデコーダーと HTML エンティティ エスケープ機能が 2 つの異なるジョブに対して 1 つの製品内でどのように共存するか
重要なのは、エンコードとエスケープは、完全に異なるレイヤーで別個の関心事であるということです。 URL エンコードは、送信された構造のみを保護します。出力エスケープにより、レンダリングされたコンテンツが保護されます。正しくエンコードされた値は、HTML に到達するときに出力をエスケープする必要があります。正しくエスケープされた文字列は、URL に含められない限り、URL エンコードを必要としません。
適切なレイヤーに適切なディフェンスを誠実に適用します。 XSS 攻撃を阻止するために URL エンコードに依存しないでください。 URL 構造を保持するために HTML エスケープに依存しないでください。データ フローを理解し、各ステップで適切な変換を適用します。 URL エンコーダは、エンコードが何を行うかを理解するのに役立ちます。次に、出力ステップに HTML エンティティ エスケープを使用します。