zoukankan      html  css  js  c++  java
  • 刷题记录:[护网杯 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内置重置密码在IlluminateAuthPasswords中实现,重置密码需要填写邮箱,并向邮箱发送一个重置链接。
    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

    缓存文件路径

    IlluminateViewCompilersCompiler

    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

    • IlluminateBroadcasting 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链汇总分析

  • 相关阅读:
    数据仓库经验小结(转)
    SSIS高级内容 系列一
    SSIS高级内容 系列二
    SSIS数据流组件开发(1)转载
    在sharepoint中添加视频播放
    处理数据仓库中历史数据的若干问题
    SSIS数据流组件开发(2) 转载
    [转载]俄罗斯只剩“大国的脾气”
    [转载]游击队员之歌
    [转载]世界是女人的
  • 原文地址:https://www.cnblogs.com/20175211lyz/p/12329462.html
Copyright © 2011-2022 走看看