SCTF-2021 部分WriteUp

2022-01-05 09:56:49 浏览数 (1)

第35名

SCTF

Web

★Loginme

代码审计,伪造X-Real-IP就行了,太简单的代码了没啥必要

★Upload_it

composer.json中,引入了两个模块

代码语言:javascript复制
{
    "name": "sctf2021/upload",
    "authors": [
        {
            "name": "AFKL",
            "email": "upload@qq.com"
        }
    ],
    "require": {
        "symfony/string": "^5.3",
        "opis/closure": "^3.6"
    }
}

我们通过composer install命令来安装这里两个模块

审计源码可以发现,文件上传的路径可控

但是通过测试,只有/tmp/目录有写权限

题目一般不会无缘无故做一些无意义操作,所以猜测composer引入的包是有助于做题的,百度找了下这两个模块作用如下:

symfony/string:操作字符串

参考文档: https://symfony.com/doc/current/components/string.html

opis/closure:序列化闭包

参考文档: https://opis.io/closure/3.x/serialize.html

序列化闭包,很容易联想到反序列化,那么我们就尝试找找有没有能触发反序列化的地方吧~

首先我们在index.php中可以看到session操作

然后看phpinfo中session的信息,save_handler为files,serialize_handler为php,save_path为空

猜一下session文件存放路径应该是/tmp/sess_xxxx(默认好像是在这里),结合上面分析的,我们可以上传自定义内容的sess_xxx文件来伪造session信息

由于serialize_handler设置为php,所以session文件格式应该为<元素名>|<元素值的序列化数据>,PHP在取元素值的时候会先对元素值进行反序列化,那么这里就是我们要找的反序列化点了。

我们可以通过构造如下请求来写入自定义的session数据

通过如下请求可以确定,我们上传的session文件确实被引用了(upload_path为我们定义的内容),但是/var/目录我们不可写所以题解没那么简单

根据上面的分析,思路就很清晰了,我们需要构造一个序列化payload,然后上传到/tmp/sess_xxx后,使用我们上传的sessID再上传一次文件达到触发反序列化的效果

根据代码可知,引用_SESSION["upload_path"]后使用点操作符来拼接字符串,所以如果我们的

通过phpstorm的项目内容搜索,我找到了完美符合要求的类=》LazyString

类文件位于刚刚composer安装的地方,vendorsymfonystringLazyString.php

我们进入这个文件,把构造函数改成如下(为啥知道是cat /flag?因为我省略了'ls /'

0 人点赞