-
Dreamhack - Login page#1 - Security/CTF 2022. 11. 29. 17:09
근래 여유 시간이 있어 드림핵 문제를 풀고 있다
에러 처리의 대한 화면 표시가 안되어 Error based는 따로 생각 안했다
except pymysql.err.InterfaceError: db.close() db, cursor = connect_mysql()
로그인 할 때 Injection 포인트 발견 (바인딩 처리 미흡)
while not done: try: query = 'SELECT * FROM users WHERE username = \'{0}\' ' \ 'AND password = \'{1}\'' with lock: query = query.format(username, password) cursor.execute(query) ret = cursor.fetchone()
SQL_BAN_LIST = [ 'update', 'extract', 'lpad', 'rpad', 'insert', 'values', '~', ':', '+', 'union', 'end', 'schema', 'table', 'drop', 'delete', 'sleep', 'substring', 'database', 'declare', 'count', 'exists', 'collate', 'like', '!', '"', '$', '%', '&', '+', '.', ':', '<', '>', 'delay', 'wait', 'order', 'alter' ]
그러면 이제 할 수 있는게 Blind SQL Injection인데 잘못 건드렸다가 패스워드 리셋이 된다.
참값을 넣게되면 바로 리셋이니 할 수 있는건 하나뿐
actual_username = ret[1] actual_password = ret[2] if username != actual_username or password != actual_password: reset_password() session['tries'] = 0 msg = 'What? you are hacker! I reset password!' return render_template('login.html', msg=msg)
그리고 패스워드 5번 틀리면 패스워드 리셋이 되니 이 부분 고려하여 스크립트 작성
if not ret: session['tries'] += 1 tries = session['tries'] remain_tries = MAX_LOGIN_TRIES - tries if remain_tries <= 0: reset_password() session['tries'] = 0 msg = 'Password is reset.' msg = msg.format(remain_tries) return render_template('login.html', msg=msg)
패스워드 길이가 짧지않아 중간에 서버 다운
'#1 - Security > CTF' 카테고리의 다른 글
H@cktivitycon - Just not interesting(Mobile) (0) 2020.08.12