2018. 2. 21. 17:19

## prob51(web, 250pt)


[Main]

 51번 문제는 간단한 sql injection문제인데, 입력한 문자열이 md5 해시 값으로 변한다는 특징이 있습니다. md5 sql injection은 유명하므로 검색하면 정말 많이 나옵니다. 우선 문제 페이지를 살펴보면 아래 [그림 1]과 같고 해당 페이지 내 source 링크를 클릭하면 php 소스코드가 아래 [그림 2]와 같이 나옵니다.


[그림 1] 문제 페이지


[그림 2] index.phps


 우선 소스 코드를 보면 입력할 수 있는 벡터는 총 2개($_POST[id], $_POST[pw])입니다. 이 두 벡터 중 $_POST[id]부분에 sql injection을 성공시키기 위해서는 magic_quotes_gpc를 우회해야하는데, mb_convert_encoding()함수가 없어, 우회할 수 없습니다. 따라서 $_POST[pw]를 공략해야하는데, 이 파라미터에는 입력 값이 md5()함수를 통해 md5해시 값이 저장됩니다. 


 이는 md5 sql injection으로 유명한데 md5해시 값이 single quote(')와 "="의 값을 가지는 hash 값을 가지도록 만들면 됩니다. 즉 예를 들면 "select id from challenge_51_admin where id='admin' and pw='????'='???????'"과 같은 식으로 sql injection을 시키면 됩니다. 그러면 문제가 풀리는데 "'='"가 포함되는 md5 hash 값을 찾으려면 검색해도 되고 0부터 9999999까지 for문을 돌리면서 직접 php코드를 짜도됩니다.


[그림 3] Congratulations~!


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

[webhacking.kr] prob45(550pt)  (0) 2018.02.21
[webhacking.kr] prob26(100pt)  (0) 2018.02.21
[webhacking.kr] prob5(300pt)  (0) 2018.02.21
[webhacking.kr] prob33(200pt)  (0) 2018.02.21
[webhacking.kr] prob4(150pt)  (0) 2018.02.21
Posted by holinder4S
2018. 2. 21. 16:50

## prob45(web, 550pt)


[Main]

 45번 문제는 sql injection 문제라고 문제 페이지에 나와있었습니다. 우선 문제 페이지와 소스코드를 보면 아래 [그림 1], [그림 2]와 같습니다.


[그림 1] 문제 페이지


[그림 2] index.phps


 우선 admin으로 로그인하기 위해 "select id from members where id='$_GET[id]' and pw=md5('$_GET[pw]')" 문에서 sql injection을 시켜 결과 값이 admin이 되도록 해야합니다. 각각의 GET방식의 변수에는 별도의 필터링이 걸려있는데, "select id from members where id='asdf' or id='admin'#' and pw=md5('asdf')"과 같은 식으로 injection을 하면 될 것이라고 생각했습니다. 


 하지만 $_GET[id]에는 admin이 필터링으로 걸려 있기 때문에 "select id from members where id='asdf' or id=0x61646d696e#' and pw=md5('asdf')"와 같이 고쳐 우회할 수 있습니다. 하지만 한 가지 문제가 더 있습니다. php의 설정 중 magic_quotes_gpc가 on으로 되어 있으면 single_quote('), double_quote("), slash(/)가 입력되면 그 앞에 "\"(역슬래시)가 붙어 문자열로 인식시켜주는 sql injection 보호기법 입니다. 그런데 이 문제는 이 보호기법이 걸려있었습니다.


 그래서 이를 우회할 수 있는 취약점이 php의 함수 중 mb_convert_encoding()이라는 함수에 있습니다. 이 함수는 문자열의 인코딩 방식을 변경하는 php 함수입니다. 취약점은 2바이트가 멀티바이트로 인식되어 일반적인 아스키로 표시할 수 없는 문자를 표시하도록 하는 곳에 있습니다. 예를 들면 "%aa\"가 하나의 문자로 인식되어 버리는 것입니다. 


 따라서 "select id from members where id='%aa' or id=0x61646d696e#' and pw=md5('asdf')"와 같이 입력하면 "select id from members where id='%aa\' or id=0x61646d696e#' and pw=md5('asdf')"로 변하면서 "\"(백슬래시)때문에 single quote가 문자열로 인식되는것을 막을 수 있습니다. 이렇게 쿼리를 날리면 아래 [그림 3]과 같이 문제가 풀리게 됩니다.


[그림 3] Conratulations~!


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

[webhacking.kr] prob51(250pt)  (1) 2018.02.21
[webhacking.kr] prob26(100pt)  (0) 2018.02.21
[webhacking.kr] prob5(300pt)  (0) 2018.02.21
[webhacking.kr] prob33(200pt)  (0) 2018.02.21
[webhacking.kr] prob4(150pt)  (0) 2018.02.21
Posted by holinder4S
2018. 2. 21. 16:06

## prob26(web, 100pt)


[Main]

 26번 문제는 url encoding에 관한 문제였습니다. 우선 문제 페이지에 들어가면 index.phps라는 링크를 주어 php소스를 제공하고 있습니다. 문제 소스코드는 아래 [그림 1]과 같습니다.


[그림 1] index.phps


 우선 소스코드를 분석해보면 정말 간단합니다. GET방식으로 id라는 파라미터에 값을 받고, eregi()함수로 "admin"이라는 문자열이 포함되면 "<p>no!"라는 문자열을 출력하고 종료합니다. 하지만 아래 if문을 보면 $_GET[id]가 admin이어야 문제가 풀리게 되는데, urldecode()함수를 거친 값이 "admin"값이 되면 됩니다. 따라서 "admin"이라는 값을 보내는 것이 아니라 "%61%64%6d%69%6e"라는 값을 보내야 합니다. 하지만, 브라우저의 주소창에서 "%"와 같은 예약어를 자동으로 해석해서 decode를 시켜주기 때문에 결국 "admin"이라는 값이 서버에 전송됩니다. 따라서 "%"도 url encode하여 서버에 보내야 최종적으로 서버에 "%61%64%6d%69%6e"라는 문자열이 전송되고, 이게 urldecode()함수를 통해 "admin"으로 변환되게 될 것입니다. 따라서 "%2561%2564%256d%2569%256e"이렇게 보내면 아래 [그림 2]와 같이 문제가 풀리게 됩니다.


[그림 2] Congratulations~!


참고로 url encoding에 관한 글은 아래 url에서 참조할 수 있습니다.

1) http://regularmotion.kr/url-encoding-url/

2) https://bluestarblogkr.blogspot.kr/2011/10/url-encoding.html

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

