最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

thinkphp諸多限制條件下如何getshell詳解

 更新時(shí)間:2020年12月09日 11:18:50   作者:西部陸戰(zhàn)隊(duì)  
這篇文章主要給大家介紹了關(guān)于thinkphp諸多限制條件下如何getshell的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

smile yyds!

先說(shuō)一下這個(gè)題限制條件:

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

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

設(shè)置open_basedir為web目錄

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

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

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

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

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

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

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

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

我們會(huì)進(jìn)入到buildhello函數(shù)中。

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

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

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

linux環(huán)境

win環(huán)境

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

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

我們?cè)倩氐酱a執(zhí)行點(diǎn),我們發(fā)現(xiàn)call_user_func函數(shù)執(zhí)行完的值會(huì)執(zhí)行循環(huán)再次回到call_user_func()中當(dāng)回調(diào)函數(shù)的參數(shù)進(jìn)行使用。因此需要考慮一下怎么調(diào)整才能讓我們執(zhí)行并且抑制報(bào)錯(cuò)。

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

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

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

payload如下可示:

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

payload如下:

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

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

這種操作就是,我們通過(guò)之前的think\Build::module寫(xiě)文件進(jìn)去,寫(xiě)入的內(nèi)容是我們r(jià)ot13編碼過(guò)的。然后通過(guò)think\__include_file調(diào)用我們寫(xiě)入文件的內(nèi)容,因?yàn)檫@個(gè)過(guò)濾不夠完全,可以讓我們包含我們所寫(xiě)的內(nèi)容。

方法四 覆蓋日志路徑寫(xiě)入

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

payload具體如下:

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

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

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

4.最后因?yàn)槲覀冇|發(fā)漏洞點(diǎn)的特殊性,肯定會(huì)報(bào)錯(cuò)使得報(bào)錯(cuò)信息可以被計(jì)入到log文件里。

5.之后再通過(guò)think\Lang::load包含。

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

下面是個(gè)簡(jiǎn)單的例子。

<?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");

我們看看會(huì)怎么執(zhí)行。

會(huì)發(fā)現(xiàn)使用::調(diào)用了public類(lèi)的方法并且能夠成功執(zhí)行,但是會(huì)報(bào)錯(cuò)。并且::僅僅適合在方法中沒(méi)有寫(xiě)$this的情況,因?yàn)?this指代的是這個(gè)對(duì)象,找不到對(duì)象自然會(huì)報(bào)錯(cuò)。那么我們看一下下面的payload就會(huì)一眼明白,payload其實(shí)用了跟上面預(yù)期解抑制錯(cuò)誤的另一種方法,然后抑制報(bào)錯(cuò)讓TP不會(huì)遇錯(cuò)停止執(zhí)行。

這個(gè)題解的payload如下:

1.因?yàn)镻HP本身的錯(cuò)誤處理被thinkphp所替代進(jìn)行處理,所以上面就是將thinkphp所替代錯(cuò)誤進(jìn)行處理的方法給覆蓋掉導(dǎo)致沒(méi)有辦法正常執(zhí)行。

2.調(diào)用self::path方法,可以拋棄掉我們上一個(gè)執(zhí)行的返回值,并且返回我們所輸入的path。為什么會(huì)返回path,path為什么是我們輸入的值,這個(gè)就是之前提到的代碼執(zhí)行點(diǎn)他是覆蓋了Request類(lèi)的參數(shù),所以方法返回的是$this->path,這個(gè)我們可以控制。

3.之后調(diào)用base64_decode,返回值就是我們base64解碼的內(nèi)容。

4.解碼后的返回值就會(huì)進(jìn)入\think\view\driver\Php::Display中,然后進(jìn)入eval執(zhí)行代碼。

總結(jié)

