第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 /'