PHP - Serialization
adminstrator 계정으로 로그인하면 되는 문제이다.
일반적인 로그인 창으로 자동로그인 기능이 있다.
문제해석
소스를 보면 중요한 부분은 문제 제목과 같은 unserialize와 serialize가 있는 부분이다.
일반적으로 로그인을 하게 되면 $data에 값이 저장되며,
autologin 쿠키값이 있을 때는 $data에 unserialize된 값이 들어가게 된다.
로그인이 성공하고 autologin이 1이 때 쿠키에 serialize된 값이 저장되며 위의 autologin 체크할 때 쓰이게 된다.
Login에 superadmin으로 로그인하면 될 것이다.
문제풀이
문제에서 주어진 guest로 autologin을 체크하고 로그인하게 되면 다음과 같이 표시되며
Cookie에 serialize된 autologin의 값이 url encoding된 형태로 표시되게 된다.
그리고 url decode를 해보면
autologin=
a:2:{s:5:"login";s:5:"guest";s:8:"password";s:64:"84983c60f7daadc1cb8698621f802c0d9f9a3c3c295c810748fb048115c186ec";};
serialize된 값을 볼 수 있고
login : guest
password : sha256된 값 으로 되어있는 것을 볼 수 있다.
s는 string / 5는 글자수 / ;로 value를 구분
이를 이용하여 우리가 원하는 superadmin으로 쿠키에 전달 할 값을 작성하려면
1. login 부분을 superadmin으로 설정
a:2:{s:5:"login";s:10:"superadmin"; }
2. password 값 설정
이후 문제는 password에 전달 되는 값이다.
위의 코드를 보면 우리가 입력한 password와 비교되는 저장된 값이 느슨한 비교(loose comparison)로 되어있음을 알 수 있다.
이를 이용하면 true와 "string"을 비교했을 때 true로 인식되어 우회 할 수 있다.
php serialize에서 boolean값은 b가 boolean을 나타내며 true나 false가아닌 1과 0으로 인식한다.
php 메뉴얼 : https://www.php.net/manual/en/function.serialize.php
autologin에 전달할 값을 이어서 작성하면
a:2:{s:5:"login";s:10:"superadmin"s:8:"password";b:1;} 가 된다.
이 값을 url decoding해서 Cookie의 autologin값에 전달하게 되면
CLEAR 할 수 있다.
구글링하면서 공부한 serialzie 취약점 문제와 이 문제는 조금차이가 있는 것 같다. 이전의 있던 type juggling를 이용하고, serialize된 글자를 해석만 하면? 풀 수 있게되는 문제같다.
생성자와 magic method를 이용한 문제들을 찾아서 풀어봐야 serialize에 대해 더 잘 이해할 수 있을 것 같다.
'Web hacking > Root me' 카테고리의 다른 글
[Root-me] - File upload - ZIP (0) | 2019.12.03 |
---|---|
[Root-me] - Local File Inclusion - Wrappers (0) | 2019.11.30 |
[Root-me] SQL injection - Error (0) | 2019.10.07 |
[Root-me] SQL Injection - Routed (0) | 2019.10.01 |
[Root-me] SQL injection - Numeric (0) | 2019.09.27 |