V5.6.3.152.186 20240811之前
某通电子文档安全管理系统是一款综合性的数据智能安全产品,涵盖了透明加密、数据分类分级、访问控制等多项核心技术。该系统保护范围广泛,包括终端电脑、智能终端以及各类应用系统,能有效防止数据泄露,满足数据安全合规要求。该系统采用事前主动防御、事中实时控制、事后及时追踪的设计理念,全方位保障用户终端数据安全。此外,亿赛通在信息安全行业享有良好声誉,服务、售后等方面均表现出色。
body="/CDGServer3/index.jsp"
首先进入WEB-INF
的web.xml页面中,Fn+F
搜索SecretKeyService
Ctrl
点击键入该类中,该类位于/com/esafenet/key/service/SecretKeyService.class
中,这个是一个servlet文件,找到与前端交互的方法即service
方法
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
参数。
处理不同命令:
处理请求头中的命令:
command
的值,判断是否为"getSecretKeyValue",如是则调用相应的方法处理请求。然后在service代码下面第五十五行
在SecretKeyDAO
类中的findNumByKeyName
和findNumByKeyValue
方法调用中,如果这些方法中的实现使用了未经过滤的用户输入构造SQL查询,则有可能导致SQL注入
跟进findNumByKeyName
,搜索keyName
SQL语句中将keyValue
参数直接拼接到查询中,直接调用query方法执行sql语句,几乎没有做什么过滤,从而造成了sql注入漏洞
poc
如果sql语句执行成功就会延迟五秒
keyName=1'+WAITFOR+DELAY+'0:0:5'
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; // 返回查询结果
}
12 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!