Fastadmin前台Getshell漏洞分析
0x01 簡介
FastAdmin是一款基於ThinkPHP5+Bootstrap開發的極速后台開發框架。FastAdmin基於Apache2.0開源協議發布,目前被廣泛應用於各大行業應用后台管理。
影響版本:V1.0.0.20180911_beta - V1.0.0.20200506_beta
這里使用使用 V1.0.0.20200506_beta版本復現
0x02 漏洞分析
漏洞利用條件:usercenter=>true
漏洞文件:\application\index\controller\User.php
_empty
函數接收$name遍歷,直接將$name返回視圖中:return $this->view->fetch($name);
攻擊者可通過上傳文件,例如圖片,傳入$name
,fetch
模板進行php模板解析,導致getshell
。
\thinkphp\library\think\view\driver\Think.php
中的渲染fetch
實際使用的是thinkphp的解析模板函數,內容如下:
在驗證是否為模板文件,可以看到if (!is_file($template))
,來判斷是否存在,如果存在就將文件進行php解析。
關於is_file()
函數,可以參考:https://www.php.net/manual/zh/function.is-file.php
不同操作系統解析文件路徑的時候,linux和windwos is_file()
函數實現不一樣。
1、linux判斷is_file() /demo/../../../../test 如果demo目錄不存在,就會返回false;
windows下無論這個目錄是否存在,均會返回true;
2、在linux下,is_file()
函數判可用於判斷符號鏈接
3、在linux下,is_file
函數會受到權限的影響,當前用戶權限不足或父目錄沒有設置+x
權限時,is_file()
會返回false
4、windows系統里面/
和\
都可以使用,但是在linux下只能使用/
來分隔路徑,因此這會導致is_file()
在不同系統下的返回結果不一致
5、is_file()
判斷文件時,如果文件大小超過2^32時,會判斷失敗(PHP 的整數類型是有符號整型而且很多平台使用 32 位整型,對 2GB 以上的文件,一些文件系統函數可能返回無法預期的結果)
0x03 漏洞利用
首先在前台創建一個用戶,然后修改個人資料,上傳一張圖片馬
圖片馬
構造Payload:index/user/_empty?name=../../public/uploads/[圖片路徑]
訪問url:http://127.0.0.1:9999/fastadmin-v1.0.0.20200506/fastadmin/public/index/user/_empty?name=../../public/uploads/20200926/4a91d432904c0042bcd038ea96ad4947.jpg
is_file()
在linux
下/user
目錄不存在,所以無法利用,除非可以創建或存在,可以手工創建public
下創建user
目錄
windows
下通殺。
0x04 漏洞修復
目前官網下載的已更新,漏洞修復了
修復方案
打開application/index/controller/User.php
,找到大概第58行的_empty
方法,有以下兩種修復方法:
一種修復方法是直接移除_empty
方法,
另一種是將_empty
方法改為
public function _empty($name)
{
if (!preg_match("/^([a-z0-9_]+)$/i", $name)) {
$this->error(__('Invalid parameters'));
}
$data = Hook::listen("user_request_empty", $name);
foreach ($data as $index => $datum) {
$this->view->assign($datum);
}
return $this->view->fetch('user/' . $name);
}
官方修復網址:https://www.fastadmin.net/news/83.html
參考鏈接:https://github.com/karsonzhang/fastadmin/issues/73?spm=a2c4g.11174386.n2.3.428c1051tmy0pT