到此這篇關(guān)于thinkphp諸多限制條件下如何getshell詳解的文章就介紹到這了,更多相關(guān)tp諸多限制條件下getshell內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Zend Framework教程之Zend_Layout布局助手詳解

    Zend Framework教程之Zend_Layout布局助手詳解

    這篇文章主要介紹了Zend Framework教程之Zend_Layout布局助手用法,結(jié)合實(shí)例形式詳細(xì)分析了Layout布局的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-03-03
  • Laravel框架隊(duì)列原理與用法分析

    Laravel框架隊(duì)列原理與用法分析

    這篇文章主要介紹了Laravel框架隊(duì)列原理與用法,結(jié)合實(shí)例形式分析了Laravel框架隊(duì)列的原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2018-09-09
  • Thinkphp5框架中引入Markdown編輯器操作示例

    Thinkphp5框架中引入Markdown編輯器操作示例

    這篇文章主要介紹了Thinkphp5框架中引入Markdown編輯器操作,結(jié)合實(shí)例形式分析了Thinkphp5引入Markdown編輯器的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2020-06-06
  • PHP foreach循環(huán)使用詳解與實(shí)例代碼

    PHP foreach循環(huán)使用詳解與實(shí)例代碼

    在PHP中的foreach是用來(lái)進(jìn)行循環(huán)對(duì)一個(gè)數(shù)組的所有元素。
    2010-05-05
  • thinkphp5使html5實(shí)現(xiàn)動(dòng)態(tài)跳轉(zhuǎn)的例子

    thinkphp5使html5實(shí)現(xiàn)動(dòng)態(tài)跳轉(zhuǎn)的例子

    今天小編就為大家分享一篇thinkphp5使html5實(shí)現(xiàn)動(dòng)態(tài)跳轉(zhuǎn)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • 詳解PHP素材圖片上傳、下載功能

    詳解PHP素材圖片上傳、下載功能

    這篇文章主要介紹了PHP圖片上傳下載功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • yii gridview實(shí)現(xiàn)時(shí)間段篩選功能

    yii gridview實(shí)現(xiàn)時(shí)間段篩選功能

    這篇文章主要為大家詳細(xì)介紹了yii gridview實(shí)現(xiàn)時(shí)間段篩選功能,一個(gè)輸入框,自動(dòng)提交功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • php隨機(jī)輸出名人名言的代碼

    php隨機(jī)輸出名人名言的代碼

    正如你看到的“小談博客”標(biāo)題后面的名人名言一樣,每刷新一次就會(huì)隨機(jī)出現(xiàn)一條語(yǔ)句,把你喜歡的話放到一起,經(jīng)常出現(xiàn)在你眼前,給你溫暖的力量
    2012-10-10
  • php+ajax做仿百度搜索下拉自動(dòng)提示框(有實(shí)例)

    php+ajax做仿百度搜索下拉自動(dòng)提示框(有實(shí)例)

    php+mysql+ajax實(shí)現(xiàn)百度搜索下拉提示框 主要有3個(gè)文件三個(gè)文件在同一個(gè)目錄里 如下圖 下面是三個(gè)文件的代碼 把sql文件導(dǎo)入到mysql數(shù)據(jù)庫(kù)里 修改下數(shù)據(jù)庫(kù)密碼為自己的 記得哦是UTF-8編碼
    2012-08-08
  • PHP實(shí)現(xiàn)登錄驗(yàn)證碼校驗(yàn)功能

    PHP實(shí)現(xiàn)登錄驗(yàn)證碼校驗(yàn)功能

    這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)驗(yàn)證碼校驗(yàn)功能,主要是利用PHP中的 SESSION功能來(lái)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評(píng)論

高邮市| 雷波县| 安岳县| 宣威市| 大余县| 临沭县| 五华县| 游戏| 宣化县| 科技| 米脂县| 井陉县| 留坝县| 平谷区| 察隅县| 东乡族自治县| 中方县| 嘉荫县| 潜山县| 闻喜县| 固镇县| 玛纳斯县| 长白| 涟源市| 门源| 元阳县| 溧水县| 寻甸| 资中县| 博野县| 拜泉县| 聂拉木县| 常熟市| 林州市| 桃园市| 鞍山市| 万州区| 葫芦岛市| 吉安市| 恩平市| 临夏市|