某通电子文档管理系统 SecretKeyService SQL注入漏洞

某通电子文档管理系统 SecretKeyService SQL注入漏洞

影响版本

V5.6.3.152.186 20240811之前

产品简介

某通电子文档安全管理系统是一款综合性的数据智能安全产品,涵盖了透明加密、数据分类分级、访问控制等多项核心技术。该系统保护范围广泛,包括终端电脑、智能终端以及各类应用系统,能有效防止数据泄露,满足数据安全合规要求。该系统采用事前主动防御、事中实时控制、事后及时追踪的设计理念,全方位保障用户终端数据安全。此外,亿赛通在信息安全行业享有良好声誉,服务、售后等方面均表现出色。

资产测绘

body="/CDGServer3/index.jsp"

图片.png

代码审计

首先进入WEB-INF的web.xml页面中,Fn+F搜索SecretKeyService

image-20240813184439796

Ctrl点击键入该类中,该类位于/com/esafenet/key/service/SecretKeyService.class中,这个是一个servlet文件,找到与前端交互的方法即service方法

image-20240813184728638

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    // 从请求中获取"command"参数  
    String command \= request.getParameter("command");  
      
    // 检查命令是否为"sameKeyName",如果是,则调用sameKeyName方法处理请求  
    if ("sameKeyName".equals(command)) {  
        this.sameKeyName(request, response);  
    }  
​  
    // 检查命令是否为"sameKeyValue",如果是,则调用sameKeyValue方法处理请求  
    if ("sameKeyValue".equals(command)) {  
        this.sameKeyValue(request, response);  
    }  
​  
    // 从请求头中获取"command"参数  
    String serNameString \= request.getHeader("command");  
      
    // 检查请求头中的命令是否为"getSecretKeyValue",如果是,则调用getSecretKeyValue方法处理请求  
    if ("getSecretKeyValue".equals(serNameString)) {  
        this.getSecretKeyValue(request, response);  
    }  
}

方法签名: 该方法是重写的service方法,用于处理HTTP请求。它接受两个参数:HttpServletRequestHttpServletResponse,并可能抛出ServletExceptionIOException

获取命令参数: 使用request.getParameter("command")来获取用户请求中的command参数。

处理不同命令:

  • 首先检查是否为"sameKeyName"命令,如果是,则调用相应的方法以处理该请求。
  • 然后检查是否为"sameKeyValue"命令,如是,则调用对应的方法。

处理请求头中的命令:

  • 从请求头中获取名为command的值,判断是否为"getSecretKeyValue",如是则调用相应的方法处理请求。

然后在service代码下面第五十五行

image-20240813185056315

SecretKeyDAO类中的findNumByKeyNamefindNumByKeyValue方法调用中,如果这些方法中的实现使用了未经过滤的用户输入构造SQL查询,则有可能导致SQL注入

跟进findNumByKeyName,搜索keyName

image-20240813195833171

SQL语句中将keyValue参数直接拼接到查询中,直接调用query方法执行sql语句,几乎没有做什么过滤,从而造成了sql注入漏洞

poc

如果sql语句执行成功就会延迟五秒

keyName=1'+WAITFOR+DELAY+'0:0:5'

漏洞复现

image-20240813202445185

修复建议

public String getKeyNameBykeyValue(String keyValue) throws Exception {  
    // SQL查询语句,使用?作为占位符以避免SQL注入  
    String sql \= "SELECT keyName FROM SecretKey WHERE keyValue = ?";  
    Connection conn \= null; // 数据库连接对象  
    QueryRunner qr \= null;  // QueryRunner对象用于执行数据库操作  
​  
    String result; // 用于存储查询结果  
    try {  
        conn \= getConnection(); // 获取数据库连接  
        qr \= new QueryRunner(); // 初始化QueryRunner  
        // 使用参数化查询执行SQL,并通过ResultSetHandler处理结果  
        result \= (String) qr.query(conn, sql, new ResultSetHandler<String\>() {  
            public String handle(ResultSet rs) throws SQLException {  
                // 如果查询结果为空,返回"默认密钥",否则返回查询到的keyName  
                return !rs.next() ? "默认密钥" : rs.getString(1);  
            }  
        }, keyValue); // 将keyValue作为参数传递,避免直接拼接  
    } finally {  
        DbUtils.closeQuietly(conn); // 确保数据库连接被关闭  
    }  
​  
    return result; // 返回查询结果  
}
  • 发表于 2024-08-29 09:33:34
  • 阅读 ( 7445 )
  • 分类:Web服务器

0 条评论

请先 登录 后评论
xhys
xhys

12 篇文章

站长统计