如何防止使用EL表达式注入代码

时间:2018-03-22 06:35:59

标签: security jsf el code-injection crlf-vulnerability

当我使用JSF时,我正在尝试使用以下代码找到ValueExpression:

public static final ValueExpression createValueExpression(
            final FacesContext context, final ELContext elContext,
            final String ev, final Class classType) {
        return context.getApplication().getExpressionFactory()
            .createValueExpression(elContext, ev, classType);
    }

但是,当我在HP fortify上运行这些代码时,在运行时解释用户控制的指令可能允许攻击者执行恶意代码。 似乎存在使用EL表达式评估进行代码注入的风险。 但我知道存在代码漏洞,所以我想知道如何防止EL注入?

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

如果您让用户提供EL中使用的输入(注释中正确指出的ev字符串)而没有正确的转义和/或其他基本安全措施,风险就是(就像使用SQL注入一样),您将承担执行其他代码的风险,而不是您想要的代码。

如果不是这种情况,您可以忽略警告(希望它是警告,而不是阻止错误)

答案 1 :(得分:1)

此处表达式字符串'env'易受Expression Language Injection攻击,当攻击者控制由Expression Language interpreter评估的数据时,会发生 Pattern pattern = Pattern.compile("[a-zA-Z0-9_\.\*#\{\}]*"); Matcher matcher = pattern.matcher(ev); if (!matcher.matches()) { String message = "Detected a potential EL injection attack - value[" + ev+ "]"; throw new Exception(message); }

对于解决方案,更有效的方法可能是针对不信任执行数据验证最佳实践 输入并确保在数据到达EL层时应用输出编码,以便这样做 在评估之前,解释器在用户内容中找不到元字符。最多 要检测的明显模式包括“$ {”和“#{”,但有可能编码或分段 这个数据。

因此,您可以在创建值表达式之前创建“白名单”模式以匹配表达式“evn”(白名单可以是:`[a-zA-Z0-9 _。*#{}] *') 。

LONG WINAPI lineMakeCall(
   HLINE                  hLine,
   LPHCALL                lphCall,
   LPCSTR                 lpszDestAddress,
   DWORD                  dwCountryCode,
   LPLINECALLPARAMS const lpCallParams
);