記一次對TP的另一種滲透想法
前言
因為前陣子發表了一篇關于Thinkphp的文章到公眾號里面,南5給我扔過來一個站讓我試試。
初步想法
首先看了一下這個站,長這樣

典型的金融詐騙類網站,第一個想法就是暴破,隨便試了一個用戶名和密碼,抓包看了看,沒有枚舉,沒有枚舉。

可能過程比較不好做,但是我想既然這個站能給到我,說明還是有可以利用的地方。
繼續探測
對目標域名進行目錄隨意的書寫,發現報錯了,竟然是Thinkphp的Debug,版本為5.0.5

竟然是5.0.5的版本,還開放了Debug,那么我的第一反應就是嘗試這個版本的公開rce的exp,如下描述:
waf對eval進行了攔截,禁止了assert函數對eval函數后面的括號進行了正則過濾,對file\_get\_contents函數后面 的括號進行了正則過濾。
http://website/?%20s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&va%20rs[1][]=2.php&vars[1][1]=
試了一下這個exp,直接被攔,還是被某免費版的防火墻攔的。

這也就是說明這站的基本防護有防火墻,需要繞過防火墻。公開的exp是不行了,那么就試試TP最常見的以POST方式傳參的exp。
_method=__construct&method=get&filter=call_user_func&get[]=phpinfo

竟然成了,也就是說是可以rce的。那么接下來就有一點要看了,看看PHP有沒有開啟 disable_function ,或者說 disable_function 有沒有禁用掉更多的函數。
我把禁用的函數全部列出來了,基本上常見的都沒了:
passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_al ter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcnt l_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued, pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_ge t_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_ex ec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv
失敗的日志包含
既然 disable_function 禁用掉這么多的函數,那么就用我之前遇到的一種方法來嘗試一下:利用文件包含的方法, 包含出日志,最后往日志中寫馬。首先看看能不能包含日志,我用 think\__include_file 函數進行包含,因為日志的路徑在Debug頁面中本來就有。

成功包含出日志了。下一步往日志里面寫馬,需要注意的是不能寫一句話的馬,需要進行加密,推薦哥斯拉

下面進行日志包含

“很好”,沒有出來,直接報錯,看來這個方法是沒有把日志寫進去的。
file_put_contents
這個函數的解釋如下:
file_put_contents() 函數把一個字符串寫入文件中。該函數訪問文件時,遵循以下規則:如果設置了 FILE_USE_INCLUDE_PATH,那么將檢查 *filename* 副本的內置路徑 如果文件不存在,將創建一個文件 打開文件 如果設置了 LOCK_EX,那么將鎖定文件 如果設置了 FILE_APPEND,那么將移至文件末尾。否則,將會清除文件的內容 向文件中寫入數據 關閉文件并對所有文件解鎖 如果成功,該函數將返回寫入文件中的字符數。如果失敗,則返回 False。
也就是說不存在的文件話,會創建一個文件,然后還可以將文件內容追加到文件末尾。這個函數沒有在禁用函數里 面。此時,南5說讓我考慮一下session。這個我第一次聽說,于是,我問了一下度娘,有一篇文章有講到如何用session 來繞過禁用函數。
session包含直接getshell
首先,我利用上面講到的函數來將馬寫入session中,馬通過base64加密后再用url進行加密,在此我用的哥斯拉的馬

按道理應該在網站根目錄下創建了一個名字為1.php的文件,那么我們先包含一次看看

成功包含出了session。這個時候直接訪問根目下的1.php,成功解析了。

上哥斯拉直接連,成功

本次實戰不僅僅為了getshell,也是為了學習利用tp5的不同的getshell方法。尤其是對session包含的方法,體會到了不一樣的感覺。