Webセキュリティをやりたい人は、Webセキュリティを使って学ぶのが一番良いのですが、根本を考えると、私たちが求めているのは魚ではなく釣りです。中国では、さまざまな PHP プログラムのバージョン 1.0 とバージョン 2.0 が雨後の筍のように現れていますが、誰もがいくつかの有名な cms、フォーラム、ブログ プログラムに注目しています。 PHP プログラマーや Web マスターは、サーバーの要塞設定に依存するだけでなく、PHP プログラム自体のセキュリティについても理解する必要があります。
PHP のセキュリティは単なるインジェクションとクロスサイトにすぎないと言う人もいます。それは完全に間違っています。もしこれが事実であれば、magic_quotes_gpc またはサーバーの一部のセキュリティ設定によって完全に機能しなくなります: (.I What今日話したいのはインジェクションやクロスサイトではなく、PHP プログラムに存在するセキュリティの詳細です。
一部の関数のフィルタリングに注意してください。
include()、require()、fopen()、fwrite()、readfile()、unlink()、eval() などの関数とそのバリアント関数はプログラムで使用されますが、実用的であるという意味ではありません。心配しないでください。もっと心配する必要があります:)
1.include()、require()、および fopen()、include_once()、require_once() はすべてリモートでファイルを呼び出すことができます。それらの害については、Googleで検索するとよくわかりますが、呼び出しに含まれる変数がフィルタリングされていなければ、任意のファイルを含めて実行できることがわかります。たとえば、print.php を見てください。
…
if (empty ($bn) ) { //変数 $bn が空かどうかを確認します
include (“$cfg_dir/site_${site}.php ”); // $cfg_dir パスに site_${site}.php を含めます
…
$cfg_dir ディレクトリが存在するかどうかに関係なく、$site 変数は存在しないため、自然に $site 変数を使用できます。全然チェックされてた。変数 $site を指定してリモート ファイルを呼び出すことも、ローカル ファイルを指定することもできます。これにより、次のように PHP ステートメントを含むファイルがインクルードされて実行されます。 > リストされたファイル ディレクトリは、通常、phpwind や bo-blog の以前の脆弱性のように、いくつかの管理者ファイルを含めて権限を昇格するように拡張することもできます。 php.ini のallow_url_fopen を off に設定してファイルのリモート使用を禁止し、open_base_dir を使用してディレクトリ外のファイルの使用を禁止することに加えて、どのファイルのみを含めることができるかを事前に宣言する必要もあります。ここでは詳細に立ち入りません。
2.fopen()、file()、readfile()、openfile() なども特に注意を払う必要がある領域です。関数自体はファイルを開くことだけが目的ですが、変数を徹底的にフィルタリングしないとソースコードが漏洩してしまいます。このような機能テキスト フォーラムは数多くあります。
…
$articlearray=openfile(“$dbpath/$fid/$tid.php”); // パス $dbpath/$fid
$topic_detail=explode にある $tid.php ファイルを開きます。 ( "|",$articlearray[0]); // 区切り文字 | を使用して投稿の内容を読み取ります
...
これは ofstar の read.php の以前のバージョンです。 fid と $tid にはフィルタリングがなく、$tid はファイル送信として指定されており、元のコードが漏洩します。このように。
$tid の末尾に php が付くので、index を直接書きます。これはほんの一例ですので、見てみましょう。
3. fwrite() とそのバリアント関数の抜け穴について考えると、ユーザーが送信した文字がフィルターされなければ、PHP バックドアを作成することは不可能ではないことが想像できます。
4.unlink() 関数。少し前まで、この関数は phpwind でファイルを任意に削除するために使用されていました。削除するかどうかを決定するための変数のフィルタリングはありません。任意のファイルの変数を削除できます。
5.eval()、preg_replace() 関数、それらの機能は PHP コードを実行することです。文字列が何らかの方法でフィルタリングされていない場合、どうなるでしょうか。よくある文で考えてみましょう。この記事の PHP トロイの木馬は eval() 原則に基づいて作られたものではないでしょうか?
6. system() などのシステム関数については、php.ini でシステム関数を無効にすることも良い考えですが、一部のプログラムで必要な場合はその必要はありません。使われる?前回見た美しいphpの写真集のように。さらに、popen()、proc_open()、および proc_close() 関数には特別な注意を払う必要がありますが、コマンドの実行後に直接出力はありませんが、これはハッカーにとって有益だと思いますか?ここで、PHP は 2 つの関数、escapeshellarg() とscapeshellcmd() を提供します。これらの 2 つの関数は、システム関数呼び出し攻撃 (フィルタリング) に対抗するために使用されます。
害については、フォーラムを見てみましょう。 prod.php
07 $doubleApp = isset($argv[1]); //変数 $doubleApp
…
14 if ( $doubleApp ) //if ステートメント
15 {
16 $appDir = $argv[1] // $appDir を初期化します
17 system(“mkdir $prodDir/$appDir” ); //Use システム関数 system は、ディレクトリ $prodDir/$appDir を作成するために使用されます
は、もともと $prodDir/$appDir ディレクトリを作成するために使用されていました。その後、プログラムは $argv を検出するだけのようです。 [1] が存在しますが、必要な $argv [1] のフィルタリングのサポートが不足している場合は、次のようにすることができます
/prod.php?argv[1]=|ls -la または /prod.php?argv[1]= |cat /etc/passwd
(ここでの区切り文字 | は、複数のコマンドを実行できる UNIX パイプライン パラメーターです。)
この時点で、一般的な脆弱性の種類について少し知っておく必要があります。
したがって、サーバー側の設定だけに頼るのではなく、バックグラウンド プログラムに注意を払うことが最善です。一般的には、サーバーを介してサイトをセットアップする方が良いでしょう。しかし、データベースを使用した多くの操作は、制御するのがそれほど簡単ではありません。