코드 삽입은 제3자가 서버측 소프트웨어에서 코드를 실행할 수 있도록 하는 중요한 취약점입니다. 표현식 언어 주입은 서버의 민감한 데이터를 공개하는 원격 코드 실행의 한 유형입니다. 원격 코드는 변수, 암호, 기능 또는 코드를 실행하고 표시합니다. 최악의 경우, 공격자가 서버를 원격 제어할 수 있습니다.
표현 언어 주입이란?
표현식 언어 주입은 JavaServer Pages(JSP), Active Server Pages(ASP) 및 웹 서버에서 호스팅되는 기타 표현식 언어에 영향을 주는 취약점입니다. 이러한 언어는 해석된 언어이므로 서버로 전송되는 모든 코드는 애플리케이션의 런타임 중에 컴파일되며, 바이너리 실행 파일이 있는 표준 컴파일 언어는 제외됩니다. 해석된 언어로 사용자가 페이지를 요청할 때 서버에서 코드가 컴파일됩니다.
표현식 언어(EL) 애플리케이션이 표현식 언어 주입에 취약할 때 공격자는 쿼리 문자열이나 양식 오브젝트에 입력으로 작성된 코드를 애플리케이션에 전송합니다. 코드는 런타임에 컴파일되며, 그 후 변수, 암호 및 기타 민감한 정보를 표시할 수 있습니다. EL 취약점은 구형 버전의 해석된 언어에서 일반적이므로 레거시 애플리케이션을 프로덕션에 배포하기 전에 침투 테스트를 거쳐야 합니다. 중요한 사건이 발생한 후, 조직은 데이터 공개 및 익스플로잇을 복구하기 위한 재해 복구 계획이 필요합니다.
표현식 언어 인젝션의 작동 방식
해석된 언어를 실행하는 모든 애플리케이션은 입력에서 코드와 특수 문자를 제거해야 합니다. 스크러빙 입력 없이 애플리케이션은 코드를 받아 서버에서 실행합니다. 대부분의 EL 인젝션 취약점은 JSP와 관련이 있으므로 다음 예에서는 JSP 코드를 사용합니다. 아래 스니펫은 EL 주입에 취약한 단일 코드 라인의 예입니다.
<spring:message code="${param['message']}" text=""/>
이 예제에서는 코드 속성이 문자열을 포함하는 매개 변수를 사용합니다. 공격자가 파라메타에 코드를 주입하면 서버에서 컴파일되고 실행됩니다. 사용자는 로컬 웹 페이지에서 이 코드를 볼 수 없으므로 공격자는 일반적인 스크립트를 사용하여 EL 주입 취약점을 찾습니다.
표현식 언어 주입으로 이어지는 일반적인 취약점
모든 인젝션 취약점과 마찬가지로, EL 인젝션 취약점은 서버 애플리케이션에 대한 입력 검증이 이루어지지 않았기 때문입니다. 위와 같은 예를 사용하면 메시지 문자열은 순진한 문자 문자열일 수 있지만, 코드일 수도 있습니다. 무고한 문자열을 보내는 대신, 사용자가 다음을 전송했다고 가정해 봅시다.
${"aaaa".toString().concat(T(java.lang.Runtime).getRuntime().exec('ls -l'))}
위의 입력은 서버에서 시스템 명령 “ls -l”을 실행하려고 시도합니다. 이 명령은 현재 디렉터리의 파일과 디렉터리를 나열합니다. 파일 목록을 통해 공격자는 다른 명령을 전송하여 파일 콘텐츠를 열고 창으로 표시하려고 시도할 수 있습니다. 파일에는 비밀번호와 같은 민감한 데이터가 포함될 수 있습니다. 공격자는 이로부터 서버에 액세스하여 추가적인 악성 작업을 수행할 수 있습니다.
표현식 언어 주입 감지
화이트박스와 블랙박스의 침투 테스트는 EL 주입 취약점을 탐지합니다. 화이트박스 테스트는 보안 전문가들이 취약점에 대한 코드를 검토하는 방법입니다. 기업들은 보안 검토자들에게 코드를 제공하고, 검토자들은 보고서의 모든 코드 취약점을 식별합니다. 이는 데이터 보호에 대한 일반적인 선제적 접근 방식입니다.
블랙박스 침투 테스트는 공격자와 동일한 형태의 스캔 및 취약점 탐지를 사용합니다. 보안 전문가들은 코드를 모르고 애플리케이션을 공격하므로 검증 또는 방어를 테스트할 수 있습니다. 그레이 박스 테스트는 블랙 박스와 화이트 박스 테스트가 혼합된 것으로, 웹 애플리케이션 침투 테스트를 위해 종종 선택된 방법입니다.
표현식 언어 주입 방지
EL 주입 공격을 탐지하는 가장 좋은 방법은 코드를 검증하고 특정 문자로 입력을 제거하는 것입니다. 예를 들어, 이름 필드에는 “<” or “>” 문자를 입력할 수 없습니다. 개발자는 이러한 문자를 감지하고 제거하거나 입력을 삭제하고 사용자에게 오류를 표시하도록 구축된 라이브러리를 사용해야 합니다.
다른 문자도 악의적일 수 있습니다. JSP 페이지에서 코드 조각은 “<%” characters and end with the “%>” 문자로 시작합니다. 이러한 문자는 함께 입력에서 제거해야 합니다. 공격자들은 탐지를 우회하기 위해 악성 코드의 다양한 조합을 수행하므로, 이를 탐지하는 가장 좋은 방법은 입력 검증을 위해 구축된 라이브러리를 사용하는 것입니다. 또한 SIEM 애플리케이션은 애플리케이션이 표적이 되는 경우 익스플로잇을 탐지하고 분석을 제공할 수 있습니다.
결론
EL 주입 취약점은 중요한 보안 문제로 취급되어야 합니다. 해석된 언어 애플리케이션의 주입 취약점 및 민감한 데이터를 공개할 수 있는 기타 모든 사항을 항상 테스트하십시오. 개발자는 검증 툴을 사용하여 EL 주입을 탐지하고 중지해야 하며, JSP 및 ASP를 사용하는 레거시 애플리케이션은 공격에 대해 면밀히 모니터링되어야 합니다.
퓨어스토리지는 애플리케이션을 보안 공격으로부터 보호하기 위한 보안 인프라와 위협 모니터링을 갖추고 있습니다.