tinypng
题目提供了源代码,通过php artisan 命令,可以看到是Laravel 8.15框架
首先查看路由信息
先查看一下fileupload
路由,可以发现文件上传时对内容进行了过滤,且只允许上传png
接着我们看image路由,进入ImageController
,$source
可控接着判断是否为png
结尾,如果为png
结尾则传给imgcompress
类。
进入imgcompress
类,$this->src
为我们传入的$source
接着又传递给compressImg
类,调用了openImg
方法
将$source
传递给了getimagesize
,getimagesize
可以触发phar
反序列化
现在只需要绕过文件上传内容检测即可,我们可以通过gzip的方式绕过。
从网上找一个Laravel 8的公开的反序列化POP链漏洞即可,如下给出我使用的exp。
1 | namespace Illuminate\Broadcasting { |
通过如上exp生成phar
文件,使用gzip
打包修改为png后缀
上传文件
访问/image?image=phar://../storage/app/uploads/xx.png
,成功代码执行
Easyflask
根据页面提示访问/file?file=/app/source
可以获取到源代码
把代码复制到本地编辑器,便于分析。可以看到file
路由为文件读取,对后缀存在一定限制,但是也可以读取到部分文件。
在代码头部发现SECRET_KEY存放在环境变量中
我们可以通过读取/proc/self/environ文件,获得SECRET_KEY
接着看admin路由存在pickle.loads,u参数可控那么就存在python反序列化漏洞(参考https://daolgts.github.io/2019/09/20/python%20pickle%E5%8F%8D%E5%BA%8F%E5%88%97%E6%BC%8F%E6%B4%9E/)
编写并运行EXP脚本,获得一串BASE64
1 | import pickle |
接着通过获取到的KEY,使用脚本伪造FLASK的Session(https://github.com/noraj/flask-session-cookie-manager)
-s参数为SECRET_KEY,-t 参数为反序列化的内容
通过生成出的Session访问/admin路径,返回500为成功
接着进行文件读取获得flag