도카이트

[Wargame] Webhacking.kr - old 5 본문

Wargame/Webhacking.kr

[Wargame] Webhacking.kr - old 5

dodoh4t 2022. 6. 14. 21:52
728x90
반응형

문제 화면

[old 5 - 문제화면]

- Login 과 Join 두 개의 버튼이 존재한다.

- Login 버튼을 클릭 시 로그인을 할 수 있는 페이지로 이동하며,

- Join 버튼을 클릭 시 Access_Denied 경고창을 출력한다. (캡처 생략)

 

 

Login 페이지

[Login 페이지 화면]

- ID와 PW를 입력하여 Login 할 수 있는 입력 폼이 출력된다.

- 아무 단서도 없이 그냥 이렇게 화면만 떡 하고 있는걸 보아… SQL Injection 문제인가..? 싶었다.

- ID에 admin을 대입 후 PW 검증을 우회하도록 SQL Injection 기본 구문들을 모두 입력해보았으나 모두 실패했다..

- 문제 초반에 join 페이지에 대한 접근이 막힌 것을 보아, 이를 우회하는 문제인가(?) 하는 생각이 들었다.

 

 

join.php 소스코드

[join.php 소스코드]

- login 페이지의 URL을 확인하여 보면, login.php 이다.

- php 파일명에 해당하는 login 부분을 join 으로 변경해주면 어떨까 싶어 join.php로 변경하여 탐색해보았다.

- 문제 첫 화면에서 join 을 클릭하였을 때처럼 access_denied 경고창을 출력한다 !

- 그러나, 바로 경고창이 열리는 것이 아니라 페이지 창이 열린 후 경고창을 출력해준 덕에,

- 개발자 도구를 이용하여 해당 페이지의 소스를 확인할 수 있었다 !

- javascript가 말도 안되게 이해 못할 문법으로 작성되어 있다.

- 기존 javascript 난독화에 관한 문제를 접해봤으므로, 바로 javascript 난독화 해제 사이트를 이용해 난독화를 해제해보자 !

 

참고 링크 : https://www.strictly-software.com/unpack-javascript

 

 

Unpacked Javascript Result

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>');
}

- 여전히 좀 복잡하긴 하지만… 해당 코드들을 직접 다 이해할 필요는 없다.

- 조건이 작성된 if 문에 관한 부분만 개발자 도구 Console 탭에서 변조하며, 실행시켜봄으로써

- 결과값을 확인하고 값을 변조해보며 조건을 수정해주면 된다 !

 

 

첫 번째 if 문 분석

[첫 번째 if 문 분석]

- Unpacked JS 코드에서 각 문자들을 정의하는 선언 내용들은 모두 생략한다.

- 첫 번째 if 문을 Console 탭에서 분석해보도록 한다.

- eval 함수 부분은 document.cookie를 나타냄을 알 수 있고,

- indexOf 함수 부분은 oldzombie를 나타냄을 알 수 있다.

- if 문은 즉, cookie 값으로 oldzombie가 존재하지 않아 거짓 (False, -1)이 될 경우 실행되는 것을 알 수 있다.

 

 

oldzombie 쿠키 생성

 

[oldzombie 쿠키 생성]

- 개발자 도구 Application 탭에서 oldzombie 쿠키를 생성한다

- 이후 두 번째 if 문을 분석 후 실행해보자 !

 

 

두 번째 if 문 분석

[두 번째 if 문 분석]

- 두 번째 if 문의 경우, 첫 번째 if 문보다 한결 수월하게 해결 가능하다.

- else 문에 해당하는 코드들이 실행되어야 Join 페이지에 대한 내용들이 출력되는 듯 하다.

- 따라서, if문에 작성된 조건에 대해 거짓 값이 나오도록 유도하여, else 문으로 실행 흐름을 넘겨야한다.

- if 문에 작성된 조건 문장의 맨 끝의 == -1== 1로 변조하여 참/거짓 을 뒤집어 else문을 실행시키도록 한다 !

 

 

join 페이지

[join 페이지 화면]

- 드디어 성공적으로 join 페이지에 접근이 가능하다 !

- 여기서 많은 내용들이 급격히 생략되었지만, 삽질하는 분들을 위해 바로 본론을 작성하자면,

- 추후 문제풀이를 하면서 알게 되겠지만, 해당 문제는 admin으로 로그인하는 것이 목표이다.

- 따라서 회원가입을 임의의 다른 경우로 하게 되면, 결국 다시 admin으로 가입하러 오는 삽질(?)을 하게 된다.

- id 값에 admin을 입력 후 pass에 임의의 값을 입력 시, admin 계정은 이미 존재한다는 경고창이 출력된다.

- 이를 우회하기 위해 Burp Suite를 이용하여 admin 바로 뒤에 URL 인코딩을 이용하여 NULL 값을 삽입한다.

 

 

Burp Suite를 이용한 NULL 값 삽입

[Burp Suite를 이용한 NULL 값 삽입]

- id 에 admin 을 입력하고, pw 값으로 1을 입력하여 submit 을 시도한다.

- 이 때, Burp Suite를 이용하여 admin 뒤에 %00 (NULL) 값을 추가 입력하여 Send 한다.

- 이전과 달리 admin 계정 존재 경고창이 출력되지 않고, 정상적으로 join 이 된다.

- 이 후, 로그인 과정도 이와 동일하게 %00 를 추가하여 로그인 시,

- 성공적으로 admin 계정으로 로그인이 가능하며, 해당 문제가 solve 된다 !

728x90

'Wargame > Webhacking.kr' 카테고리의 다른 글

[Wargame] Webhacking.kr - old 10  (0) 2022.06.15
[Wargame] Webhacking.kr - old 7  (0) 2022.06.15
[Wargame] Webhacking.kr - old 6  (0) 2022.06.14
[Wargame] Webhacking.kr - old 4  (0) 2022.06.14
[Wargame] Webhacking.kr - old 1  (0) 2022.06.14
Comments