【P4】WindowsでのDVWAの構築とコマンドインジェクションの脆弱性の解説


Windows 上で DVWA を構築するための 6 つの手順、非常に有害な脆弱性 - コマンド インジェクション、DVWA 文字化け問題の解決、コマンド インジェクション コマンド インジェクション ソリューション、防御脆弱性 低、コマンド インジェクション脆弱性防御 中、コマンド インジェクション脆弱性防御 高、コマンド インジェクション 抜け穴に対する防御は不可能。


1. Windows での DVWA の構築

1.1. DVWA射撃場の建設

DVWA は OWASP によって公式に書かれた PHP Web サイトで、Web サイトによくあるさまざまな脆弱性が含まれており、攻撃と修復方法を学ぶことができます

1.2、DVWA を迅速に構築するための 6 つのステップ

1.2.1. PHPstudy をダウンロードしてインストールします: http://public.xp.cn/upgrades/PhpStudy2018.zip

(1) ダウンロードリンク: http://public.xp.cn/upgrades/PhpStudy2018.zip

直接点击下载链接跳转到网页直接即可下载;也可复制粘贴到网址中直接下载

Baidu ネットワーク ディスクのダウンロード リンク: https://pan.baidu.com/s/1vVVAbyUCT6XoK4NguMDrSA?pwd=jzib

抽出コード:jzib

建议使用网址下载链接,百度网盘下载慢

(2) ダウンロード後、解凍してPhpStudy2018.exe実行ファイルを入手します。

ここに画像の説明を挿入

(3) PhpStudy2018.exeをダブルクリックし、パスを選択して「はい」をクリックするとインストールが完了します。

ここに画像の説明を挿入

1.2.2. 解凍したDVWAのオリジナルコードをphpstudyインストールディレクトリのWWWフォルダに配置します。

(1) DVWA ソースコードをダウンロード: https://github.com/digininja/DVWA/archive/master.zip

直接点击下载链接跳转到网页直接即可下载;也可复制粘贴到网址中直接下载

Baidu ネットワーク ディスクのダウンロード リンク: https://pan.baidu.com/s/1qV4RMbJRFuGHPXKqPFRU9A?pwd=g2bm

抽出コード: g2bm

建议使用网址下载链接,百度网盘下载慢

(2) ダウンロード後、圧縮パッケージをphpstudyインストールディレクトリのWWWフォルダ配下に配置します。

  • …\phpStudy\PHPTutorial\WWW

ここに画像の説明を挿入

(3) ダウンロードが完了したら解凍します。

ここに画像の説明を挿入

(4) 解凍が完了したら、名前を変更できます。

ここに画像の説明を挿入

1.2.3. DVWA/config ディレクトリに入り、config.inc.php.dist の最後の .dist を削除します。

  • …\phpStudy\PHPTutorial\WWW\DVWA\config

ここに画像の説明を挿入

1.2.4. 新しく名前変更された config.inc.php ファイルを開き、db_user および db_password root root を変更します。

(1) 開く

ここに画像の説明を挿入

(2)、db_user と db_password の root root を root に変更して保存します。

ここに画像の説明を挿入

1.2.5. ブラウザ アクセス: http://127.0.0.1/DVWA/setup.php、下部にある [データベースの作成] をクリックします。

127.0.0.1: ローカル ループバック アドレス、自分自身にアクセスします

(1) phpStudyのインストールパスにあるphpStudy.exeをダブルクリックして起動します。

ここに画像の説明を挿入

(2)、ローカルブラウザアクセス127.0.0.1

ここに画像の説明を挿入

図に示すように、Hello World が表示され、構成が成功したことが示されます。

(3)、DVWAにアクセスし、ブラウザにhttp://127.0.0.1/DVWA/setup.phpと入力します。

ここに画像の説明を挿入

1.2.6. データベースの作成とログイン

(1) 「データベースの作成/リセット」をクリックしてデータベースを作成します。

ここに画像の説明を挿入

(2)「ログイン」をクリックします

ここに画像の説明を挿入

(3)、ユーザー名admin、パスワードpasswordを入力し、「ログイン」をクリックしてdvwaにログインします。

ここに画像の説明を挿入

(4)、ログイン成功後のページ

ここに画像の説明を挿入

2. 大きな被害をもたらす脆弱性 – コマンドインジェクション

一般に、この種の脆弱性は、アプリケーション システムが設計からユーザーにリモート コマンド操作用の指定されたインターフェイスを提供する必要があるために発生します。たとえば、一般的なルーター、ファイアウォール、侵入検知デバイスなどの Web 管理インターフェイスでは、通常、ユーザーには操作の ping が提供されます。ユーザーは Web インターフェイスからターゲット IP を入力し、送信後、バックグラウンドで IP アドレスに対して ping テストが実行され、テスト結果が返されます。ただし、この機能を完了するときに設計者が厳格なセキュリティ制御を実装していない場合、攻撃者がこのインターフェイスを介して悪意のあるコマンドを送信し、バックグラウンドでの実行を許可して、バックグラウンド サーバーのアクセス許可を取得する可能性があります。

