前言
先说说2020_n1CTF的web题Easy_tp5复现问题。
这个题在保留thinkphp的RCE点的同时,并且RCE中ban掉许多危险函数,只能允许单参数的函数执行。对于现在在网络中流传的文件包含的点也增加了限制。
smile yyds!
先说一下这个题限制条件:
- thinkphp版本:5.0.0
- php版本:7
- 对于包含文件增加了限制
ban掉所有的单参数危险函数
设置open_basedir为web目录
设置仅在public目录下可写
在TP5.0.0的中,目前公布的只是存在利用Request类其中变量被覆盖导致RCE。如果ban掉单参数可利用函数那么只能用文件包含,但是文件包含做了限制不能包含log文件,所以只能从别的方面入手。
这些限制都太大了,所以需要想办法去上传一个shell来完成后续绕disable_function。
首先TP5.0.0目前只存在通过覆盖Request中的某些变量导致RCE,其余细节不再赘述,我们看看大概代码执行点在哪里。
call_user_func是代码执行点,我们基本上所有PHP自带的可利用函数基本被ban掉,所以我们需要从自写的函数调用来入手,首先我们需要看下这个点。可回调函数不仅仅指的是简单函数,还可以是一些对象的方法,包括静态方法。
方法一 thinkphp\library\think\Build::module
我们可以这样通过调用这个类的静态方法module,来实现写文件的操作。
我们先看看这个该怎么走,我们看到这个mkdir是在application创建目录,但是由于权限问题肯定无法创建。根据TP报错即退出的机制从而中断执行。那么我们可以通过../public/test
来创建目录。
我们会进入到buildhello函数中。
走完流程发现我们可以在public创建了一个test模块,同样看到test/controller/Index.php
中我们所写的../public/test
保存了下来那么我们就绕过,但是执行完之后会发现一些语法错误导致代码不能执行。
由于这部分内容可控那我们就把他变得符合语法执行,我们可以这么做test;eval($_POST[a]);#/../../public/test;
,这样就符合语法。
但是还有一个问题需要解决,就是我们这样的payload会设置一个不存在目录从而可以符合语法并且加入eval函数。但是现在还存在一个跨越不存在目录的问题。
linux环境
win环境
在Linux中不能创建不存在的目录,但是在win下就可以。但是报错是warning,并不会中断执行,并且在bindhello函数中我们会看到:
其中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如下可示:
方法二 使用注释符绕过语法产生的错误
payload如下:
这样就会使用注释符注释掉后面的语法错误,然后使用" < > |
方法三 文件包含&php伪协议
这种操作就是,我们通过之前的think\Build::module
写文件进去,写入的内容是我们rot13编码过的。然后通过think\__include_file
调用我们写入文件的内容,因为这个过滤不够完全,可以让我们包含我们所写的内容。
方法四 覆盖日志路径写入
因为题目将error_log函数ban掉了,所以这个非预期解是在不ban掉error_log函数的情况下所实现的。
payload具体如下:
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给覆盖掉。
4.最后因为我们触发漏洞点的特殊性,肯定会报错使得报错信息可以被计入到log文件里。
5.之后再通过think\Lang::load
包含。
方法五 ::竟然可以调用非静态方法
下面是个简单的例子。
<"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如下:
1.因为PHP本身的错误处理被thinkphp所替代进行处理,所以上面就是将thinkphp所替代错误进行处理的方法给覆盖掉导致没有办法正常执行。
2.调用self::path
方法,可以抛弃掉我们上一个执行的返回值,并且返回我们所输入的path
。为什么会返回path,path为什么是我们输入的值,这个就是之前提到的代码执行点他是覆盖了Request类的参数,所以方法返回的是$this->path
,这个我们可以控制。
3.之后调用base64_decode,返回值就是我们base64解码的内容。
4.解码后的返回值就会进入\think\view\driver\Php::Display
中,然后进入eval执行代码。
总结
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】