OGNL 表达式语言语句带有用户控制的输入¶
ID: java/ognl-injection
Kind: path-problem
Security severity: 9.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-917
Query suites:
- java-code-scanning.qls
- java-security-extended.qls
- java-security-and-quality.qls
对象图导航语言 (OGNL) 是一种用于 Java 的开源表达式语言 (EL)。OGNL 可以创建或更改可执行代码,因此它可能会给任何使用它的应用程序引入严重的安全性缺陷。评估未经验证的表达式是 OGNL 中的常见缺陷。这会使 Java 对象的属性暴露给攻击者修改,并且可能允许他们执行任意代码。
建议¶
一般建议是避免评估不受信任的 ONGL 表达式。如果必须评估用户提供的 OGNL 表达式,请在沙盒中执行此操作并在评估之前验证表达式。
示例¶
在以下示例中,代码接受来自用户的 OGNL 表达式并对其进行评估。
在第一个示例中,对用户提供的 OGNL 表达式进行解析和评估。
第二个示例验证表达式并在沙盒内对其进行评估。您可以通过设置系统属性(如示例中所示)或向 JVM 参数添加 -Dognl.security.manager
来添加沙盒。
import ognl.Ognl;
import ognl.OgnlException;
public void evaluate(HttpServletRequest request, Object root) throws OgnlException {
String expression = request.getParameter("expression");
// BAD: User provided expression is evaluated
Ognl.getValue(expression, root);
// GOOD: The name is validated and expression is evaluated in sandbox
System.setProperty("ognl.security.manager", ""); // Or add -Dognl.security.manager to JVM args
if (isValid(expression)) {
Ognl.getValue(expression, root);
} else {
// Reject the request
}
}
public void isValid(Strig expression) {
// Custom method to validate the expression.
// For instance, make sure it doesn't include unexpected code.
}
参考¶
Apache Commons:Apache Commons OGNL。
Struts 安全性:主动保护免受 OGNL 表达式注入攻击。
常见弱点枚举:CWE-917。