본문 바로가기
Write Up/webhacking.kr_old

Webhacking.kr Challenge(old)_5번문제

by 비원(Be one) 2020. 1. 13.
반응형

여러분 안녕하세요. 세이버입니다.

 

이번 시간에는 Webhacking.kr Challenge old 5번 문제를 풀어보도록 하겠습니다.

 

5번 문제는 과거의 문제와 비슷한 유형이니 기존의 강의를 보고 오시길 추천드립니다.

Webhacking.kr 문제풀이_Part6_5번 문제 : https://poci.tistory.com/58

 

Webhacking.kr 문제풀이_Part6_5번 문제

여러분 안녕하세요. POCI입니다. 이번 시간에는 Webhacking.kr의 5번 문제를 풀어보도록 하겠습니다. 1. 사이트 둘러보기 5번 문제에 들어가면 Login 버튼 하나와 Join 버튼 하나가 나옵니다. Login 버튼을 누..

poci.tistory.com


1. 문제 파악하기

5번 문제를 클릭해봅시다.

 

옆에 데이터베이스 아이콘이 있는 걸로 보아 데이터베이스 관련 문제일 거 같습니다.

 

5번 문제를 클릭하면 검은 화면에 Login 버튼 하나와 Join 버튼 하나가 나옵니다.

 

Login 버튼을 누르면 로그인을 할 수 있게끔 아이디와 비밀번호를 입력하는 페이지가 나옵니다.

 

한번 webhacking.kr의 아이디와 비밀번호를 입력해봤습니다.

 

그랬더니 Wrong password가 뜨고 로그인이 되지 않습니다.

그래서 패스워드가 잘못됐나 하고 다른 패스워드로도 해봤는데 결과는 마찬가지였습니다.

 

다시 처음으로 돌아가서 Join 버튼을 눌러봅시다.

Join 버튼을 누르면 접근이 허가되지 않는다는 메시지가 뜹니다.

 

그럼 회원가입을 하기 위한 페이지로 가는 것이 문제겠네요.

 

즉, 이 문제를 풀기 위해서는 회원가입 페이지에 접속해서 admin 아이디를 만들어서 로그인해야 한다는 의미입니다.

 

2. 디렉터리를 이동해 Join으로 접근하기

웹페이지는 각각의 디렉터리로 이루어져 있습니다.

Login 버튼을 눌렀을 때의 url을 보시면 다음과 같습니다.

 

이 url의 뜻은 webhacking.kr 디렉터리 밑의 challenge 디렉터리 밑의 web 디렉터리 밑의 web-05 디렉터리 밑의 mem 디렉터리에 있는 login.php 파일을 의미합니다.

그림으로 표현한 것

한번 url에서 login.php을 지워보겠습니다.

그러면 webhacking.kr/challenge/web/web-05/mem으로 들어오게 됩니다.

 

원래라면 여기는 아무나 들어와서는 안 되는 곳이라서 따로 구분을 해줘야 하지만, 구분을 해주지 않아서 발생한 취약점 때문에 이 곳에 접근할 수 있습니다. 

 

보시면 join.php와 login.php가 있습니다. login.php는 아까 확인한 곳이므로 회원가입을 위해서는 join.php를 열어야 할거 같습니다.

 

join.php를 클릭하면 아무것도 없이 까만 화면만 나오게 됩니다.

 

????? 뭐가 잘못됐나???

페이지의 소스코드를 확인해봅시다.

 

이런...

코드가 난잡하게 쓰여있는 걸 보실 수 있습니다.

개행을 제대로 안 하면 코드의 가독성이 저렇게 떨어집니다. 개행하는 습관을 들이도록 합시다.

 

페이지에 아무것도 없는 건 페이크였습니다. 소스코드를 발견한 게 중요했습니다.

 

훼이크다

 

3. 코드 해독하기

https://www.strictly-software.com/unpack-javascript에서 개행을 자동적으로 해주므로 이 사이트를 이용합시다.

 

이제야 좀 읽을 수 있게 되었습니다.

난독화가 해제된 코드를 보면 다음과 같습니다.

l = 'a';
ll = 'b';
lll = 'c';
llll = 'd';
lllll = 'e';
llllll = 'f';
lllllll = 'g';
llllllll = 'h';
lllllllll = 'i';
llllllllll = 'j';
lllllllllll = 'k';
llllllllllll = 'l';
lllllllllllll = 'm';
llllllllllllll = 'n';
lllllllllllllll = 'o';
llllllllllllllll = 'p';
lllllllllllllllll = 'q';
llllllllllllllllll = 'r';
lllllllllllllllllll = 's';
llllllllllllllllllll = 't';
lllllllllllllllllllll = 'u';
llllllllllllllllllllll = 'v';
lllllllllllllllllllllll = 'w';
llllllllllllllllllllllll = 'x';
lllllllllllllllllllllllll = 'y';
llllllllllllllllllllllllll = 'z';
I = '1';
II = '2';
III = '3';
IIII = '4';
IIIII = '5';
IIIIII = '6';
IIIIIII = '7';
IIIIIIII = '8';
IIIIIIIII = '9';
IIIIIIIIII = '0';
li = '.';
ii = '<';
iii = '>';
lIllIllIllIllIllIllIllIllIllIl = lllllllllllllll + llllllllllll + llll + llllllllllllllllllllllllll + lllllllllllllll + lllllllllllll + ll + lllllllll + lllll;
lIIIIIIIIIIIIIIIIIIl = llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + lll + lllllllllllllll + lllllllllllllll + lllllllllll + lllllllll + lllll;
if (eval(lIIIIIIIIIIIIIIIIIIl).indexOf(lIllIllIllIllIllIllIllIllIllIl) == -1) {
	alert('bye');
	throw "stop";
}
if (eval(llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + 'U' + 'R' + 'L').indexOf(lllllllllllll + lllllllllllllll + llll + lllll + '=' + I) == -1) {
	alert('access_denied');
	throw "stop";
} else {
	document.write('<font size=2 color=white>Join</font><p>');
	document.write('.<p>.<p>.<p>.<p>.<p>');
	document.write('<form method=post action=' + llllllllll + lllllllllllllll + lllllllll + llllllllllllll + li + llllllllllllllll + llllllll + llllllllllllllll + '>');
	document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name=' + lllllllll + llll + ' maxlength=20></td></tr>');
	document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=' + llllllllllllllll + lllllllllllllllllllllll + '></td></tr>');
	document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}

