中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

getshell怎么在thinkphp條件限制實現

發布時間:2020-12-10 16:03:12 來源:億速云 閱讀:351 作者:Leah 欄目:開發技術

getshell怎么在thinkphp條件限制實現?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

先說說2020_n1CTF的web題Easy_tp5復現問題。

這個題在保留thinkphp的RCE點的同時,并且RCE中ban掉許多危險函數,只能允許單參數的函數執行。對于現在在網絡中流傳的文件包含的點也增加了限制。

smile yyds!

先說一下這個題限制條件:

  • thinkphp版本:5.0.0
  • php版本:7
  • 對于包含文件增加了限制

getshell怎么在thinkphp條件限制實現

ban掉所有的單參數危險函數

getshell怎么在thinkphp條件限制實現

設置open_basedir為web目錄

getshell怎么在thinkphp條件限制實現

設置僅在public目錄下可寫

getshell怎么在thinkphp條件限制實現

在TP5.0.0的中,目前公布的只是存在利用Request類其中變量被覆蓋導致RCE。如果ban掉單參數可利用函數那么只能用文件包含,但是文件包含做了限制不能包含log文件,所以只能從別的方面入手。

這些限制都太大了,所以需要想辦法去上傳一個shell來完成后續繞disable_function。

首先TP5.0.0目前只存在通過覆蓋Request中的某些變量導致RCE,其余細節不再贅述,我們看看大概代碼執行點在哪里。

getshell怎么在thinkphp條件限制實現

call_user_func是代碼執行點,我們基本上所有PHP自帶的可利用函數基本被ban掉,所以我們需要從自寫的函數調用來入手,首先我們需要看下這個點。可回調函數不僅僅指的是簡單函數,還可以是一些對象的方法,包括靜態方法。

getshell怎么在thinkphp條件限制實現

方法一 thinkphp\library\think\Build::module

我們可以這樣通過調用這個類的靜態方法module,來實現寫文件的操作。

getshell怎么在thinkphp條件限制實現

我們先看看這個該怎么走,我們看到這個mkdir是在application創建目錄,但是由于權限問題肯定無法創建。根據TP報錯即退出的機制從而中斷執行。那么我們可以通過../public/test來創建目錄。

我們會進入到buildhello函數中。

getshell怎么在thinkphp條件限制實現

走完流程發現我們可以在public創建了一個test模塊,同樣看到test/controller/Index.php中我們所寫的../public/test保存了下來那么我們就繞過,但是執行完之后會發現一些語法錯誤導致代碼不能執行。

getshell怎么在thinkphp條件限制實現

由于這部分內容可控那我們就把他變得符合語法執行,我們可以這么做test;eval($_POST[a]);#/../../public/test;,這樣就符合語法。

getshell怎么在thinkphp條件限制實現

但是還有一個問題需要解決,就是我們這樣的payload會設置一個不存在目錄從而可以符合語法并且加入eval函數。但是現在還存在一個跨越不存在目錄的問題。

getshell怎么在thinkphp條件限制實現

linux環境

getshell怎么在thinkphp條件限制實現

win環境

getshell怎么在thinkphp條件限制實現

在Linux中不能創建不存在的目錄,但是在win下就可以。但是報錯是warning,并不會中斷執行,并且在bindhello函數中我們會看到:

getshell怎么在thinkphp條件限制實現

其中mkdir函數存在recursive參數為true,允許遞歸創建多級嵌套的目錄。這樣就可以使mkdir中使用不存在的目錄就可以進行繞過。但是現在有個問題:前面的mkdir中的warning報錯被TP捕獲到直接會退出無法執行后面的內容,那么我們就需要使用一些辦法進行抑制報錯。我們經常做題會用到一個函數error_reporting,我們可以使用error_reporting(0)抑制報錯。

我們再回到代碼執行點,我們發現call_user_func函數執行完的值會執行循環再次回到call_user_func()中當回調函數的參數進行使用。因此需要考慮一下怎么調整才能讓我們執行并且抑制報錯。

1.如果我們將error_reporting放在前面執行,無論參數是什么都會返回0從而導致后面執行代碼不可控。

2.如果我們將think\Build::module放前面,那么thinkphp報錯也不能執行成功。

但是如果我們放入一個中間值,在第一次執行能夠成功創建目錄,并且error_reporting還能成功執行,這時候就需要用到PHP弱類型比較,PHP中 0 == null,0 == 非數字開頭的字符串。

payload如下可示:

getshell怎么在thinkphp條件限制實現

getshell怎么在thinkphp條件限制實現

