< 문제 해결 >
그림 1과 같이 admin으로 접근 시 deny 된다.
그림 2에서 userid 쿠키를 볼 수 있다. 위는 a로 로그인 시 생성되는 쿠키값이다. id 별로 쿠키 값이 다르게 생성된다 유추하였고, 아래 코드 1과 같이 admin에 해당하는 알파벳의 쿠키값을 수집하였다.
<코드 1>
a
MGNjMTc1YjljMGYxYjZhODMxYzM5OWUyNjk3NzI2NjE%3D
d
ODI3N2UwOTEwZDc1MDE5NWI0NDg3OTc2MTZlMDkxYWQ%3D
m
NmY4ZjU3NzE1MDkwZGEyNjMyNDUzOTg4ZDlhMTUwMWI%3D
i
ODY1YzBjMGI0YWIwZTA2M2U1Y2FhMzM4N2MxYTg3NDE%3D
n
N2I4Yjk2NWFkNGJjYTBlNDFhYjUxZGU3YjMxMzYzYTE%3D
그러나 위 코드 1을 토대로 admin을 조합한다면, 로그인할 수 없었다. 아래 코드 2는 ad로 로그인 시 얻을 수 있는 cookie 값이다. 어떤 알파벳으로 조합되느냐에 따라 쿠키값이 달라짐을 확인하였다.
< 코드 2>
MGNjMTc1YjljMGYxYjZhODMxYzM5OWUyNjk3NzI2NjE4Mjc3ZTA5MTBkNzUwMTk1YjQ0ODc5NzYxNmUwOTFhZA%3D%3D
그림 3은 처음 로그인을 위한 페이지를 개발자 도구를 통해 확인한 것이다. 입력 길이를 클라이언트단에서 정하고 있으므로, 5 -> 6으로 변경한 후 admin1로 로그인을 시도하였다. 그런 후 admin2로도 로그인을 시도 후 쿠키 값을 획득해 비교하였다.
그림 4와 같이 admin1, 2이기에 다른 부분이 존재하였고, 앞의 공통된 부분은 admin 일것이라 유추할 수 있었다.
다른 아이디로 접속 후, admin이라 유추되는 쿠키 값을 대입한 후 새로고침해준다.
< 내용 추가 >
1. 예를들어, id= a이면, 이를 md5 해시한 후 base 64 인코딩 과 URL 인코딩을 한 값이 쿠키의 값으로 설정된다는 것을 알게 되었다. MD5 해시 암호의 특징은 16진수이며, 32자리의 값이 출력되어진다.
2. /?id=ad%00min 과 같이 널바이트 우회문자 삽입을 통해 문제를 해결할 수도 있었다.
3. ?ad%20min , admin-- 등의 injection 도 가능하였다.
한줄 평 : 오랜만에 기분 좋은 문제