This lab uses a serialization-based session mechanism and is vulnerable to privilege escalation as a result. To solve the lab, edit the serialized object in the session cookie to exploit this vulnerability and gain administrative privileges. Then, delete the user carlos
.
You can log in to your own account using the following credentials: wiener:peter
lab에 들어가면 가상 shop 사이트가 나온다.
wiener:peter
목표
session 쿠키에서 serialize된 값을 변경하여 관리 권한을 얻는다.
그리고 carlos를 삭제한다.
일단 burpsuite를 켠 상태에서 주어진 id:password로 로그인을 한다. 그리고 나서 history를 확인하면 cookie 값이 들어온 것을 확인할 수 있다.
해당 쿠키 session 값은 serialize로 된 값이 아니다. 이런 쿠키값은 기본적으로 base64일 가능성이 있다. 쿠키값을 선택하면 해당값이 decode된 상태로 나오는 것을 확인할 수 있다.
값은 O:4:"User":2:{s:8:"username";s:6:"wiener";s:5:"admin";b:0;}
로 되어 있는데 해석을 하면 4글자인 User
클래스에 2가지 종류에 값이 있고(String, boolean), string 형태의 8글자인 username
에 string형태인 6글자인 wiener
가 들어가 있고, string 형태인 admin
에 boolean형태의 값인 0
이 들어가 있다.
admin
값이 0인 것으로 봤을 때 이 부분을 1로 변경을 해서 cookie값에 넣으면 관리권한을 획득할 수 있을 것이다.(권한상승)
값을 1로 변경 후 burpsuite decoder에서 값을 base64로 encode한다.
이 값을 개발자도구를 이용해서 cookie값을 변경한다.
이제 관리자창을 찾아야 하는데 기본적으로 admin
, administrator
등을 넣어서 찾아볼 수 있다. 또는 kali 리눅스를 사용하는 경우, /usr/share/wordlists/dirb/common.txt
를 참고해도 좋다. 자동화툴(burpsuite repeater, gobuster 등)을 사용해서 찾아볼 수도 있다.(하지만 서버에 부화를 가져올 수 있기 때문에 함부로 사용하지 않는 것이 좋다.)
/admin
을 했을 때 관리자창이 나온다.
그리고 carlos
를 삭제하면 문제가 풀린다.
이 취약점은 insecure deserialization이다.
간단하게 직렬화(serialize)는 객체를 데이터스트림으로 만드는 것을 부르고, 역직렬화는 그것을 다시 원래대로 돌리는 것을 말한다.
직렬화(serialize)와 역직렬화(unserialize, deserialize)가 필요한 이유는 값 직렬화하여 메모리에 저장하거나 네트워크 통신에 사용하기 위해서이다. 하지만 serizlize된 값을 변조할 수 있고, deserialize 전에 무결성을 확인하지 않으면 바로 이런 문제가 생길 수 있다.
해결 방안으로는 deserialize를 하기 전에 무결성을 체크를 하는 것이 해결방안이 될 거 같다.