[Hacking] Object Injection

Pongchi·2022년 7월 1일
0

Hacking - WEB

목록 보기
3/3

Introduction

  • 주로 PHP와 Ruby 언어에서 일어날 수 있는 공격임. (Python 가능!)
  • 검증되지 않은 입력값을 이용해 어떤 Object를 주입해 서버가 읽어들이는 과정에서 Injection 가능

필자는 Goorm.io(구름) 환경에서 PHP언어를 이용해 실습을 해볼거임
즉, PHP에 관한 내용만 있을거


PHP Object Injection

  • PHP에서 Object는 클래스가 인스턴스회된 객체를 의미.
  • 안에는 해당 Object의 메서드, 변수 등 값이 포함되어 있음
  • 공격자의 역량에 따라 Code Inectjion, SQL Injection, Path Traversal 및 Application Denial of Service와 같은 다양한 종류의 공격이 가능
  • <중요> 사용자가 입력한 값이 unserialize() PHP 함수에 전달되면서 Object Injection이 가능
    PHP는 객체 직렬화를 허용하므로 공격자는 임시 직렬화된 문자열을 취약한 unserialize() 호출에 전달하여 임의 PHP 객체를 주입할 수 있음

Object Injection을 하기위한 조건

  1. PHP Magic Methods
  2. unserialize()

PHP Magic Methods 란?

PHP 클래스에는 Magic 함수라 불리는 매직 메서드가 있음

  • 매직 메서드의 특징은 "__" 로 시작한다는 것!
    ex) __construct(), __destruct(), __toString(), __wakeip()

  • __construct() : 클래스 생성자.

  • __destruct() : 클래스 소멸자

  • __toString() : Object를 문자열처럼 출력할 수 있는 경우 메서드 호출

  • __wakeup() : 직렬화 중에 손실되었을 수 있는 모든 데이터베이스 연결을 다시 설정하고 초기화 작업 수행

serialize()와 unserialize() 특징

  • serialize()는 클래스에서 매직 메서드 __sleep() function이 있는지 확인.
    즉, 해당 함수는 직려화 전에 실행됨
  • unserialize()는 클래스에 매직 메서드 __wakeup() function이 있는지 확인.
    해당 함수가 있는 경우 개체가 가질 수 있는 모든 리소스를 재구성할 수 있음

실습

  • 실습을 보며 간단하게 알아보자!
  • index.php와 object.php가 있고 코드는 아래와 같다.
// 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";}

[ 해석 ]

  • 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
  • 7 - string length
  • pongchi - string name. 여기서 pongchi는 임의 문자열 입력한 것임.
    <주의> : 위 폼 양식에 하나라도 틀리면 제대로 동작하지 않음

testA 클래스를 출력해보자!

http://localhost/?input=O:5:"testA":3:{s:10:"ctf_field1";s:3:"web";s:10:"ctf_field2";s:3:"rev";s:11:"php_version";i:8;}


데이터 타입들

String

s:size:value;

Integer

i:value;

Boolean

b:value; (true, false, 1, 0)

Null

N;

Array

a:size:{key definition;value definition;(repeated per element)}

Object

O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)


참고(Reference)

profile
- I'm going to be a ???

0개의 댓글

관련 채용 정보