问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
某通电子文档管理系统 SecretKeyService SQL注入漏洞
漏洞分析
某通电子文档管理系统 SecretKeyService SQL注入漏洞
影响版本 ---- V5.6.3.152.186 20240811之前 产品简介 ---- 某通电子文档安全管理系统是一款综合性的数据智能安全产品,涵盖了透明加密、数据分类分级、访问控制等多项核心技术。该系统保护范围广泛,包括终端电脑、智能终端以及各类应用系统,能有效防止数据泄露,满足数据安全合规要求。该系统采用事前主动防御、事中实时控制、事后及时追踪的设计理念,全方位保障用户终端数据安全。此外,亿赛通在信息安全行业享有良好声誉,服务、售后等方面均表现出色。 资产测绘 ---- body="/CDGServer3/index.jsp" ![图片.png](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-75ec04286513732ab7fef9898d4556b23132be6f.png) 代码审计 ---- 首先进入`WEB-INF`的web.xml页面中,`Fn+F`搜索`SecretKeyService` ![image-20240813184439796](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-c6e3dc61ccca5f4306315a09ea084d9bf6c45e57.png) `Ctrl`点击键入该类中,该类位于`/com/esafenet/key/service/SecretKeyService.class`中,这个是一个servlet文件,找到与前端交互的方法即`service`方法 ![image-20240813184728638](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-326625436912ab5dad2d90b7706a38747aec7d69.png) ```php 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请求。它接受两个参数:`HttpServletRequest`和`HttpServletResponse`,并可能抛出`ServletException`和`IOException`。 **获取命令参数**: 使用`request.getParameter("command")`来获取用户请求中的`command`参数。 **处理不同命令**: - 首先检查是否为"sameKeyName"命令,如果是,则调用相应的方法以处理该请求。 - 然后检查是否为"sameKeyValue"命令,如是,则调用对应的方法。 **处理请求头中的命令**: - 从请求头中获取名为`command`的值,判断是否为"getSecretKeyValue",如是则调用相应的方法处理请求。 **然后在service代码下面第五十五行** ![image-20240813185056315](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-1eacbab9c0f9862024dc111673e9ba5be285abe6.png) 在`SecretKeyDAO`类中的`findNumByKeyName`和`findNumByKeyValue`方法调用中,如果这些方法中的实现使用了未经过滤的用户输入构造SQL查询,则有可能导致SQL注入 跟进`findNumByKeyName`,搜索`keyName` ![image-20240813195833171](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-eb68b7718f61d34b40b7bc60d1a971dba6227cd2.png) SQL语句中将`keyValue`参数直接拼接到查询中,直接调用query方法执行sql语句,几乎没有做什么过滤,从而造成了sql注入漏洞 **poc** 如果sql语句执行成功就会延迟五秒 `keyName=1'+WAITFOR+DELAY+'0:0:5'` 漏洞复现 ---- ![image-20240813202445185](https://shs3.b.qianxin.com/attack_forum/2024/08/attach-6cb50edbc126fdf6a7bbc253c9cf35acad0b355c.png) 修复建议 ---- ```php 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
阅读 ( 5519 )
分类:
Web服务器
2 推荐
收藏
0 条评论
请先
登录
后评论
xhys
12 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!