泛微ecology9 getdata.jsp 远程代码执行漏洞分析
type
status
date
slug
summary
tags
category
icon
password
AI summary
漏洞分析
漏洞点位于:/js/hrm/getdata.jsp


该代码接收 cmd 参数,依据其不同取值执行相应处理逻辑。当 cmd 取值不匹配上述特定情况时,会调用
result.append(weaver.hrm.common.AjaxManager.getData(request, application));将cmd的值进行URL解码后,传入
proc(var0, var3, var1, var2);当cmd参数为savect时,从request中获取arg0参数的值,然后传入
HrmChartSet.get();继续跟进至实现方法
HrmChartSetDao#get()继续跟进至
HrmChartSetDao#find()这里把最开始的
arg0拼接到了SQL语句当中,造成SQL注入漏洞。绕过参数安全限制
该路径有安全校验规则,具体代码在
weaver.security.rules.ruleImp.SecurityRuleGetData#validate()中,限制了arg0参数
不允许出现单引号和百分号。这里可以使用 CONCAT 和 CHAR 构建
绕过Rasp限制
新版本泛微自带Rasp,针对SQL注入的监测点在
weaver.security.agentRules.rule.sqlCheck.SqlInjectionRule#doClean()
isStrictCheck为true,代表高防,默认情况下是开启高防状态的继续跟进
parseSqlNewLevelHight首先进入语义检测
parseSqlNew
跟进
parseDuridSql如果SQL语句不是以set或者declare开头,就无法通过检测。
但这里用到的是druid进行语义解析。Druid 的语义解析流程可概括为:
SQL文本 → 词法分析 → Token序列 → 语法分析 → AST → 语义验证 → 安全检测
但是Druid存在token解析不全的问题。
通过这个demo可以清晰地看到,出现
RECONFIGURE关键字的时候,会抛出ParserException异常。由于Throwable是所有异常和错误的超类,所以这里就绕过了语义分析,进入catch,继续调用parseCcjsSqlNew
这里也没有对
RECONFIGURE做处理,返回RuntimeException异常。回到parseSqlNewLevelHight调用filterSqlWhite
总共5种情况可可以返回true:
- 纯标识符(无 SQL 关键字)
- 以
select开头(小写且有空格),同时包含translate(或left hash join。
- SQL 语句以 onlySqlWhitePrefix 列表中的任意字符串(如 SET 、DECLARE )开头。
- 以
sqlWhitePrefix列表中的任意字符串(如SELECT、UPDATE)开头(小写),同时包含collate和chinese_prc_cs_a(区分大小写排序规则),不包含分号。
- 以
set identity_insert开头(小写),以on或off结尾,按空格分割后恰好为 4 个部分(如 set identity_insert table_name on)
最简单的就是第二种了,所以构造arg0的值为:
Loading...