PHPコードの監査:コマンドインジェクションの脆弱性

オリジナルリンク: https://blog.csdn.net/God_XiangYu/article/details/97822937

ときにあなたの才能

あなたは野心にハングアップする余裕がない場合には

その後、学習を停止する必要があります


      クイックリファレンスを探すために都合のよいときに、後でノートを仕上げながら、CEは、実際の操作している間、コード監査は、オンライン、実験を学びます。

ディレクトリ

理由コマンドインジェクションの脆弱性結果

簡単な紹介

相関関数

コマンドインジェクションの脆弱性対策


理由コマンドインジェクションの脆弱性結果

      コマンド・インジェクション攻撃は、オペレーティング・プロセスまたはプログラムオブジェクトを変更するには、コンピュータプログラムに固有のコードをインポートするために、攻撃者が使用することができます。PHPコマンドインジェクションは、Webアプリケーションのフィルタに使用者が提出したデータによる重要ではなくて、ハッカーの実施形態を導くことができるが、特別なコマンド文字列、Webアプリケーションに提出されたデータ、および外部プログラムを実行する方法を使用するか、システムによって構成された実施例をコマンド攻撃、データやネットワークリソースへの不正アクセス

簡単な紹介

PHPコマンドインジェクションの脆弱性は、一般的なPHPアプリケーションの脆弱性であります

このよう清華として有名PHPアプリケーションは、!、コマンドインジェクションの脆弱性がある前に、ネットワーク内Dedecms他の大規模なプログラムが発表された、ハッカーは、コマンドインジェクションの脆弱性からWebアクセス権、およびその後、馬をぶら下げの実装、フィッシングやその他の悪意のある攻撃に素早くアクセスすることができ、インパクトと害は巨大です。

一方、より大きな割合で使用されている現在の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つのカテゴリに分類コマンドインジェクション機能、

最初の関数

       含めsystem()、exec()、shell_exec()、passthru()、我々は最初のシステムを説明するので、ここでは、コマンドの実行に直接渡すことができ、システムは、()最も簡単な、ない出力機能、結果は自動的にコマンドを出力します結果を返す()関数

次のコードは、変数$ idは変数名bashの変数の値(文字列値)で渡さゲットし、実行するコマンドとしてシステム()関数を渡します:


  
  
  1. <?phpの
  2. ます$ id = $ _GET [ 'バッシュ' ];
  3. システム("$のID");
  4. ?>

 コード分​​析を通じて、我々は、ペイロードを構築bashは= PWD、ページが正常に現在の.phpファイルアドレスの現在のディレクトリに戻ることができるようになります場合は:?です

 いくつかの他の同様の機能などのexec()、もしくはshell_exec()、パススルー()関数と同じトークンは、手動でそれを自分を試してみてください。

EXEC()関数


  
  
  1. <?phpの
  2. ます$ id = $ _GET [ 'バッシュ' ];
  3. $ GET = EXEC("$のID");
  4. エコー $取得します。

sehll_exec機能


  
  
  1. <?phpの
  2. ます$ id = $ _GET [ 'バッシュ' ];
  3. $ GET =もしくはshell_exec("$のID");
  4. エコー $取得します。

パススルー機能


  
  
  1. <?phpの
  2. ます$ id = $ _GET [ 'バッシュ' ];
  3. $ GET =パススルー("$のID");
  4. エコー $取得します。

 

関数の第二のクラス

説明:

       リソースのpopen(文字列$コマンド、文字列$モード

      パイプライン処理に開放指示は、プロセスが生成された所定のコマンドコマンドの実行に由来します

  • 最初のパラメータ  $コマンドはコマンドとして実行されます
  • 第二引数 $モードの決定実行モードでは、そこに二つの値があるr か  w かどうかを示すために

 

       含めpopen()、proc_open()、コマンドを着信コマンドの実行を、これらの機能を使用する場合、が、結果を返しません。

以下のコードを、


  
  
  1. <?phpの
  2. $ bashの= $ _GET [ 'バッシュ' ];
  3. popenの("$ bashの"'R' )。

 コード分​​析を通じて、我々は、ペイロードを構築>> /tmp/popen.txtをifconfigしたときにbashは=、ページが情報を返しませんが、意味はコマンド情報のifconfig出力の私達のラインは、下のパス/一時を書き込みされ:?ですpopen.txt年。

 

関数の第三のクラス

説明:

      •無効pcntl_exec(文字列$パス[、配列$ argsを[、配列$ ENVS]])


  
  
  1. 与えられたパラメータは、プログラムを実行します。
  2. •パス:パスは、実行可能バイナリファイルのパスでなければなりませんまたはスクリプトファイルの1行目に実行可能ファイルのヘッダへのパスを指定し
  3. (このようなファイルの最初の行としてある#!は/ usr / local / binに / perlのperlのスクリプト)
  4. •引数:引数は、プログラムの文字列配列に渡されるパラメータです
  5. •ENVS:ENVS、環境変数としてプログラムに渡される文字列の配列で、この配列は、重要な環境変数に代わって配信されるキー=>値名書式、である、環境変数値の値を示し、

$パスは、実行可能プログラムのパスである、またはPerlのスクリプトバッシュ場合、あなたはファイルヘッダに追加する必要があります  #!/bin/bashに渡される引数を表し、$のENVS経路プログラムは、このプログラムの実装である実行可能ファイルのパスを識別するために、引数は引数への転送を表し、環境変数。 

参考リンク:https://www.shiyanlou.com/courses/895

 

コマンドインジェクションの脆弱性対策

通常、我々は普遍的な手段である、ユーザー入力をフィルタリングするためにホワイトリストを使用することができます。

また、いくつかの具体的な推奨事項があります。

  1. 外部コマンドを置き換えるために関数ライブラリを使用するか、カスタム関数

  2. コマンドパラメータを処理するためにescapeshellarg()関数を使用します

  3. 指定された実行可能パスsafe_mode_exec_dir使用します


私はちょうど彼女の夢を運んで、自由を必要としません

前進する一歩を移動し、彼女は重いことはありません


 

おすすめ

転載: blog.csdn.net/bylfsj/article/details/102731907