win2003 PHP服務器的突破新思路
2024-09-10 00:05:45
供稿:網友
在WIN2000中, 一個普通的PHP SHELL便能把它打垮; 在WIN XP, 即使Safe mode = off,你也無法用system() 等函數執行系統命令, 但是我們還能用com()函數進行突破;到WIN 2003,即使IIS 和PHP都是默認安裝,你用system(), com()也可能拿它沒轍。這時候你就不得不使用一些新的方法來進行突破了。
1、disable_functions的突破
在php -4.0.1以上的版本,php.ini里引入了一項功能disable_functions , 這個功能比較有用,可以用它禁止一些函數。比如在php.ini里加上disable_functions = passthru exec system popen 那么在執行這些函數的時候將會提示Warning: system() has been disabled for security reasons,同時程序終止運行。但是也不是沒有辦法執行系統命令了。因為php采用了很多perl的特性,比如還可以用(`)來執行命令,示例代碼如下:
<?$output = `ls -al`;echo "<pre>$output</pre>";?>
據說這個只有設成safe_mode為on才能避免,但上次我在一臺國外的服務器上使用的時候還是失敗了,人并不是什么時候都能那么走運的:)
2、dl()函數的應用
當任何PHP的內部命令執行數和''都無法使用的時候,可以嘗試dl(),該方法只能用于safe mode=off, 因為它在安全模式下是被禁用的。利用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();
// 轉換為易于理解的文本
$secs = floor($ticks / 1000);
$mins = floor($secs / 60);
$hours = floor($mins / 60);
$str = sprintf("You have been using your computer for:".
"/r/n %d Milliseconds, or /r/n %d Seconds".
"or /r/n %d mins or/r/n %d hours %d mins.",
$ticks,
$secs,
$mins,
$hours,
$mins - ($hours*60));
// 顯示一個消息對話框,只有一個 OK 按鈕和上面的開機時間文本
MessageBoxA(NULL,
$str,
"Uptime Information",
MB_OK);
?>
可惜我還沒有理解透徹dl()和W32api, 所以就不亂舉例子了, 免得誤導讀者。
3、COM 和 .Net(Windows)函數的應用
COM(Component Object Model,組件對象模型)是微軟開發的軟件規范,它用于開發面向對象的、編譯好的軟件組件,它允許把軟件抽象成為二進制的部件,主要運用于windows平臺。