EXIF 메타데이터에 PHP WebShell을 은닉한 JPEG 악성코드 분석
Analyzed date : 2022-07-29
fixed date : 2025-05-27
Ahutor : github.com/miho030
1. 개요
공격자는 웹 서버의 취약점을 이용하여 PHP 파일에 악성 코드를 삽입하고, EXIF 메타데이터에 인코딩된 악성 명령을 포함한 이미지 파일을 업로드함으로써 원격 명령 실행(RCE)을 수행할 수 있는 WebShell을 구축한다. 이러한 방식은 이미지 파일의 정상적인 외형을 유지하면서도 서버 측에서 악성 코드를 실행할 수 있어 탐지가 어렵다.
TAG : webshell, backdoor, Jpeg, php
2. 주요 내용
해당 분석에서는 JPEG 형식의 이미지 파일에 은닉된 악성 WebShell 명령문을 중심으로 정적 분석과 동적 분석 기법을 활용하여 악성 행위를 추적하였다.
1. 정적 분석
- 대상 파일의 EXIF 메타데이터를 중심으로 분석이 이루어졌으며, 'Make' 와 'Model' 필드에 base64로 인코딩된 악성 문자열이 삽입된 것을 확인하였다.
- 'make' 필드에는 "/.*/e"가 저장되어 있었으며, 이는 PHP의 preg_replace() 함수와 함께 사용될 때, 해당 문자열을 실행 가능한 코드로 변환하는 역활을 한다.
- 'Model' 필드에는 eval(base64_decode(...)) 형태의 실질적인 페이로드 코드가 저장되어 있었고, 이를 디코딩한 결과, "$_POST["zz1"]" 파라미터를 통해 명령이 전달될 수 있도록 구성되어 있었다.
필자는 EXIF 기반 WebShell이 시그니처 기반 백신 엔진을 우회할 수 있는 구조임음 강조한다.
사용된 주요 PHP 함수 및 공격 기법
- 공격자는 PHP 파일에 preg_replace() 함수를 이용해 EXIF 메타데이터의 'Make' 또는 'Model' 필드에 삽입된 base64 인코딩된 악성 코드를 eval(base64_decode(...)) 방식으로 실행하도록 구성한다.
- eval(), preg_replace(), exif_read_data(), isset(), stripslashes() 등의 함수 조합을 통해 코드 인젝션이 가능하도록 구성되었으며, preg_replace() 함수의 /e 옵션을 통한 코드 실행 취약점이 핵심적인 공격 벡터로 사용되었다.
공격 시나리오
필자는 실제 공격 시나리오를 시뮬레이션하여, 웹서버 상의 PHP코드에 exif_read_data() 및 preg_replace() 호출을 통해 악성 명령어가 실행되는 조건을 추측하였다.
- 피해 시스템 서버에 이미지 파일 업ㄹ로드
- PHP 파일에 EXIF 데이터를 읽는 악성 코드를 삽입한다.
- 악성 명령을 포함한 EXIF 메타데이터를 가진 이미지 파일을 다시 업로드한다.
- 클라이언트가 특정 파라미터를 포함한 요청을 전송한다.
- 서버는 EXIF에서 명령을 추출해 eval()로 실행한다.
이러한 유형의 공격 방식은 취약한 보안 대첵을 가진 웹서버에 있어 치명적일 수 있다. 공격자는 기존의 .php웹쉘 대신 정상 이미지 파일에 악성코드를 삽입하여 서버에 업로드함으로서 확장자 필터링 기술을 우회할 수 있다. 공격자는 해당 이미지 파일을 호출함으로서 외부에서 php 명령을 서버 내부에서 실행할 수 있으며, 이러한 방식은 보안 시스템의 허용 포트(80, 443) 내에서 동작하기 때문에 로그 회피와 탐지 회피가 동시에 이루어지는 고도화된 은닉 기술을 사용한다.
보안 대응 방안
- 이미지의 EXIF 메타데이터를 검사해 악성 코드 삽입 여부를 확인한다.
- PHP의 eval() 함수 사용을 제한하거나 비활성화한다.
- 파일 업로드 검증을 강화하여 허용된 형식과 내용을 엄격히 제한한다.
보고서 열람
* (데스크탑 환경에서 열람하면 PDF 임베드 뷰어를 통해 보고서 확인 가능)