위 문제는 SQL injection을 이용한 문제이다.
그리고 쉬운문제에 속하는 편이기도 하다 오죽하면 dreamhack 관리진도 쉬운문제로 분류할 정도이기 때문이다.
만약 자신이 SQL injection을 모른다면 바로 구글링을 통해 SQL injection이 어떤 공격 기법인지 한번 살펴보는게 낫다.
<aside> 💡 드림핵 문제 사이트 접근할 시, 문제 설명 사이트에서 '접속 설명' 쪽 버튼을 누르면 접속할 수 있도록 호스트와 포트 번호가 나올 것이다. 접속하는 방법은 다음과 같다
크롬: (host_name):(port_num) 예시: host1.dreamhack.games:3333
</aside>
그리고 문제 파일을 받아서 분석해보자.
일단 먼저 자기 자신이 분석해보길 바란다. 정작 자지가 못 분석하면 그건 자신의 실력으로 이어질 수가 없다.
만약 분석했는데도 모르겠다면 지금부터 어떤 취약점이 있는지를 보여주겠다.
반드시 해보고 이걸 보기 바란다.
문제 사이트 접속시 로그인 페이지가 나올 것이다. 우선 들어가보자.
그리고 코드를 보면 그 사이트 코드가 다음과 같다.
def login():
if request.method == 'GET':
return render_template('login.html')
else:
userid = request.form.get('userid')
userpassword = request.form.get('userpassword')
res = query_db(f'select * from users where userid="{userid}" and userpassword="{userpassword}"')
if res:
userid = res[0]
if userid == 'admin':
return f'hello {userid} flag is {FLAG}'
return f'<script>alert("hello {userid}");history.go(-1);</script>'
return '<script>alert("wrong");history.go(-1);</script>'
그러면 로그인할떄 우리의 아이디와 비번을 input하는 곳은 저 코드에서 첫 번쨰 else문 부터이다.
res를 보면 데이터베이스에 쿼리문을 보내는데 위 sql 구문은 id와 pw를 가진 유저를 뽑아낸다 입니다.
잘보니 id가 admin이면 우리가 원하는 플래그가 나온다.