[Webhacking.kr] Webhacking.kr 5번 문제 풀이
# 본 포스팅은 Webhacking.kr 워게임사이트의 문제를 해결하는 과정을
지극히 개인적인 관점에서 작성한 글이므로,
문제해결을 위한 시행착오의 과정이 포함될 수 있습니다.
■문제화면
■문제분석
■문제풀이
1. 아이디, 패스워드 입력필드를 보면 왠지 SQL Injection AB(Auth Bypass)를 시전해보고싶은 충동으로 먼저 Login 메뉴로 이동해서 ' or 1=1-- 시도해보았다.
2. 안된다. Access Denied! It is not admin… admin이 아니라서 접근이 거부 당했다.
3. admin 계정이 있을 수도 있겠다 싶어 admin 계정으로 다시 한번 Auth Bypass를 시전해보자.
4. 역시 2번과 같이 admin이 아니라 접근 거부라고 뜨면서 인증우회가 안된다.
5. 문제 초기화면의 소스를 우선 살펴 보기로 했다.
오호라! Login.php 페이지가 mem 디렉토리에 있음을 알 수 있었다.
그렇다면 일단 Directory Indexing 을 한번 해기로 했다.
6. Directory Indexing 취약점을 이용하여 join.php 페이지를 발견했다.
7. join.php로 직접 접근하면 가입 페이지로 이동할 것 같아 시도해보니 왠걸?
캄캄한 페이지만 나올뿐!! 그렇다면 해당 페이지의 소스를 보자.
8. join.php의 소스를 보니 알파벳과 숫자, 특수문자를 변수들에 할당하고, 그 변수를 활용하여 소스를 작성했음을 알 수 있었다.
9. 읽기 수월하게 바꾸기 위해 NOTEPAD++을 이용하여 변수를 원래의 문자로 바꾸고 개행을 해보았다.
소스는 아래의 동작을 수행하는 것 같다.
(1) cookie에 oldzombie 문자열이 없으면 bye
(2) URL에 mode=‘1’이 없으면 access_denied 경고창 발생 후
이전 페이지로 Back
(3) 그 외는 id.pw 입력 필드가 있는 페이지로 이동됨.
즉, (1)과 (2)의 조건을 우회해야 할 것으로 보인다.
-. Cookie 조작 : oldzombie 문자열을 추가
-. URL 조작 : mode=‘1’ 추가
10. IE 브라우저와 Cooxie를 이용하여 cookie에 oldzombie를 추가입력하고 mem/join.php로 접근해보았다.
access_denied Alert창이 뜬다. 즉 (1)번 조건문은 우회한 것으로 보인다.
아닌가? 흠..
11. (2)번 조건문도 skip하기 위해 URL에 mode=1을 파라미터 형태로 추가해보았다.
짜잔~!! Join.php 페이지로 들어왔다.
12. Id와 Pass를 d_key로 입력하여 ‘쿼리전송’ 버튼을 눌렀더니 Done!..
됐다고 하니 다음 절차는 d_key로 로그인을 해보자.
(소스를 확인하니 id는 maxlength=5, pass는 maxlength=10으로 되어있음)
13. join.php로 생성한 d_key 계정으로 로그인을 시도해보았다.
로그인이 안된다..... Admin이 아니라고 한다. 하~ 처음부터 확인한 사항이면서
왜 잊고 있었던 것일까? 부끄럽다.
14. join.php에서 id 입력을 최대 5자리로 제한한 점이 의심스러워 IE의 개발자도구를
통해 id의 maxlength를 10으로 바꾼 후 id에 admin + space로 가입을 해보았다.
sign up이라는 문구가 나오고, login.php로 이동하여 admin/1234로 로그인하면 성공!!
Mission Clear~~~~~~~~!!