本文编写于 117 天前,最后修改于 115 天前,其中某些信息可能已经过时。
基础路由
直接看官方文档
有点像thinkphp的强制模式,路由都是routes下的这四个文件定义的,主要是web.php,其次是api.php
web路由
后面两个web路由都是我自己定义的,可以正常访问。
第一个/路由是返回一个welcome的view视图,通过一个工厂类进行实例化
先找到一个视图文件
再根据视图文件进行实例化
api路由
接下来看api.php,定义了一个auth的中间件来过滤
这里我自己另外写了一个api路由
其实跟web路由差不多,不过是要多加一个/api
middleware路由
kernel.php定义了中间件的路由
没有期待的json就跳转到login
路由注册分析
那为什么我们在Config里定义就有了这几个路由了呢?
可以看到应该是通过调用了Route类的get等方法进行了路由的注册
最后会在这个类的routes添加这个新注册的路由,所以routes里应该是所有的路由
自定义controller
这里根据官方文档写了一个UserController,有一个show函数根据id返回一个user的view视图
视图文件在resources文件夹下
路由就是在web.php里定义就可以了
CVE-2021-3129
漏洞复现
参考
开启debug模式
会根据报错提供常见的解决办法
得到一个solution,然后调用它的run方法,参数get得到
solution也是我们可以指定的
在这些解决方法中有一个MakeViewVariableOptionalSolution进行了文件的写入
往文件里写的内容是根据原本的内容进行一次替换,variableName也是我们可控的
顺便写一个文件,会爆没有这个文件
我们可以通过php的filter让写入的内容为空,相当于一个删除内容的功能
{
"solution": "Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution",
"parameters": {
"variableName": "username",
"viewFile": "php://filter/write=convert.iconv.utf-8.utf-16be|convert.quoted-printable-encode|convert.iconv.utf-16be.utf-8|convert.base64-decode/resource=../storage/logs/laravel.log"
}
}
成功清空
后面生成phar的时候不知道为什么会报错,可能是我本地环境的问题,就不复现了。
漏洞路由分析
可以看到所有可以访问的路由以及对应的方法,那我们来分析除了我们定义的路由,这几个默认路由是哪里来的。
然后调用controller的method方法
可以找到是在IgnitionServiceProvider.php里定义了这几个路由
基于Laravel的mycms审计
春秋杯夏季赛的awdp出了道mycms,我去Gitee对比更改应该是mycmsv4.8
路由
web.php里只定义了/路由
Addons里有很多模块,每个模块都定义自己的路由和controller
Ads
保存配置的功能往forbid.php里写入我们可以拼接的内容
提交路由应该是/admin/addon/ads/config,post提交,不过最后写入的forbid.php不知道要怎么访问
Upgrade
可以下载任意一个文件,然后解压
应该是在app文件夹下,感觉应该可以进行覆盖
路由是/admin/addon/upgrade/version post