최근 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
간단하게 설명하면, 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조건이 맞게되어 플래그가 출력될 것이다.
'Web > BUUCTF' 카테고리의 다른 글
[BUUCTF] - [ZJCTF 2019]NiZhuanSiWei1 (0) | 2020.02.26 |
---|---|
[BUUCTF] - [极客大挑战 2019]LoveSQL1 (0) | 2020.02.26 |
[BUUCTF] - [0CTF 2016]piapiapia1 (0) | 2020.02.21 |
[BUUCTF] - [RoarCTF 2019]Easy Java1 (0) | 2020.02.18 |
[BUUCTF] - [极客大挑战 2019]Secret File1 (0) | 2020.02.18 |