필자는 Goorm.io(구름) 환경에서 PHP언어를 이용해 실습을 해볼거임
즉, PHP에 관한 내용만 있을거
- PHP에서 Object는 클래스가 인스턴스회된 객체를 의미.
- 안에는 해당 Object의 메서드, 변수 등 값이 포함되어 있음
- 공격자의 역량에 따라 Code Inectjion, SQL Injection, Path Traversal 및 Application Denial of Service와 같은 다양한 종류의 공격이 가능
- <중요> 사용자가 입력한 값이 unserialize() PHP 함수에 전달되면서 Object Injection이 가능
PHP는 객체 직렬화를 허용하므로 공격자는 임시 직렬화된 문자열을 취약한 unserialize() 호출에 전달하여 임의 PHP 객체를 주입할 수 있음
PHP 클래스에는 Magic 함수라 불리는 매직 메서드가 있음
매직 메서드의 특징은 "__" 로 시작한다는 것!
ex) __construct(), __destruct(), __toString(), __wakeip()
__construct() : 클래스 생성자.
__destruct() : 클래스 소멸자
__toString() : Object를 문자열처럼 출력할 수 있는 경우 메서드 호출
__wakeup() : 직렬화 중에 손실되었을 수 있는 모든 데이터베이스 연결을 다시 설정하고 초기화 작업 수행
// object.php
<?php
class testA {
public $ctf_field1 = '';
public $ctf_field2 = '';
public $php_version = 7;
public function __wakeup() {
echo 'CTF Field: ' . $this->ctf_field1 . ' and ' . $this->ctf_field2 . ' // php version: ' . $this->php_version . ' <br/>';
}
}
class testB {
public $id = 'admin';
public function __destruct() {
echo 'user id: ' . $this->id . ' <br/>';
}
}
?>
// index.php
<?php
include 'object.php';
$obj = new testB();
unserialize($_GET['input']);
?>
: index.php 페이지에 들어가면 뜨는 화면이다. 당연한 것임.
코드를 대충 보면 object.php 파일을 가지고 와서 안에 있는 testB 를 인스턴스화 시켜 $obj에 넣는다.
그리고 GET방식으로 input 값을 가져와 역직렬화를 함.
user id: admin이 뜨는 이유는 testB 클래스의 destruct 매직 메서드가 있기에 PHP Script가 종료되면 obj 또한 사라지면서 echo가 수행이 되는 모습.
http://localhost/?input=O:5:"testB":1:{s:2:"id";s:8:"pongchi";}
[ 해석 ]
s:size:value;
i:value;
b:value; (true, false, 1, 0)
N;
a:size:{key definition;value definition;(repeated per element)}
O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)