刷题记录:[护网杯 2018]easy_laravel

参考链接:Laravel 相关几道题目复现

sql注入

username的sql注入,一眼就能看出来,但是admin的密码是加密过的,没法直接得到密码

public function index(Note $note)
{
    $username = Auth::user()->name;
    $notes = DB::select("SELECT * FROM `notes` WHERE `author`='{$username}'");
    return view('note', compact('notes'));
}

重置密码

laravel内置重置密码在Illuminate\Auth\Passwords中实现,重置密码需要填写邮箱,并向邮箱发送一个重置链接。
laravel在5.4以后都是将token加密存储的,而之前是明文存储,所以我们就可以注入出token重置admin密码
先访问/password/reset重置admin密码,然后注出token,访问/password/reset/[token],完成重置

composer

接下来要寻找pop链,我们先用命令composer install将依赖装好

blade

laravel 基础教程 —— Blade 模板引擎

Blade 是 laravel 提供的一个简单强大的模板引擎。它不像其他流行的 PHP 模板引擎那样限制你在视图中使用原生的 PHP 代码,事实上它就是把 Blade 视图编译成原生的 PHP 代码并缓存起来。缓存会在 Blade 视图改变时而改变,这意味着 Blade 并没有给你的应用添加编译的负担。Blade 视图文件使用 .blade.php 后缀,一般情况下都被存储在 resources/views 目录。
访问flag页面显示no flag,猜测出题者的意图是要我们删掉缓存文件,更新flag

缓存文件路径

Illuminate\View\Compilers\Compiler

public function getCompiledPath($path)
{
    return $this->cachePath.'/'.sha1($path).'.php';
}

其中cachePath就是web根目录,$path就是blade文件的位置,所以如果中间件为Apache,那么缓存文件路径就是

/var/www/html/storage/framework/views/73eb5933be1eb2293500f4a74b45284fd453f0bb.php
# sha1("/var/www/html/resources/views/auth/flag.blade.php")

pop链

删除缓存文件

全局搜索unlink,可以发现

class Swift_ByteStream_TemporaryFileByteStream extends Swift_ByteStream_FileByteStream
{
    
    ...

    public function __destruct()
    {
        if (file_exists($this->getPath())) {
            @unlink($this->getPath());
        }
    }
}

正好有upload,还有check页面可以构造任意路径file_exists,构造phar文件即可触发反序列化

getshell

  • Illuminate\Broadcasting PendingBroadcast类的__destruct

    public function __destruct()
    {
        $this->events->fire($this->event);
    }
    
  • Faker中找到Generator类的__call(但是我并没有找到,应该是版本的问题)

  • 它会调用format函数,其中format会调用call_user_func_array,且第一个参数,由下面的getFormatter返回,简单审计发现两个参数都可控。这样POP链就构造好了

附上大佬的Laravel总结Laravel 5.8 RCE POP链汇总分析

posted @ 2020-02-19 00:02  MustaphaMond  阅读(453)  评论(0编辑  收藏  举报