일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Dremhack
- 워게임
- Cross Site Scripting
- Los
- bypass CAPTCHA
- Remote File Inclusion
- 드림핵
- 웹 해킹
- 써니나타스
- Hackerfactory
- 빡공팟 6기
- DreamHack
- TeamH4C
- 빡공팟 4기
- wargame
- webhacking.kr
- Lord of SQL Injection
- SuNiNaTas
- H4CKINGGAME
- XSS
- Insecure CAPTCHA
- File Upload Vulnerability
- DOM-Based XSS
- DVWA
- 정보보안
- 정보보호
- sql injection
- 해커팩토리
- Web Hacking
- Weak Session IDs
- Today
- Total
도카이트
[Wargame] Webhacking.kr - old 5 본문
문제 화면
- Login 과 Join 두 개의 버튼이 존재한다.
- Login 버튼을 클릭 시 로그인을 할 수 있는 페이지로 이동하며,
- Join 버튼을 클릭 시 Access_Denied 경고창을 출력한다. (캡처 생략)
Login 페이지
- ID와 PW를 입력하여 Login 할 수 있는 입력 폼이 출력된다.
- 아무 단서도 없이 그냥 이렇게 화면만 떡 하고 있는걸 보아… SQL Injection 문제인가..? 싶었다.
- ID에 admin을 대입 후 PW 검증을 우회하도록 SQL Injection 기본 구문들을 모두 입력해보았으나 모두 실패했다..
- 문제 초반에 join 페이지에 대한 접근이 막힌 것을 보아, 이를 우회하는 문제인가(?) 하는 생각이 들었다.
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 문 분석
- Unpacked JS 코드에서 각 문자들을 정의하는 선언 내용들은 모두 생략한다.
- 첫 번째 if 문을 Console 탭에서 분석해보도록 한다.
- eval 함수 부분은 document.cookie를 나타냄을 알 수 있고,
- indexOf 함수 부분은 oldzombie를 나타냄을 알 수 있다.
- if 문은 즉, cookie 값으로 oldzombie가 존재하지 않아 거짓 (False, -1)이 될 경우 실행되는 것을 알 수 있다.
oldzombie 쿠키 생성
- 개발자 도구 Application 탭에서 oldzombie 쿠키를 생성한다
- 이후 두 번째 if 문을 분석 후 실행해보자 !
두 번째 if 문 분석
- 두 번째 if 문의 경우, 첫 번째 if 문보다 한결 수월하게 해결 가능하다.
- else 문에 해당하는 코드들이 실행되어야 Join 페이지에 대한 내용들이 출력되는 듯 하다.
- 따라서, if문에 작성된 조건에 대해 거짓 값이 나오도록 유도하여, else 문으로 실행 흐름을 넘겨야한다.
- if 문에 작성된 조건 문장의 맨 끝의 == -1 을 == 1로 변조하여 참/거짓 을 뒤집어 else문을 실행시키도록 한다 !
join 페이지
- 드디어 성공적으로 join 페이지에 접근이 가능하다 !
- 여기서 많은 내용들이 급격히 생략되었지만, 삽질하는 분들을 위해 바로 본론을 작성하자면,
- 추후 문제풀이를 하면서 알게 되겠지만, 해당 문제는 admin으로 로그인하는 것이 목표이다.
- 따라서 회원가입을 임의의 다른 경우로 하게 되면, 결국 다시 admin으로 가입하러 오는 삽질(?)을 하게 된다.
- id 값에 admin을 입력 후 pass에 임의의 값을 입력 시, admin 계정은 이미 존재한다는 경고창이 출력된다.
- 이를 우회하기 위해 Burp Suite를 이용하여 admin 바로 뒤에 URL 인코딩을 이용하여 NULL 값을 삽입한다.
Burp Suite를 이용한 NULL 값 삽입
- id 에 admin 을 입력하고, pw 값으로 1을 입력하여 submit 을 시도한다.
- 이 때, Burp Suite를 이용하여 admin 뒤에 %00 (NULL) 값을 추가 입력하여 Send 한다.
- 이전과 달리 admin 계정 존재 경고창이 출력되지 않고, 정상적으로 join 이 된다.
- 이 후, 로그인 과정도 이와 동일하게 %00 를 추가하여 로그인 시,
- 성공적으로 admin 계정으로 로그인이 가능하며, 해당 문제가 solve 된다 !
'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 |