ここに画像の説明を挿入

  • cmd1|cmd2: cmd1 が正常に実行されたかどうかに関係なく、cmd2 が実行されます。

  • cmd1;cmd2: cmd1 が正常に実行されたかどうかに関係なく、cmd2 が実行されます。

  • cmd1&cmd2: cmd1 が正常に実行されたかどうかに関係なく、cmd2 が実行されます。

  • cmd1||cmd2: cmd1 が失敗した場合にのみ cmd2 を実行します

  • cmd1&&cmd2: cmd1 が正常に実行された後にのみ実行します

注:cmd为command命令的意思

ここに画像の説明を挿入

3. 防御の抜け穴の防御力が低い

一般的に使用される cmd コマンド:

  • whoami: 現在のユーザー名を表示します

  • ipconfig:ネットワークカード情報の表示

  • シャットダウン -s -t 0: シャットダウン

  • net user [ユーザー名] [パスワード] /add: ユーザー名が username、パスワードがpasswordである新しいユーザーを追加します

  • type [file_name]: filename ファイルの内容を表示します

(1) [DVWA セキュリティ] セキュリティ設定をクリックし、セキュリティ レベルを低に下げ、防御を行わず、[送信] をクリックします。

ここに画像の説明を挿入

2. [コマンドインジェクション] コマンドインジェクションをクリックし、[IP アドレスを入力してください] に 127.0.0.1 を入力します。

ここに画像の説明を挿入

3. 「送信」ボタンをクリックします。

ここに画像の説明を挿入

写真の通り文字化けしていますが、海外で開発されたサイトであり、デフォルトのエンコードがWindowsと異なるため、文字化けを気にせず実行してください。

4. [IP アドレスを入力してください] に「127.0.0.1&whoami」と入力し、[送信] をクリックします。

ここに画像の説明を挿入

図に示すように、一番下の行には「desktop-v3q1n78\admin」が追加されており、admin はユーザー名です。cmdを使用してローカルで確認できます

ここに画像の説明を挿入

5. [IP アドレスを入力してください] に「127.0.0.1&ipconfig」と入力し、[送信] をクリックして送信します。

ここに画像の説明を挿入

図に示すように、ローカル cmd に ipconfig を入力した結果を示します

ここに画像の説明を挿入

6. このウェブサイトに欠陥がある可能性があります。欠陥の原因を確認するにはどうすればよいですか?

(1)、下部にある「ソースを表示」をクリックしてソースコードを表示します。

ここに画像の説明を挿入

(2) 図に示すように、新しいウィンドウが開き、ソースコードが表示されます。

ここに画像の説明を挿入


<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    
    
    // Get input
    $target = $_REQUEST[ 'ip' ];  // 将输入的 ip 赋值给变量 $target

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    
    
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );  // shell_exec:通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回;( 'ping  ' . $target ):127.0.0.1&whoami
    }
    else {
    
    
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{
      
      $cmd}</pre>";
}

?>

7、输入 127.0.0.1&shutdown

注: このコマンドを入力すると、コンピュータは自動的にシャットダウンされます。

4. DVWAの文字化け問題を解決する

...\phpStudy\PHPTutorial\WWW\DVWA\dvwa\includes ディレクトリに dvwaPage.inc.php ファイルがあります。ファイルを開いて 322 行目を変更し、UTF-8 を GBK または GB2312 に変更します。

1. テキストをダブルクリックして開きます

ここに画像の説明を挿入

2. 図のように変更して保存します。

ここに画像の説明を挿入

3. 変更が成功したら、再起動する必要はなく、そのまま使用してください。


五、コマンドインジェクション コマンドインジェクションソリューション

コマンドの実行を防ぐ最も効率的な方法は、コマンドの連結をフィルタリングすることです。

  • cmd1|cmd2: cmd1 が正常に実行されたかどうかに関係なく、cmd2 が実行されます。

  • cmd1;cmd2: cmd1 が正常に実行されたかどうかに関係なく、cmd2 が実行されます。

  • cmd1&cmd2: cmd1 が正常に実行されたかどうかに関係なく、cmd2 が実行されます。

  • cmd1||cmd2: cmd1 が失敗した場合にのみ cmd2 を実行します

  • cmd1&&cmd2: cmd1 が正常に実行された後にのみ実行します

l、;、&、ll、&&:将这些符号替换成空,或判断用户输入这些符号就终止执行