方法二 使用注釋符繞過語法產生的錯誤

payload如下:

getshell怎么在thinkphp條件限制實現

這樣就會使用注釋符注釋掉后面的語法錯誤,然后使用&#63;>包裹住,后面跟上自己用的payload即可。但是這樣會產生一個問題,無法在win環境下使用,win下文件夾中不能帶這些字符/ \ : * &#63; " < > |

方法三 文件包含&php偽協議

這種操作就是,我們通過之前的think\Build::module寫文件進去,寫入的內容是我們rot13編碼過的。然后通過think\__include_file調用我們寫入文件的內容,因為這個過濾不夠完全,可以讓我們包含我們所寫的內容。

getshell怎么在thinkphp條件限制實現

getshell怎么在thinkphp條件限制實現

方法四 覆蓋日志路徑寫入

因為題目將error_log函數ban掉了,所以這個非預期解是在不ban掉error_log函數的情況下所實現的。

payload具體如下:

getshell怎么在thinkphp條件限制實現

1.通過json_decode使得我們傳入的{"type":"File", "path":"/var/www/html/null/public/logs"}轉換成內置類stdClass的一個對象。

2.再通過get_object_vars將其轉換成數組傳入到think\Log::init中。

3.在其中會new了一個\think\log\driver\File,并且傳入的參數是我們的'path'=>/var/www/html/null/public/logs,那么會觸發類中的__construct,將其默認的path給覆蓋掉。

getshell怎么在thinkphp條件限制實現

getshell怎么在thinkphp條件限制實現

4.最后因為我們觸發漏洞點的特殊性,肯定會報錯使得報錯信息可以被計入到log文件里。

getshell怎么在thinkphp條件限制實現

getshell怎么在thinkphp條件限制實現

5.之后再通過think\Lang::load包含。

getshell怎么在thinkphp條件限制實現

getshell怎么在thinkphp條件限制實現

getshell怎么在thinkphp條件限制實現

方法五  ::竟然可以調用非靜態方法

下面是個簡單的例子。

<&#63;php
class A{
 public function test1($a){
  echo "test1".$a;
 }
 static function test2($a){
  echo "test2".$a;
 }
 public function test3($a){
  $this->b = $a;
  echo "test3".$this->b;
 }
}

call_user_func("A::test1","x");
echo "</br>";
call_user_func("A::test2","x");
echo "</br>";
call_user_func("A::test3","x");
echo "</br>";
//$xxx=new A();
//call_user_func(array($xxx,'test3'),"x");

我們看看會怎么執行。

會發現使用::調用了public類的方法并且能夠成功執行,但是會報錯。并且::僅僅適合在方法中沒有寫$this的情況,因為$this指代的是這個對象,找不到對象自然會報錯。那么我們看一下下面的payload就會一眼明白,payload其實用了跟上面預期解抑制錯誤的另一種方法,然后抑制報錯讓TP不會遇錯停止執行。

這個題解的payload如下:

getshell怎么在thinkphp條件限制實現

1.因為PHP本身的錯誤處理被thinkphp所替代進行處理,所以上面就是將thinkphp所替代錯誤進行處理的方法給覆蓋掉導致沒有辦法正常執行。

2.調用self::path方法,可以拋棄掉我們上一個執行的返回值,并且返回我們所輸入的path。為什么會返回path,path為什么是我們輸入的值,這個就是之前提到的代碼執行點他是覆蓋了Request類的參數,所以方法返回的是$this->path,這個我們可以控制。

getshell怎么在thinkphp條件限制實現

3.之后調用base64_decode,返回值就是我們base64解碼的內容。

4.解碼后的返回值就會進入\think\view\driver\Php::Display中,然后進入eval執行代碼。

getshell怎么在thinkphp條件限制實現

getshell怎么在thinkphp條件限制實現

看完上述內容,你們掌握getshell怎么在thinkphp條件限制實現的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙陵县| 孝义市| 淮滨县| 雅安市| 双峰县| 潍坊市| 教育| 鹤岗市| 乌鲁木齐市| 京山县| 伊金霍洛旗| 青河县| 隆尧县| 和顺县| 庆元县| 阿鲁科尔沁旗| 安丘市| 保康县| 平泉县| 淳化县| 抚顺县| 柳河县| 信阳市| 哈尔滨市| 曲阳县| 准格尔旗| 陇西县| 兰西县| 江门市| 天水市| 潼关县| 密山市| 邮箱| 宜都市| 石阡县| 林周县| 武邑县| 务川| 梁河县| 平邑县| 濮阳市|