[webhacking.kr] prob51(250pt)  (1) 2018.02.21
[webhacking.kr] prob45(550pt)  (0) 2018.02.21
[webhacking.kr] prob5(300pt)  (0) 2018.02.21
[webhacking.kr] prob33(200pt)  (0) 2018.02.21
[webhacking.kr] prob4(150pt)  (0) 2018.02.21
Posted by holinder4S
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
2018. 2. 21. 00:40

## prob1(web, 200pt)


[Main]

 1번 문제는 쿠키 값을 조작해 조건을 통과시키는 문제입니다. 소스코드는 아래 [그림 1]과 같습니다. 



[그림 1] index.phps


eregi()함수를 이용해 "user_lv"라는 쿠키 값을 필터링하는데 5보다 크고 6보다 작은 값이어야 

하므로 "5.5"로 user_lv 쿠키 값을 세팅했더니 문제가 풀렸습니다.



[그림 2] Congratulations~!


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

[webhacking.kr] prob33(200pt)  (0) 2018.02.21
[webhacking.kr] prob4(150pt)  (0) 2018.02.21
[webhacking.kr] prob46(300pt)  (0) 2018.01.26
[webhacking.kr] prob25(150pt)  (0) 2018.01.26
[webhacking.kr] prob20(200pt)  (0) 2018.01.19
Posted by holinder4S
2018. 1. 26. 08:47

## prob46(web, 300pt)


[Main]

 46번 문제는 sql injection 문제였는데 mysql의 string관련 내장함수를 잘 이용하거나 mysql특징을 잘 알면 풀 수 있는 문제였습니다. 우선 문제를 보도록 하겠습니다.


[그림 1] 문제 페이지


 우선 대놓고 문제 페이지에서 SQL INJECTION이라고 적혀있습니다. 소스코드보기를 하면 index.phps가 주석으로 나와 있는데 index.phps에서 페이지 소스를 보면 아래 [그림 2]와 같습니다.


