真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

getshell怎么在thinkphp條件限制實現(xiàn)-創(chuàng)新互聯(lián)

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

10多年的淮陽網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整淮陽建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“淮陽網(wǎng)站設(shè)計”,“淮陽網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

先說說2020_n1CTF的web題Easy_tp5復(fù)現(xiàn)問題。

這個題在保留thinkphp的RCE點的同時,并且RCE中ban掉許多危險函數(shù),只能允許單參數(shù)的函數(shù)執(zhí)行。對于現(xiàn)在在網(wǎng)絡(luò)中流傳的文件包含的點也增加了限制。

smile yyds!

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

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

getshell怎么在thinkphp條件限制實現(xiàn)

ban掉所有的單參數(shù)危險函數(shù)

getshell怎么在thinkphp條件限制實現(xiàn)

設(shè)置open_basedir為web目錄

getshell怎么在thinkphp條件限制實現(xiàn)

設(shè)置僅在public目錄下可寫

getshell怎么在thinkphp條件限制實現(xiàn)

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

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

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

getshell怎么在thinkphp條件限制實現(xiàn)

call_user_func是代碼執(zhí)行點,我們基本上所有PHP自帶的可利用函數(shù)基本被ban掉,所以我們需要從自寫的函數(shù)調(diào)用來入手,首先我們需要看下這個點??苫卣{(diào)函數(shù)不僅僅指的是簡單函數(shù),還可以是一些對象的方法,包括靜態(tài)方法。

getshell怎么在thinkphp條件限制實現(xiàn)

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

我們可以這樣通過調(diào)用這個類的靜態(tài)方法module,來實現(xiàn)寫文件的操作。

getshell怎么在thinkphp條件限制實現(xiàn)

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

我們會進入到buildhello函數(shù)中。

getshell怎么在thinkphp條件限制實現(xiàn)

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

getshell怎么在thinkphp條件限制實現(xiàn)

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

getshell怎么在thinkphp條件限制實現(xiàn)

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

getshell怎么在thinkphp條件限制實現(xiàn)

linux環(huán)境

getshell怎么在thinkphp條件限制實現(xiàn)

win環(huán)境

getshell怎么在thinkphp條件限制實現(xiàn)

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

getshell怎么在thinkphp條件限制實現(xiàn)

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

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

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

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

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

payload如下可示:

getshell怎么在thinkphp條件限制實現(xiàn)

getshell怎么在thinkphp條件限制實現(xiàn)

方法二 使用注釋符繞過語法產(chǎn)生的錯誤

payload如下:

getshell怎么在thinkphp條件限制實現(xiàn)

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

方法三 文件包含&php偽協(xié)議

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

getshell怎么在thinkphp條件限制實現(xiàn)

getshell怎么在thinkphp條件限制實現(xiàn)

方法四 覆蓋日志路徑寫入

因為題目將error_log函數(shù)ban掉了,所以這個非預(yù)期解是在不ban掉error_log函數(shù)的情況下所實現(xiàn)的。

payload具體如下:

getshell怎么在thinkphp條件限制實現(xiàn)

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

2.再通過get_object_vars將其轉(zhuǎn)換成數(shù)組傳入到think\Log::init中。

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

getshell怎么在thinkphp條件限制實現(xiàn)

getshell怎么在thinkphp條件限制實現(xiàn)

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

getshell怎么在thinkphp條件限制實現(xiàn)

getshell怎么在thinkphp條件限制實現(xiàn)

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

getshell怎么在thinkphp條件限制實現(xiàn)

getshell怎么在thinkphp條件限制實現(xiàn)

getshell怎么在thinkphp條件限制實現(xiàn)

方法五  ::竟然可以調(diào)用非靜態(tài)方法

下面是個簡單的例子。

<?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 "
"; call_user_func("A::test2","x"); echo "
"; call_user_func("A::test3","x"); echo "
"; //$xxx=new A(); //call_user_func(array($xxx,'test3'),"x");

文章名稱:getshell怎么在thinkphp條件限制實現(xiàn)-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://weahome.cn/article/dsgpsh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部