2016. 8. 12. 18:27 :: 문제풀이/WebHacking,kr

안녕하세요. Message입니다.

Webhacking.kr Lv5 문제풀이 달립니다!

! 빠른 문제풀이 보다는 풀이과정 속에서 이것 저것 배우는것을 목표로 합니다.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

1. 문제분석

------------------------------------------------------------------------------------------------------------------------------------------

 

5번 문제에 접속하면 아래와 같은 화면이 우리를 반겨줍니다.

 

소스를 살펴보아도 별다른건 보이지 않습니다.

Join 버튼을 눌러보아도, 역시 소스코드대로 "Access_Denied" 경고창이 뜨는군요.

 

Login 버튼을 눌러 다음으로 넘어가면 이러한 화면이 나옵니다.

지난번 문제에서 처럼, Burp를 이용하여 간단히 SQl Injection을 수행해 보았으나,

별다른 취약점은 발견하지 못했습니다.

 

이제 다른 루트를 모색해봐야 할 것 같군요!

 

 

------------------------------------------------------------------------------------------------------------------------------------------

2. 문제풀이

------------------------------------------------------------------------------------------------------------------------------------------

 

1) 디렉토리 리스팅

Join 버튼을 괜히 넣어놓지는 않았을겁니다.

그렇다면 join을 할 수 있는 다른 페이지가 존재하는가? 라는 의문이 들었드랬죠.

소스코드에서는 발견할 수 없었으니, 다른 페이지가 존재하는지 여부를 살펴봐야합니다.

join 페이지를 추측해서 일단 넣어보는 방법도 있겠지만,

디렉토리 리스팅이 통한다면 가장 편한 방법이겠죠! 한번 시도해봅니다.

 

join.php 의 존재를 확인하였으니, 접속해봅니다.

그러면 검은색 화면이 우리를 반겨줍니다.

소스코드를 확인하면 아래와 같이 난독화된 소스를 볼 수 있습니다.

 

 

2) 난독화 & 지핑 해제

난독화된 소스를 한눈에 알아보기 쉽지 않습니다.

다른분들의 풀이도 살펴보고, 나름대로의 검색을 통해서

난독화되거나 정렬되어 있지 않은 JScript를 분석하는 방법은 대체로 아래와 같더군요.

Malzilla / Format Code 기능

Notepad++ / JSFormat(JSTool Plugin) 기능

 IE 개발자도구 / Console 기능

 온라인 Unpack & Deobfuscator 이용

--------------------------------------------------------------------------------------

- Malzilla : https://sourceforge.net/projects/malzilla/?source=typ_redirect

- Notepad++ : https://notepad-plus-plus.org

- Online Javascript Deobfuscator : http://jsbeautifier.org

--------------------------------------------------------------------------------------

 

 

방법1 : Malzilla / Format code

정리된 소스코드의 윗부분은 주로 선언부인것 같네요.

 

아랫부분에 주요 소스코드가 나옵니다.

주요 골자는 2개의 if 조건과, else 조건으로 보입니다.

그중에서도 else 문이 핵심인듯 하여, 좀더 세밀하게 정리해봅니다.

 

document.write() 메소드를 이용하여 붉은색의 html 소스를 추가로 입력하는 것으로 보입니다.

특정 변수가 있다면, alert() 메소드로 난독화가 해제된 소스코드를 보겠지만

일일이 wirte() 를 이용했기 때문에 손으로 어느정도 정리해 줘야 겠군요!

 

 

방법2 : Notepad++ / JSFormat

정렬 기능을 사용하기 위해 JSTool 플러그인을 설치해줍니다.

 

이후에 JSTool의 JSFormat 기능을 선택하여 정렬해줍니다.

 

Malzilla보다 조금더 안정감 있게 정리된 느낌이네요.

 

Notepad++의 장점은, 윈도우에 기본적으로 설치되어 있는 Notepad 보다

우수한 성능의 replace(바꾸기, Ctrl+H) 기능을 제공해줍니다.

특히 바꾸고 싶은 문자열을 더블클릭해서 단축키를 누를경우, 좀더 편리하게 바꿀 수 있으며,

Notepad에서는 할 수 없는 개행문자도 변경가능합니다.

 

파이썬으로 변경하신분도 있으시던데, 저의 경우 그냥 바꾸기 기능을 이용하여 아래와 같이 정렬했습니다.

대소문자 구분과 단어 완전일치를 체크해주지 않으면, 엉뚱한 문자들이 교체될 수 있습니다.

대략 살펴보면 아래와 같습니다.

- document.cookie 에서 "oldzombie" 문자열이 없으면 --> bye

- document.url 에서 mode 값이 1이 아니면 "access.denied"

- 모두 충족되면 document.write

 

그래서 cooxie 툴바를 이용하여 cookie값에 "oldzombie" 문자열을 넣어주고

URL에는 mode=1 값을 넣어주면 됩니다. (http://webhacking.kr/challenge/web/web-05/mem/join.php?mode=1)

그럼 정상적인 회원가입 폼을 만날 수 있습니다.

 

 

방법3 : IE 개발자도구 / Console

난독화되거나, 지핑된 코드는 정렬 기능을 가진 도구를 이용해도

난독화가 쉽게 풀리지 않는 경우가 많습니다.

IE 개발자도구의 콘솔기능을 이용하면, 현재 웹페이지의 소스코드를 고치지 않고도

변수등을 alert로 찍어볼 수 있습니다. 

 

특히 저희가 풀고 있는 문제에서는 document.write 부분만 따로 복사하여

콘솔부분에 붙여 넣으면, 조건문을 거치지 않고도 회원가입 스크립트를 볼 수 있습니다.

해당 폼에 회원가입을 해도 정상적인 쿼리값이 전송됩니다.

 

 

3) 회원가입

우리는 admin ID값으로 로그인 해야하므로,

admin으로 회원가입을 해보면 아래와 같은 이미 존재한다는 창이 뜹니다.

 

그렇다면, admin으로 로그인은 하되

글자는 admin이 아닌 경우를 생각해야하는데,

만약 서버가 사용자 입력값을 trim() 한다면 space 값을 이용하여 우회할 수 있는 여지가 생깁니다.

하지만 글자 길이가 5자리로 제한되어 있으므로, 프록시툴로 우회해줍니다.

 

회원가입이 완료되었습니다.

 

로그인을 시도해볼까요?

 

 

 Tip. JScript - indexOf

 문자열 중에서 특정 문자나 문자열의 위치를 말해주는 메소드로,

 특정 문자가 있는지 없는지를 판단하는 메소드.

 시작위치를 지정해주지 않으면, 전체 문자열에서 처음부터 검사합니다.

 ex) alert("redscreen".indexOf("r")) 의 결과값은 0 입니다.

 

 Tip. Javascript의 세미콜론

 자바스크립트는 문장 끝에 세미콜론을 입력하지 않아도 프로그램을 실행하는데 문제가 없습니다.

 하지만 대부분의 프로그래밍 언어가 문장 끝에 세미콜론을 입력하므로 자바스크립트도 관례상 입력합니다.

 

posted by Red_Message