2018. 2. 21. 15:49

## prob5(web, 300pt)


[Main]

 5번 문제는 로그인 버튼과 회원가입 버튼이 있는 문제였고, 특별히 php 소스코드가 주어지진 않았습니다. 우선 문제 페이지를 보면 아래 [그림 1]과 같습니다.


[그림 1] 문제 페이지


 login 버튼을 누르면 로그인 페이지로 넘어가고 join 버튼을 누르면 "Access Denied"라는 alert박스가 뜨게 됩니다. 우선 id, pw를 모르므로 login 버튼을 눌러 넘어가는 "mem/login.php"페이지에서는 특별히 할 것이 없었습니다. admin으로 로그인을 하기 위해 id:admin, pw:????를 입력해보았지만, 비밀번호가 틀렸다고 나옵니다.

[그림 2] login.php


[그림 3] wrong password


[그림 4] join버튼 클릭 시


 일단 join버튼이 막혀있어서 회원가입 페이지를 찾아야 된다고 생각했습니다. login버튼을 클릭하면 "/mem/login.php"로 넘어가므로 join버튼을 클릭하면 원래라면 "/mem/join.php"라는 페이지로 넘어가지 않을까라는 생각에 "/mem/join.php"에 접속해보니 아래 [그림 5]와 같이 페이지는 존재하지만 아무 결과도 보여주지 않았습니다.


[그림 5] /mem/join.php


 그래서 소스코드를 보았더니 아래 [그림 6]과 같이 난독화된 자바스크립트 코드를 볼 수 있었습니다.


[그림 6] 난독화된 자바스크립트


 일단 저 난독화된 자바스크립트를 해석하기 위해 크롬의 개발자 도구를 켜고 console창에다가 위 스크립트 중 마지막 alert("access_denied"); 뒷 부분의 else 블럭을 입력하면 아래 [그림 7]과 같이 숨겨진 창이 나타나게 됩니다.


[그림 7] /mem/join.php


이제 회원가입을 할 수 있게 되었습니다. admin으로 가입을 해서 admin으로 로그인을 하려고 했는데 아래 [그림 8]처럼 이미 있는 아이디라고 나옵니다. 


[그림 8] admin 회원가입 실패


 그래서 이를 우회하기 위해서 예전 어디선가 풀어본 문제 중에 admin 중복체크를 우회하고 db에 저장시에는 "admin"이 insert되도록 하는 문제가 있었습니다. "admin                               " 이런 식으로 id부분에 적으면 중복 체크는 우회가 되고, db에 insert될 때에는 공백이 제거되고 insert 됩니다. 이런 방식으로 했더니 아래 [그림 9]와 같이 admin으로 회원가입이 가능했습니다.


[그림 9] admin 회원가입


 이제 가입을 했으니 아래 [그림 10] 과 같이 로그인을 시도해보았습니다.


[그림 10] Congratulations~!


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

[webhacking.kr] prob45(550pt)  (0) 2018.02.21
[webhacking.kr] prob26(100pt)  (0) 2018.02.21
[webhacking.kr] prob33(200pt)  (0) 2018.02.21
[webhacking.kr] prob4(150pt)  (0) 2018.02.21
[webhacking.kr] prob1(200pt)  (0) 2018.02.21
Posted by holinder4S
2018. 2. 21. 13:15

## prob33(web, 200pt)


[Main]

 33번 문제는 뭔가 자잘한 문제들이 여러 개 포함되어 있는 문제였습니다. 우선 문제를 살펴보면 아래 [그림 1]과 같습니다.


[그림 1] 문제 페이지


 php 소스코드의 링크가 주어지는데 들어가보면 아래 [그림 2]와 같은 소스코드가 보입니다.


[그림 2] index.phps


 소스코드를 보면 "get"파라미터로 "hehe"라는 값이 들어오면 다음 stage로 가는 href 링크가 주어지는 형식이었습니다. 이 조건을 만족시켜주면 아래 [그림 3]과 같이 stage1을 클리어하고 stage2로 가는 링크가 주어지게 됩니다.


[그림 3] stage1 Clear!


 이런 식으로 한 단계씩 클리어해 나가면 되는 문제였습니다. stage2는 post변수의 값을 체크하는 조건이 있었고, 이는 burp suite라는 프록시 툴을 이용해 만족시킬 수 있습니다. stage3은 get방식으로 myip라는 인자를 받고, 해당 값과 $_SERVER[REMOTE_ADDR] 변수와 비교하는 조건이 있었습니다. $_SERVER[REMOTE_ADDR]는 공인 IP가 기록되어 있으므로 자신의 공인 아이피를 잘 확인해서 myip라는 인자로 GET방식으로 넘기면 클리어 되었습니다.


 이 후 수동으로 하다가 점점 힘들어져 python 스크립트를 이용하여 문제를 풀었습니다. 


[prob33.py]

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# -*- coding: utf-8 -*-
import requests
from time import time
import hashlib
 
header = {'Cookie':'PHPSESSID=XXXXXXXXXXXXXX',}
 