[그림 2] index.phps


 위 소스코드를 잘 보면 공백 문자, '/', '*', '%'를 str_replace()함수로 필터링하고 있으며, 아래 eregi()함수를 이용하여 "union", "select", "from", "challenge", "0x", "limit", "cash" 문자열들을 필터링하고 있습니다. 그리고 그 아래에서는 가장 중요한 sql 쿼리문("select id, cash from members where lv=$_GET[lv]")이 보입니다. 우선 lv에 0도 넣어보고, 1도 넣어보고, 2도 넣어보고 해봤는데 1만 값이 출력되는 걸로 봐서, lv가 1인 경우밖에 없나보다라고 생각했습니다.


 자, 이제 sql injection을 할 차례입니다. 처음에는 lv변수가 숫자이므로 싱글 쿼터를 쓰지 않아도 된다는 점은 좋았습니다.(왜냐하면.. 싱글 쿼터를 써봤는데 아래 싱글쿼터가 php의 보안 설정인 magic_quotes_gpc가 on되어 있어서 싱글쿼터 앞에 '\'를 자동으로 붙이게 되어 sql 쿼리문에서 먹히지 않았습니다...) 그래도 문제를 쉽게 풀려면 "select id, cash from members where lv=0 or id='admin'"이렇게 해야하지만 싱글쿼터를 쓸 수 없으니.. 이 방법은 빠르게 접었습니다. 그리고 우선은 공백 문자 필터링을 우회해야하는데 처음엔 '%'를 필터링하니까 %0a를 사용할 수 없겠구나 라고 생각했지만 해보니 됐습니다.(왜 그런지는 아직 잘..) 이렇게 %0a로 공백문자를 우회하고 나니까 "select id, cash from members where lv=0%0aor%0alv=1"과 같은 식의 injection을 테스트 할 수 있었습니다. 잘 먹히는게 확인되었습니다.


 그래서 싱글쿼터를 안하고 이것 저것 시도해보다가 "select id, cash from members where lv=1%0aand%0alength(id)=8"과 같은 구문을 시도해봤는데 아래 [그림 3]과 같이 [그림 1]과는 길이가 8인 다른 아이디가 출력되는 것을 확인할 수 있었습니다.


[그림 3] 첫 번째 시도


 흠.. 생각해보니까 MySql에서 싱글쿼터를 쓰지 않고 문자를 표현할 때 'admin'=0x61646D696E 처럼 16진수로 나타내도 된다고 알고 있는데, "0x"가 필터링 되서 못쓴다고 생각했지만 0x가 되면 0b도 되지 않을까 해서 아래 [그림 4]와 같이 "select id, cash from members where lv=1%0aand%0aid=0b110000101100100011011010110100101101110"을 입력했더니 문제가 풀렸습니다.


[그림 4] Congratulation(1)


 흠 근데 생각해보니 mysql의 string관련 내장 함수를 쓰면 이렇게 말고도 풀 수 있을 것 같아 https://dev.mysql.com/doc/refman/5.7/en/string-functions.html 여기를 뒤적거리다보니 쓸만한 함수가 나왔습니다. char()함수입니다. 위 url의 메뉴얼에 따르면 char(97,100,109,105,110)='admin'이라고 합니다. 그래서 아래 [그림 5]처럼 injection하면 짜잔! 풀립니다.


[그림 5] Congratulation(2)


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

[webhacking.kr] prob4(150pt)  (0) 2018.02.21
[webhacking.kr] prob1(200pt)  (0) 2018.02.21
[webhacking.kr] prob25(150pt)  (0) 2018.01.26
[webhacking.kr] prob20(200pt)  (0) 2018.01.19
[webhacking.kr] prob8(350pt)  (0) 2018.01.18
Posted by holinder4S
2018. 1. 26. 07:01

## prob25(web, 150pt)


[Main]

 25번 문제는 널 바이트를 이용하는 문제였습니다. 생각보다 많이 어렵진 않았지만 하마터면 

엄청 삽질할 뻔했습니다...


 우선 문제를 보도록 하겠습니다.


[그림 1] 문제 페이지


 문제 페이지를 보면 뭔가 리눅스의 "ls" 명령의 결과 처럼 보이는 파일들 목록이 보이고, 아래에는 "hello world"라는 문자열이 보입니다. 그리고 URL을 봤더니 "~/?file=hello"라고 되어 있습니다.


 저는 여기서 뭔가 GET방식의 파라미터 file변수로 받은 값에 ".txt"를 붙여서 파일을 read하고 보여주는 구나~ 라고 생각했습니다. 그런데 read하는 방식은 exec()함수(?) php에서 명령어를 실행하는 함수를 사용하는 줄 알고 "/?file=index.php;"이런식으로 커맨드 인젝션이 될 줄 알고 해보았습니다. 그런데 password.php도 안되고 다 안되서 실패!


 두 번째로 생각해낸 방식은 예전에 어디서 LFI문제에서 php의 filter기능을 쓰는 것을 본적이 있는 것 같아서 검색해보았더니 대충 "?var=php://filter/convert.base64-encode/resource=index"이런식으로 사용하는 것이었습니다.(참고 : http://www.php.net/manual/en/filters.php) 이외에도 여러 php의 필터방식을 이용하여 파일을 읽는 방식을 이용해보았지만 실패했습니다.


 마지막 세번째로.. 생각해낸 방식은 파일이름 뒤에 ".txt"가 붙여져서 파일을 read하는데 앞에 NULL문자인 %00을 넣으면 어떨까? 라고 생각하고 "/?file=index.php%00"을 넣었더니.. 아무 반응이 없었습니다. 여기서 %00이 아닌지 알고 넘어갔으면 한참동안 삽질할뻔 했으나.. "/?file=password.php%00"을 넣으니 아래 [그림 2]와 같이 파일이 읽혔습니다!


[그림 2] Congratulation!



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

[webhacking.kr] prob1(200pt)  (0) 2018.02.21
[webhacking.kr] prob46(300pt)  (0) 2018.01.26
[webhacking.kr] prob20(200pt)  (0) 2018.01.19
[webhacking.kr] prob8(350pt)  (0) 2018.01.18
[webhacking.kr] prob21(250pt)  (0) 2018.01.13
Posted by holinder4S
2018. 1. 19. 16:04

## prob20(web, 200pt)


[Main]

 20번 문제는 javascript 문제였습니다. 우선 문제페이지를 보도록 하겠습니다.


[그림 1] 문제 페이지


 우선 do not programming이라고 적혀있습니다. 무슨 말인지 모르겠어서 바로 html 소스코드와 프록시 도구를 이용하여 아래 [그림 2]처럼 이 페이지를 살펴보았습니다.


[그림 2] 페이지 코드 및 프록시


 이제 코드를 살짝 보면 Submit버튼을 클릭하면 ck()함수를 실행하며 빨간 네모의 "hack"이라는 name을 가진 text박스와 "attackme"라는 name을 가진 button태그의 value와 비교하여 같은지 확인을 합니다. 여기서 "attackme" 박스의 value를 "hack" 텍스트 박스에 넣고 submit해야할 것이라는 감을 잡을 수 있었습니다. 그런데 같은 값을 넣고 submit을 하면 "Wrong"이라는 문자열이 뜹니다.


 그 이유는 위 [그림 2]의 빨간 박스 중 time limit : 2라는 것에서 왜 그런지 대충 감을 잡을 수 있었습니다. 아마 2초안에 같은 값을 넣고 submit을 해야하나봅니다. 그래서 저는 절대 2초안에 nickname과 comment와 code를 입력하고 submit버튼까지 누를수 없을 것 같아서 python의 requests 모듈을 활용하여 위 [그림 2]에서 프록시로 잡은 parameter를 토대로 코드를 짰습니다. 이 때 한 가지 주의할 점은 POST방식이고, Cookie에 st와 PHPSESSID값이 존재하는데, st는 2초 이내인지 아닌지 판단하는 값이므로 꼭 같이 헤더에 넣어서 보내주어야 합니다.


 아마 위에서 "do not programming!"이라는 것은 이런 풀이 방식을 생각하고 출제자가 쓴 글인가 봅니다. 우선 제 풀이법대로의 파이썬 코드는 아래와 같습니다.


[Exploit Code] - prob20.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
import requests
 
url = "http://webhacking.kr/challenge/codeing/code4.html"
header = {'Cookie':'PHPSESSID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',}
 
if __name__ == "__main__":
    ## Stage 1 : get "hack" parameter, get "st" cookie
    stage1_req = requests.post(url = url, headers=header)
    stage1_res = stage1_req.text
    st_cookie = stage1_req.cookies['st']
 
    header = {'Cookie':'st='+st_cookie+';PHPSESSID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',}
    if "attackme" in stage1_res:
        hack = stage1_res[stage1_res.find("name=attackme value=")+21:]
        hack = hack[:hack.find("\"")]
        params = {'id':'holinder4s''cmt':'hello''hack':hack}
        stage2_req = requests.post(url = url, data = params, headers=header)
        stage2_res = stage2_req.text
        print stage2_res
    else:
        print "[-] Error Occur!"
        exit(-1)
 
# ref1) https://www.geeksforgeeks.org/get-post-requests-using-python/
 
cs


 위 코드를 돌리면 아래 [그림 3]과 같이 축하한다면서 문제를 풀었다는 response를 받을 수 있습니다.



[그림 3] Congratulation!


 이 풀이 방법 말고 다른 풀이 방법을 한 번 찾아보았습니다. 사실 수동으로 2초 내에 조금 빠르게 할 수 있는 방법이 존재합니다. 바로 크롬 개발자 도구에서 Console 탭을 이용해 lv5frm.id.value, lv5frm.cmt.value, lv5frm.hack.value를 채워주고 ck()함수를 호출해 주는 방식입니다.


 이 문제는 python코드로 post request보내는 template로 활용하면 될 것 같습니다.

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

[webhacking.kr] prob46(300pt)  (0) 2018.01.26
[webhacking.kr] prob25(150pt)  (0) 2018.01.26
[webhacking.kr] prob8(350pt)  (0) 2018.01.18
[webhacking.kr] prob21(250pt)  (0) 2018.01.13
[webhacking.kr] prob18(100pt)  (0) 2018.01.12
Posted by holinder4S