난독화가 해제되어도 l와 i가 너무 많고, 다 비슷비슷한 변수명으로 되어있어서 해석하기 어렵습니다.

그래서 이걸 해석하기 위해 크롬의 Console 기능을 사용했습니다.

 

F12를 눌러 개발자 모드로 들어간 다음, Console을 클릭합니다.

 

여기에 코드의 변수 지정부를 복사해서 붙여넣기 합니다.

 

이제 코드 중간중간에 있는 난독화 된 부분을 복사-붙여넣기 하면 그 부분이 뭘 의미하는지 해석해줍니다.

 

이런 식으로 해석한 부분은 다음과 같습니다.

if (eval(document.cookie).indexOf(oldzombie) == -1) {
    bye;
}
if (eval(document.URL).indexOf(mode=1) == -1) {
    alert('access_denied');
    history.go( - 1);
} else {
    document.write('<font size=2 color=white>Join</font><p>');
    document.write('.<p>.<p>.<p>.<p>.<p>');
    document.write('<form method=post action=join.php>');
    document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name=id maxlength=5></td></tr>');
    document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=pw maxlength=10></td></tr>');
    document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
}

코드를 하나씩 해석해보겠습니다.

 

if(eval(document.cookie).indexOf(oldzombie)==-1) {

    bye;

}

이 코드는 oldzombie라는 쿠킷값이 없다면 bye를 호출한다는 의미입니다.

 

if(eval(document.URL).indexof(mode=1)==-1){

    alert('access_denied');

    history.go(-1);

}

이 코드는 URL에 mode=1이 없으면 access_denied 메시지를 띄우고 이전 페이지로 돌아간다는 의미입니다.

아래 else 부분은 URL에 mode=1이 있으면 이러이러한 html를 띄운다는 의미입니다.

 

즉, oldzombie라는 쿠킷값이 필요하고 URL에 mode=1이 있어야 회원가입 페이지가 활성화된다는 의미입니다.

 

EditThisCookie로 oldzombie 쿠키를 추가합니다.

 

쿠키값은 아무거나 넣어도 상관없습니다.

 

그리고 URL 뒤에 ?mode=1를 추가합니다.

 

그러면 회원가입을 할 수 있는 박스가 나옵니다.

 

 

4. 회원 가입하기

admin 아이디가 필요하기에 id에는 admin, pass에는 아무 문자를 넣어주고 제출을 클릭합니다.

 

하지만 admin는 이미 있는 아이디라고 뜹니다.

 

예전에는 아이디 란의 maxlength를 바꿔서 풀었지만, 문제가 개편되어 그 방법으로는 해결되지 않습니다.

 

Burp Suite를 이용해서 아이디의 admin뒤에 공백을 의미하는 특수 코드 %20과 NULL을 의미하는 특수 코드 %00을 넣어줍니다.

Burp Suite - 패킷 위변조 프로그램 : https://poci.tistory.com/53

 

Burp Suite - 패킷 위변조 프로그램

1. Burp Suite란?? Burp Suite(버프 스위트)는 프록시 서버를 사용하여 클라이언트와 서버가 주고받는 패킷을 가로채 위변조가 가능하게 해주는 프로그램으로, 웹해킹에서 주로 쓰입니다. 2. 설치법 우선 Burp S..

poci.tistory.com

그러면 회원가입이 완료되었다는 메시지가 뜹니다.

 

이제 login 화면으로 가서 로그인을 합니다.

단, 아까처럼 Burp Suite를 이용해서 admin%20%00으로 바꿔서 로그인해야 합니다.

 

그럼 로그인이 완료되어 문제가 풀렸다는 메시지가 나옵니다.

 


이번 강의는 여기까지입니다.

5번 문제는 조금 난해했지만, 차근차근 풀어보면 쉽게 풀 수 있는 문제였습니다.

 

오늘도 수고하셨습니다.

 


정리

- 디렉터리 이동을 통해 join.php로 이동한다.

- 난독화된 코드를 해석한다.

- Burp Suite를 이용해 아이디 값을 조금 변화시켜준다.

- 회원 가입할 때 입력했던 아이디와 비밀번호를 입력해서 admin으로 로그인한다.


강의가 유익하셨거나 마음에 드셨으면 댓글과 좋아요, 구독 부탁드립니다.

궁금하신 점이나 질문은 댓글이나 메일 남겨주세요.

 

poci5003@gmail.com

 

반응형