최근 ctf 열려서 그 문제들 푸느라 한동안 buuctf를 못풀었다.

 

근데 최근 buuctf에 serialize/unserialize 문제들 나와서 풀었는데 그게 딱 pregyan ctf에 나오더라 ㅋㅋㅋ

(그 문제로 인해 rce -> 내부침투로 ctf 서버 터진건 안비밀;)

 

어쨌든 이번 문제도 serialize 관련 문제다.

 

이번에도 /www.zip 받아서 소스코드를 살펴볼 수 있었다.

 

중간에 class.php를 include하고 unserialize하는걸 확인할 수 있다.

 

class는 위와 같은데, constructor에서 username과 password를 받아 지역변수로 선언하고, destructor에서 password가 100이고 username이 admin이면 flag를 뿌려주는것을 확인할 수 있다.

 

특이한건 __wakeup() 메서드인데, 이 메서드는 object를 unserialize할때 실행되는 메서드라고 한다.

 

따라서 우리가 unserialize로 Name class를 unserializing하면 __wakeup() 메서드에 의해 username이 guest로 바뀌게 되어 플래그 출력이 불가해지는 것이다.

 

여기서 __wakeup()메서드에 관한 cve가 있었다 

 

CVE-2016-7124

https://bugs.php.net/bug.php?id=72663

 

PHP :: Sec Bug #72663 :: Create an Unexpected Object and Don't Invoke __wakeup() in Deserialization

 

bugs.php.net

 

간단하게 설명하면, new name("admin",100) 을 serializing하면

 

O:4:"Name":2:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

 

위와같이 된다.

 

여기서 Object의 serialized data format은

 

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

위와 같은데, object size를 실제 object size보다 더 크게 주면 __wakeup() 메서드가 실행이 되지 않는 버그가 CVE-2016-7124이다

 

 

따라서 object size를 늘려주고 전송해주면 __wakeup() 메서드가 실행되지 않고 admin,100조건이 맞게되어 플래그가 출력될 것이다.

 

+ Recent posts