6. コマンドインジェクションの脆弱性防御媒体

1. 「DVWA セキュリティ」セキュリティ構成をクリックし、セキュリティ レベルを「中」に調整し、「送信」をクリックします。

ここに画像の説明を挿入

2. [コマンド インジェクション] コマンド インジェクションをクリックし、一番下まで引いて、[ソースの表示] をクリックします。

ここに画像の説明を挿入

3. 新しい Web ページを開いてソース コードを表示します。

ここに画像の説明を挿入


<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    
    
    // Get input
    $target = $_REQUEST[ 'ip' ];  // 将输入的 ip 赋值给变量 $target

    // Set blacklist
    $substitutions = array(
        '&&' => '',
        ';'  => '',
    );  // 如果用户输入内容包含有&&或;则将符号变为空

    // Remove any of the characters in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );  // str_replace字符串替换,如果有&&或;则将符号删除

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    
    
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );  // shell_exec:通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回;( 'ping  ' . $target ):127.0.0.1&whoami
    }
    else {
    
    
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );
    }

    // Feedback for the end user
    echo "<pre>{
      
      $cmd}</pre>";
}

?>

DVWA 中防御での && と ; のフィルタリングは、他のシンボルの通常の使用には影響しません。

7、コマンドインジェクションの脆弱性防御力が高い

1. [DVWA セキュリティ] セキュリティ設定をクリックし、セキュリティ レベルを高に調整して、[送信] をクリックします。

ここに画像の説明を挿入

2. [コマンド インジェクション] コマンド インジェクションをクリックし、[IP アドレスを入力してください] に 127.0.0.1||ipconfig と入力します。

  • 127.0.0.1||ipconfig

ここに画像の説明を挿入

図に示すように、 || を使用すると、 || が処理されたことを示すエラーが報告されます。

3. 一番下まで引っ張って、「ソースを表示」をクリックします。

ここに画像の説明を挿入

4. 新しい Web ページを開いてソース コードを表示します。

ここに画像の説明を挿入

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    
    
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $target = $_REQUEST[ 'ip' ];
    $target = stripslashes( $target );

    // Split the IP into 4 octects
    $octet = explode( ".", $target );

    // Check IF each octet is an integer
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
    
    
        // If all 4 octets are int's put the IP back together.
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

        // Determine OS and execute the ping command.
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    
    
            // Windows
            $cmd = shell_exec( 'ping  ' . $target );
        }
        else {
    
    
            // *nix
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
        }

        // Feedback for the end user
        echo "<pre>{
      
      $cmd}</pre>";
    }
    else {
    
    
        // Ops. Let the user name theres a mistake
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?>

八、コマンドインジェクション脆弱性防御不可能

1. [DVWA セキュリティ] セキュリティ設定をクリックし、セキュリティ レベルを不可能な高レベルに調整し、[送信] をクリックします。

ここに画像の説明を挿入

2. [コマンド インジェクション] コマンド インジェクションをクリックし、一番下まで引いて、[ソースの表示] をクリックします。

ここに画像の説明を挿入

3. 新しい Web ページを開いてソース コードを表示します。

ここに画像の説明を挿入


<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    
    
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $target = $_REQUEST[ 'ip' ];  // 将输入的内容赋值给变量 $target
    $target = stripslashes( $target );

    // Split the IP into 4 octects
    $octet = explode( ".", $target );

    // Check IF each octet is an integer
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
    
    
        // If all 4 octets are int's put the IP back together.
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

        // Determine OS and execute the ping command.
        if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
    
    
            // Windows
            $cmd = shell_exec( 'ping  ' . $target );
        }
        else {
    
    
            // *nix
            $cmd = shell_exec( 'ping  -c 4 ' . $target );
        }

        // Feedback for the end user
        echo "<pre>{
      
      $cmd}</pre>";
    }
    else {
    
    
        // Ops. Let the user name theres a mistake
        echo '<pre>ERROR: You have entered an invalid IP.</pre>';
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?>
$target = stripslashes( $target );

    // Split the IP into 4 octects
    $octet = explode( ".", $target );

    // Check IF each octet is an integer
    if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
    
    
        // If all 4 octets are int's put the IP back together.
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

// 1、stripslashes:去除用户输入的\
// 2、explode:把用户输入的数据根据.分开,比如输入 127.0.0.1 会被分成四个部分,分别是 1270 0 1
// 3、分别判断分成的四个部分是不是数字,127是不是?0是不是?0是不是?1是不是?有不是数字的直接不允许访问;判断是否是4个
// 4、把验证完是数字的四个数字再用.拼接起来,变成正常的 IP 127.0.0.1

おすすめ

転載: blog.csdn.net/qq_45138120/article/details/131358169