WarGame/Webhacking.kr

old-5

cyanhe_wh 2020. 2. 20. 14:03
반응형

[그림 1-1] 문제 5 페이지
[그림 1-2] 문제 5 페이지 소스코드

5번 문제를 들어가면 딱 2개의 버튼이 존재한다. 혹시 모르니 소스코드를 확인하였다. 확인해보면 자바스크립트가 존재하는데 Join을 누르면 그냥 메시지 박스로 접속 거부 문구만 띄운다. 두 번째로 Login 버튼을 누르면 mem/login.php 페이지로 이동한다. 일단 한번 가보자.

[그림 1-3] Login 페이지

해당 페이지를 보면 정말 id, pw 입력하는 것 밖에 없다. 그래서 첫 번째로 생각한 게 Blind SQL injection이었다.

그래서 여러 테스트를 해봤다. 아이디 또는 패스워드 하나라도 입력을 안 하면 아무 값도 안 떴다.

[그림 1-4] 실패 문구

아이디, 패스워드에 아무 값이나 넣으면 무조건 [그림 1-4]처럼 패스워드가 틀렸다고만 떴다. 그래서 Blind SQL Injection은 아닌 것 같다고 생각했다. 방향을 바꿔서 소스코드를 다시 보기로 했다.

그래서 [그림 1-2] 메인 페이지 소스코드를 다시 봤다. 보면서 Join이라는 버튼을 괜히 주어진 게 아니라는 생각이 들었고 Join버튼은 있는데 거부해놨다는 것은 Join을 찾아 들어가 그곳에서 문제를 풀 실마리가 있다고 생각했다.

Login페이지가 /mem/login.php 이니까 Join은 /mem/join.php 가 아닐까 그냥 유추해보았다.

[그림 1-5] join.php 페이지

유추한다로 들어가 보니까 정말 페이지가 있었다. 그리고 거부 메시지가 떴다.

[그림 1-6] mem 디렉토리

혹시 몰라서 mem 경로로 가서 또 뭐가 있다 확인해봤다. 확인해보니 login.php와 join.php 딱 두 개가 있었다.

그럼 이제 join.php만 분석해보면 될 것 같다. 소스코드를 확인해보자!

[그림 1-7] join.php 소스코드

코드를 확인해보니 자바스크립트가 있는데 간단하게 난독화? 너무 쉽게 돼있어서 난독화라고 하기도 그렇다... ㅎㅎㅎ

어쨌든 코드가 존재한다. 저 코드를 이제 보기 편하게 온라인도 있지만 그냥 파이썬으로 보기 편하게 출력해보겠다.

[그림 1-8] python으로 난독화 풀기

이렇게 코드를 짜서 출력해보겠다.

[그림 1-9] javascript 원본 코드

출력해보면 실제 자바스크립트가 어떻게 써져있는지 볼 수 있다.

코드를 하나하나 분석해보자!

첫 번째 if 문에서 eval 함수를 통해 쿠키값을 확인한다. 쿠키값에 "oldzombie" 문자열이 존재하면 넘어가고 아니면 -1을 반환해 결국 if 문안에 들어가 bye라는 메시지 박스를 띄우고 끝난다.

두 번째 if 문은 위랑 같이 eval 함수로 url 값에 "mode=1" 문자열이 있으면 넘어가고 아니면 -1을 반환해 거부 메시지를 띄우고 끝난다.

마지막으로 쿠키값에 "oldzombie"가 있고 url에 "mode=1"가 있으면 가입하는 페이지가 띄는 것 같다.

일단 두 조건을 하나하나 만족시켜 페이지를 띄워보자.

[그림 1-10] 쿠키값 변경
[그림 1-11] Join 페이지

[그림 1-10] 쿠키값을 "oldzombie" 값으로 바꾸고, [그림 1-11] url에 "mode=1"을 넣었더니 2개의 if문을 다 넘어가 Join페이지가 열리는 것을 확인할 수 있다. 이제 여기서 회원가입을 할 수 있다.

일단 테스트로 id = test, pw = a 이렇게 회원가입을 하고 Login 페이지에서 로그인을 해보겠다.

[그림 1-12] 회원가입

이렇게 해서 회원가입에 성공하는 것을 볼 수 있다. 이제 로그인 페이지에서 로그인해보자.

[그림 1-13] test 로그인

이렇게 로그인을 하면 "Hello test You have to login as admin" 이란 문구가 나온다 결국 admin이라는 계정으로 로그인을 하라는 것이다. 그것이 이 문제를 푸는 답인 것 같다. 이번에는 admin이라는 계정으로 회원가입을 해보자.

[그림 1-14] admin 회원가입

이렇게 하면 이미 존재한 계정이라고 뜬다. 그래서 정말 여러 방법을 생각해봤다.

[그림 1-15] 인코딩? 혹은 여기서 인젝션? 등등 삽입을 해보았는 데 여러 특수문자들도 해보았는 데 있는 그대로 출력이 된다.

[그림 1-15] 여러 테스트(삽질...)

혹시나 id 길이가 20으로 돼있는데 코드를 조작해 그 이상으로 넘어가면 잘리나 하고 테스트도 해봤는데 길이가 넘어가도 잘 가입이 됐다. 이렇게 삽질을 하다. 생각하고 또 생각한 끝에 공백을 이용해보자는 생각을 했다.

[그림 1-16] %20admin 가입

id에 admin 앞에 공백 하나를 줘서 혹시 가입할 때 공백들을 나중에 자르나 하는 생각에 가입을 했다.

해보니 가입에 성공하는 것을 볼 수 있다. 가입에 성공한 메시지를 보면 "sign up as admin success" 이렇게 뜨는데

사실 "as"와 "admin" 사이에 공백이 2개가 들어가야 하는데 하나만 들어가는 것을 볼 수 있다. 즉 회원 가입할 때는 

공백까지 해서 가입이 되지만 출력이나 여러 값 확인 등등할 때는 양쪽 끝 공백을 제거하는 것 같다.

실제 앞에 공백을 여러 개 줘 테스트해도 출력된 값을 보면 앞에 공백이 없어져 나온다! 이제 아이디로 로그인을 해보자.

[그림 1-17] 문제 해결!!

생각한 대로였다. 사실상 로그인은 "%20admin"으로 했지만 안에서 출력이나 값 확인을 할 때 앞에 공백을 제거하고 하기 때문에 admin으로 착각하게 되는 것이다. 실제 코드가 어떻게 이루어졌는지 몰라 이렇게 유추만 하고 넘어갈 수밖에 없을 것 같다. ㅠㅠ

반응형

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

old-54  (0) 2020.12.26
old-47  (0) 2020.12.26
old-33  (0) 2020.12.24
old-6  (0) 2020.02.20
old-26  (0) 2020.02.17