CodeQL 文档

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

单击以在 CodeQL 存储库中查看查询

对象图导航语言 (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.
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私