if __name__ == '__main__':
 
    ## Stage 4
    url = "http://webhacking.kr/challenge/bonus/bonus-6/l4.php"
    m = hashlib.md5()
    get_time = str(int(time())); print get_time
    m.update(get_time)
    
    params = {'password':m.hexdigest()}
    req = requests.get(url = url, params = params, headers = header)
    print req.text
 
    ## Stage 5
    url = "http://webhacking.kr/challenge/bonus/bonus-6/md555.php?imget=1"
    header = {'Cookie':'imcookie=1; PHPSESSID=XXXXXXXXXXXXXX',}
    params = {'impost':'1'}
    req = requests.post(url = url, data = params, headers=header)
    print req.text
 
    ## Stage 6
    url = "http://webhacking.kr/challenge/bonus/bonus-6/gpcc.php"
    header = {'Cookie':'test='+hashlib.md5("XX.XX.XX.XX").hexdigest()+'; PHPSESSID=XXXXXXXXXXXXXX',}
    params = {'kk':hashlib.md5("python-requests/2.18.4").hexdigest()}
    req = requests.post(url = url, data = params, headers=header)
    print req.text
 
    ## Stage 7
    url = "http://webhacking.kr/challenge/bonus/bonus-6/wtff.php"
    header = {'Cookie':'PHPSESSID=XXXXXXXXXXXXXX',}
    params = {'1641257031':'1641257031'}
    req = requests.get(url = url, params = params, headers = header)
    print req.text
 
    ## Stage 8
    url = "http://webhacking.kr/challenge/bonus/bonus-6/ipt.php"
    header = {'Cookie':'PHPSESSID=XXXXXXXXXXXXXX',}
    params = {'addr':'127.0.0.1'}
    req = requests.get(url = url, params = params, headers = header)
    print req.text
 
    ## Stage 9
    url = "http://webhacking.kr/challenge/bonus/bonus-6/nextt.php"
    header = {'Cookie':'PHPSESSID=XXXXXXXXXXXXXX',}
    ans = ""
    for i in xrange(971222):
        ans += chr(i)
    params = {'ans':ans}
    req = requests.get(url = url, params = params, headers = header)
    print req.text
cs


대충 이와 같은 식으로 풀면 되는데, stage10번과 같은 경우 php를 온라인에서 실행시켜주는 사이트를 이용하면 쉽게 풀 수 있었습니다. 자신의 IP와 같이 개인별로 답이 다를 수 있어 위 코드를 실행시키면 제대로 클리어하지 않을 수 있으니 각 스테이지별 php 소스코드를 확인하시고, 조건에 맞게 맞춰주셔야 합니다.

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

[webhacking.kr] prob26(100pt)  (0) 2018.02.21
[webhacking.kr] prob5(300pt)  (0) 2018.02.21
[webhacking.kr] prob4(150pt)  (0) 2018.02.21
[webhacking.kr] prob1(200pt)  (0) 2018.02.21
[webhacking.kr] prob46(300pt)  (0) 2018.01.26
Posted by holinder4S
2018. 2. 21. 12:40

## prob4(web, 150pt)


[Main]

 4번 문제는 별도의 php소스코드나 html 소스코드를 볼 필요가 없었던 문제입니다. 단순히 base64 인코딩 방식을 알고 있는지를 묻는 문제였습니다.


우선 문제 페이지를 살펴보면 아래 [그림 1]과 같습니다.


[그림 1] 문제 페이지


 뭔가 알 수 없는 문자열이 보이고 아래에 password를 입력하고 제출 버튼을 누르면 될 것 같았습니다. 우선 위의 문자열은 제일 마지막에 "=="값으로 끝나는 점, 인코딩된 문자열의 범위 등을 보았을 때 대충 base64라는 것을 눈치챌 수 있습니다. 그래서 이 문자열을 간단히 python으로 디코드 해보면 아래 [그림 2]와 같습니다.


[그림 2] base64 decode


 그래서 나온 디코드된 값을 password에 입력했더니 아무 반응이 없었습니다. 아마 base64로 디코드 시킨 후 나온 결과도 hash값인 것 같으니 decrypt해줘야 한다고 생각했고, 대충 online hash decrypter를 이용해 아래 [그림 3]과 같이 decrypt해주면 sha1방식의 hash인 것을 알 수 있었고, decrypt결과 또 hash값이 나왔습니다.


[그림 3] base64 -> sha1 -> ??? decode


 나온 값이 또 hash처럼 보입니다. 당연히 password에 입력해보았지만 아무 반응이 없어서, 다시 한번 decrypt해주었습니다. 그랬더니 아래 [그림 4]의 결과가 나왔습니다.


[그림 4] base64 -> sha1 -> sha1


 결국 답은 "test"이었습니다.

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

[webhacking.kr] prob5(300pt)  (0) 2018.02.21
[webhacking.kr] prob33(200pt)  (0) 2018.02.21
[webhacking.kr] prob1(200pt)  (0) 2018.02.21
[webhacking.kr] prob46(300pt)  (0) 2018.01.26
[webhacking.kr] prob25(150pt)  (0) 2018.01.26
Posted by holinder4S