PHPコード監査:コマンド注入ホール


君の才能が
まだ君の野望を支えられない時
心を静めて勉強しなさい
コード監査学習オンライン実験は,いずれもCEが実操しながら整理したノートであり,後で読み返す際に素早く調べることができる.
目次
コマンド注入ホールの原因
概要
そうかんかんすう
コマンド注入脆弱性防止
コマンド注入ホールの原因
コマンド注入攻撃は、攻撃者によって特定のコンピュータプログラムにコードをインポートし、プログラムの実行プロセスまたは目的を変更するために使用され得る.PHPコマンド注入は、Webアプリケーションがユーザに提出したデータのフィルタリングが厳格でないため、ハッカーは特殊なコマンド文字列を構築することによって、データをWebアプリケーションに提出し、この方式を利用して外部プログラムやシステムコマンドを実行して攻撃を実施し、データやネットワーク資源などを取得することができない.
概要
PHPコマンド注入攻撃脆弱性はPHPアプリケーションでよく見られる脆弱性の一つです
国内で有名なPHPアプリ、例えばdiscuz!、dedecmsなどの大型プログラムはネットワーク上で命令注入攻撃の抜け穴があることが公表されており、ハッカーは命令注入攻撃の抜け穴を通じて迅速にウェブサイトの権限を得ることができ、さらに掛馬、釣りなどの悪意のある攻撃を実施することができ、影響と危害は非常に大きい.
同時に、現在PHP言語がWebアプリケーション開発に応用されている割合が大きく、Webアプリケーションプログラマーはコマンド注入攻撃の脆弱性の危害を理解しなければならない.
PHPコマンド注入とSql注入、PHPコード実行の脆弱性の違いに注意してください.
  • Sql注入脆弱性は、Sql文をバックグラウンド・データベースに注入して解析し、実行することです
  • PHPコード実行脆弱性は、PHPコードをWebアプリケーションに注入することであり、Webコンテナによって実行する
  • コマンド注入脆弱性とは、WindowsのCMDコマンド、linuxのBashコマンドなどの実行可能なシステムコマンドを注入し、
  • を実行することを意味する.
    関連関数:   system()、exec()、passthru()、shell_exec()、popen()、proc_open()、pcntl_exec()合計7つの関数.
     
    コマンド注入関数は、3種類に分けられます
    第1クラス関数system()、exec()、shell_exec()、passthru()を含むコマンド実行に直接入力して結果を返すことができ、システム()が最も簡単で、関数を出力する必要がなく、コマンド実行結果が自動的に印刷されるので、ここではシステム()関数について説明します.
    コードは、変数$idがget方式で伝達される変数名bashの変数値(値は文字列)を取得し、システム()関数に入力することをコマンドとして実行します.

    コード分析を通じて、私たちのpayloadを構築します:?bash=pwdの場合、ページは正常に現在の現在に戻る.phpファイルが存在するディレクトリのアドレス
    他のいくつかの関数は、exec()、shell_など、同じ理屈に似ています.exec()、passthru()関数は、自分で手動で試してみましょう.
    exec()関数

    sehll_exec関数

    passthru関数

     
    だいにクラスかんすう
    説明:
           resource popen ( string $command , string $mode )
    指定したcommandコマンドを派生して実行されるプロセスへのパイプを開きます.
  • 最初のパラメータ$commandはコマンドとして実行されます
  • 2番目のパラメータ$modeは実行モードを決定し、2つの値rまたはwがあり、
  • かを示す.
      popen()、proc_open()を含み、このような関数を使用してコマンドが入力されると、コマンドは実行されますが、実行結果は返されません.
    コードは次のとおりです.

    コード分析を通じて、私たちのpayloadを構築します:?bash=ifconfig >>/tmp/popen.txtの場合、ページは情報を返さないが、ifconfigから出力された情報を/temp下のpopenと書くことを意味する.txt里.
     
    だいさんクラスかんすう
    説明:
          • void pcntl_exec ( string $path [, array $args [, array $envs ]] )
             :
    
    • path :  path                                       
    (        #!/usr/local/bin/perl perl  ) 
    
    • args:   args                  
    
    • envs :  envs                     ,      key => value   ,key             ,value        

    $pathは実行可能プログラムのパスであり、perlまたはBashスクリプトの場合、ファイルヘッダに#!/bin/bashを付けて実行可能プログラムのパスを識別する必要があります.argsはargsに渡すことはpathプログラムに渡すパラメータを表し、$envsはこのプログラムを実行する環境変数です. 
    参照リンク:https://www.shiyanlou.com/courses/895
     
    コマンド注入脆弱性防止
    通常、ホワイトリストを使用してユーザー入力をフィルタリングすることができます.これは一般的な手段です.
    それ以外にいくつかの具体的なアドバイスがあります.
  • 外部コマンドの代わりにカスタム関数または関数ライブラリを使用する機能
  • escapeshellarg()関数を使用してコマンドパラメータを処理
  • safeを使用mode_exec_dir実行可能ファイルのパス
  • を指定
    私は自由を必要としないで、ただ彼女の夢を背負いたいだけです
    一歩一歩前進して、彼女がくれたのは永遠に重くない.