본문 바로가기

저세상 해킹/웹

PHP Object Injection

웹 문제를 풀다가 신기한 기법을 발견했다.

 

php object injection이라는 것인데, 조건이 다음과 같을 때, 발현된다.

 

1. unserialize()같은 함수에 사용자 입력값이 들어가 객체로 구현될 수 있을 것

2. __destruct같은 매직 메소드를 구현한 클래스를 보유할 것

3. unserialize()호출 전 모든 클래스의 선언이 완료될 것

 

그렇다면 한번 예제를 보며 자세히 알아보자. 아래의 예제는 https://qkqhxla1.tistory.com/444를 참고했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
    class Example1
    {
        public $test;
        
        function __construct()
        {
            //something
        }
    
        function __destruct()
        {
            echo "".$test."";
        }
    }
 
    $input = unserialize($_GET['user']);
    print_r($input);
?>
cs

모범적인 예제이다.

Example1이란 클래스를 선언했고 매직메소드를 포함하고 있다.

unserialize()호출 전 클래스의 선언도 완료 되었으므로, 공격조건에 해당한다.

 

그렇다면 PHP object Injection은 어떻게 이루어 지는가? 위와같은 코드에 Example1에 마음대로 값을 넣어서 공격하려면 아래와 같은 코드를 작성하면 된다.

1
O:8:Example1:1{s:4:"test";s:5:"admin";}
cs

이러한 코드를 작성하면, test라는 변수 안에 admin이라는 값이 들어간 input이라는 객체가 선언이 완료된다.

 

즉 unserialize는 위와 같이 Object를 String으로 선언할 수 있게 해주는 아주 강력한 함수이다.

 

그렇다면 test에 private가 걸려 있으면 어떻게 선언할까?

 

이유는 잘 모르겠지만 다음과 같이 선언한다. 

1
O:8:Example1:1{s:14:"%00Example1%00test";s:5:"admin";}
cs

객체명을 붙여주고 앞에 %00으로 NULL처리를 해 주어야 admin이라는 값이 제대로 들어간다.

 

혹시나 이유를 안다면 가르쳐 주시길 바랍니다...

'저세상 해킹 > ' 카테고리의 다른 글

PHP - Magic Method  (0) 2019.09.17