상세 컨텐츠

본문 제목

[웹해킹] Webhacking.kr 5번 풀이

기타 정보/Webhacking.kr

by Mathgongyoo 2013. 11. 3. 13:32

본문

*웹해킹.kr 5번 풀이


페이지에 접속하면 "Login"버튼과 "Join"버튼이 떡 하니 놓여있다.

(IE로 접속하면 초록색, 파란색 글씨만 떡하니 놓여있지만 버튼은 버튼이다. 크롬으로 접속하면 예쁘게 잘 보인다.)




1. 둘러보기


 "Login"버튼을 누르면 /mem/login.php 로 가고, 로그인을 하려고 해도 뭔지 잘 모르겠다. 시험삼아 아무렇게나 치면


라면서 접근을 거부한다. 아마 id는 admin이어야 하나보다 하고 id를 admin이라 치고 비번을 아무렇게나 입력하면


라고 한다.


혹시나 admin으로 가입을 하면 될까 싶어 첫 페이지로 돌아와 Join 버튼을 눌러보면


라며 역시 출입을 불허한다.




2. 의도 파악하기


이 문제의 의도는 join을 하라는 뜻이다. 이렇게 페이지를 막아놓았을 때 그 페이지를 접속하는 방법은 무엇일까? 이는 Join 버튼의 코드를 보면 짐작할 수 있다.



Join 버튼은 해당하는 페이지 자체가 막힌 것이 아니라 페이지로 포워딩이 안 되도록 자바스크립트로 코드를 짜놓은 것에 불과했다. 여기서 우리는 guessing을 사용할 수 있다.




3. guessing하기


* Guessing이란? 페이지의 이름을 짐작하여 하이퍼링크를 통하지 않고 직접 접속하는 것.


Login 버튼을 눌렀을 때 /mem/login.php 로 가는 것을 통해, "Join 페이지로 가려면 /mem/join.php로 가면 되는 게 아닐까?" 라는 guessing을 할 수 있다. 그리고 실제로 된다.




4. 소스코드 분석


그런데 Join페이지에 접속은 성공했지만,(Guessing에 실패하면 404에러 메세지가 뜰 것이다.) 페이지에는 아무것도 없다. 혹시나 해서 소스코드를 봤더니 정말 정신없는 코드가 들어있다. 이 코드를 잘 정리해보면(엔터치고 등등) l과 I, 그리고 i를 통해 난독화한 코드라는 사실을 알 수 있다.



여기서 조건문의 앞부분은 join의 내용을 보이지 않을 조건이므로 보이는 조건인 else이하의 내용(document.write... 이하)을 Chrome의 콘솔에 붙여넣기 하면 join 폼이 나타나게 된다.


하지만 여기서 끝이 아니다.

admin 계정을 생성하려고 하면



이미 계정이 있어서 똑같은 계정을 못 만든다고 한다.

이럴 때는 '계정 이름'이라는 변수의 내용에 영향을 주지 않을만한 기호 (공백 등)를 계정 이름 뒤에 붙여주면 된다.




5. 글자수 제한 풀기


마지막 문제점이 있다. 회원가입 폼의 id에는 5글자밖에 입력할 수 없도록 되어있는 것이다.

이 문제점은 소스를 약간 손봐주는 것으로 간단하게 해결할 수 있다.

소스의 글자수를 제한하는 것은 input 내에 있는 maxlength라는 인수이다.

콘솔창에 붙여넣기한 소스를 잘 살펴보면 maxlength=5라는 내용이 있을 것이다.

이 내용을 없애거나, 적당히 큰 수로 바꾸어주면 우회용 공백을 넣은 id를 입력할 수 있게 된다.

이 방법으로 admin 계정을 만든 후 로그인하면 문제가 해결된다.





4단계는 정식으로 풀려면 난독화된 문장을 해석해서 원하는 조건을 모두 충족시켜주어야 한다.

    그 내용은 url에 "어떤 문구"가 포함되어야 하고, "어떤 쿠키"가 있어야 한다는 내용이다.


5단계의 글자수 제한은 paros라는 웹보안분석도구로도 통과할 수 있다.

    paros는 여기에서 다운받을 수 있고, 자바가 깔려있어야 한다. 사용방법은 검색을 통해 직접 알아내도록 하자.

관련글 더보기