DVWA-XSS (反射)

だいたい

「クロスサイト スクリプティング (XSS)」攻撃は、悪意のないスクリプトが、本来は安全で信頼できる Web サイトに注入される注入問題です。XSS 攻撃は、攻撃者が Web アプリケーションを使用して、通常はブラウザ側スクリプトの形式で悪意のあるコードを他のエンド ユーザーに送信するときに発生します。これらの攻撃を成功させる欠陥は非常に一般的であり、検証やエンコードを行わずにユーザー入力を出力に使用する Web アプリケーションのあらゆる場所で発生します。

攻撃者は XSS を使用して、何も疑っていないユーザーに悪意のあるスクリプトを送信する可能性があります。エンド ユーザーのブラウザは、そのスクリプトが信頼できるものではないことを知る方法がなく、JavaScript を実行します。悪意のあるスクリプトは、スクリプトが信頼できるソースからのものであると考えるため、ブラウザーが保持し、その Web サイトで使用する Cookie、セッション トークン、またはその他の機密情報にアクセスできます。これらのスクリプトは、HTML ページのコンテンツを書き換えることもできます。

XSS が反映されているため、悪意のあるコードはリモート Web アプリケーションに保存されず、ソーシャル エンジニアリング (電子メールやチャットによるリンクなど) が必要になります。


目的

何らかの方法で、ログインしているユーザーの Cookie を盗みます。


低レベル

低レベルでは、要求された入力を出力テキストに含める前にチェックしません。

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?>

 

これは、ユーザーが URL から渡したデータを処理し、ウェルカム メッセージを出力する PHP スクリプトです。前のコードと比較して、このスクリプトはセキュリティが向上しています。

`array_key_exists()` 関数を使用して、「name」が `$_GET` に含まれていること、および `$_GET[ 'name' ]` が `NULL` と等しくないことを確認します。このような検証を通じて、`$_GET[ 'name' ]` に実際にデータがあることを確認し、未定義の変数にアクセスしようとしたときのエラーを回避できます。

このスクリプトがユーザーの入力内容であり、表示される内容であることがわかります。

ネタバレ: ?name=<script>alert("XSS");</script>。

入力ボックスに「<script>alert("XSS");</script>」と入力し、「送信」をクリックしてアラートを表示します。

 

 

 

 

 

 

中級

開発者は、単純なパターン マッチを追加して、「<script>」への参照を削除して JavaScript を無効にしようとしました。

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello {$name}</pre>";
}

?>

これは、ユーザーによって URL から渡されたデータを取得し、ウェルカム メッセージを含む HTML コードを出力する PHP スクリプトです。

ただし、このスクリプトには、入力データのフィルタリングやサニタイズが実行されないという非常に重大なセキュリティ上の欠陥があり、潜在的な XSS 攻撃につながります。攻撃者は、URL パラメータに悪意のある JavaScript コードを挿入し、ユーザーがそのページにアクセスしたときにユーザーのブラウザで任意のスクリプトを実行する可能性があります。これにより、攻撃者はユーザーの認証 Cookie を盗んだり、ユーザーの入力をキャプチャしたり、他の悪意のあるサイトにリダイレクトしたりすることが可能になります。

`str_replace()` 関数を使用して `<script>` タグをクリアするだけでは、XSS 脆弱性を解決するには十分ではありません。`htmlspecialchars()` 関数やテンプレート エンジンを使用して JavaScript を生成するなど、適切なサニタイズおよび出力エンコード方法を使用する必要があります。

したがって、特殊文字のフィルタリング、HTML タグの HTML エンティティへのエスケープなど、ユーザー入力データの徹底的な検証とサニタイズを実行することをお勧めします。また、Web アプリケーションをこのような攻撃から保護するには、高度な Web アプリケーション ファイアウォール (WAF) とセキュリティ ジェンダー スキャナーを使用することをお勧めします。

 

中間スクリプトから見えるように、プログラムは単に <script> を空の文字列に置き換えます。 

ネタバレ: ケースに注意してください。

 低レベルの攻撃を入力し、アラート (「XSS」) を表示します

上級

開発者は現在、パターン「<s*c*r*i*p*t」を削除することですべての JavaScript を無効にできると考えています。

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello {$name}</pre>";
}

?>

これは、ユーザーが URL から渡したデータを処理する PHP スクリプトで、正規表現を使用してユーザーが入力したデータからすべての `<script>` タグを削除しようとします。以前のコードよりも安全です。

`array_key_exists()` 関数を使用して、「name」が `$_GET` に含まれていること、および `$_GET[ 'name' ]` が `NULL` と等しくないことを確認します。このような検証を通じて、`$_GET[ 'name' ]` に実際にデータがあることを確認し、未定義の変数にアクセスしようとしたときのエラーを回避できます。

以前とは異なり、このスクリプトは正規表現 `preg_replace()` 関数を使用し、ユーザー入力データ内のすべての `<script>` タグを削除します。この方法で入力データをサニタイズすると、攻撃者がユーザーのブラウザに任意の JavaScript コードを挿入できないため、XSS 攻撃のリスクが軽減されます。

ただし、攻撃者はさまざまな手法を使用してそのようなフィルターを回避できるため、この方法は完全に信頼できるわけではありません。実際のアプリケーションでは、Web アプリケーションのセキュリティを確保するために、より多くのサニタイズ方法を使用する必要があります。

したがって、ユーザー入力データを処理するときに適切な検証とサニタイズを実行し、Web アプリケーションを XSS 攻撃から安全に保つことができるセキュリティ対策を使用することをお勧めします。たとえば、入力データ内の HTML タグをサニタイズし、安全な HTML エンティティにエスケープする HTML Purifier のようなライブラリを使用します。

 

スポイラー: HTML イベント。

Hello > を表示するだけの低レベル スクリプトを入力します。 

 

無理なレベル

「 htmlspecialchars()」などの組み込み PHP 関数を使用すると、入力の動作を変更する値をエスケープできます。

<?php

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello {$name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken();

?>

これは、URL からユーザーによって渡されたデータを処理する PHP スクリプトです。最初に Anti-CSRF トークンの有効性を検証し、次に `htmlspecialchars()` 関数を使用してユーザー入力データを HTML エンティティにエスケープし、 XSS 攻撃。

`array_key_exists()` 関数を使用して、「name」が `$_GET` に含まれていること、および `$_GET[ 'name' ]` が `NULL` と等しくないことを確認します。このような検証を通じて、`$_GET[ 'name' ]` に実際にデータがあることを確認し、未定義の変数にアクセスしようとしたときのエラーを回避できます。

さらに、このスクリプトには、Anti-CSRF トークンの関連コードも含まれています。`checkToken()` 関数は、CSRF 攻撃を防ぐために、ユーザーによって送信されたトークンがセッションに保存されているトークンと同じであるかどうかを検証するために使用されます。2 つのトークンが異なる場合は、指定された URL `index.php` にリダイレクトします。`generateSessionToken()` 関数は、新しいセッション トークンを生成して保存するために使用されます。

このアプローチでは、Web アプリケーションとユーザーを XSS および CSRF 攻撃からある程度保護できますが、完全に信頼できるわけではありません。アプリケーションのセキュリティを確保するために、ユーザー入力データを処理するときは、追加のセキュリティ対策とサニタイズ方法を適用することをお勧めします。同時に、セキュリティの脆弱性のテストと評価を実施して、潜在的なセキュリティのギャップを検出して解決することも推奨されます。

おすすめ

転載: blog.csdn.net/seanyang_/article/details/131169014