Dreamhack/Web hacking
simple-sqli Write-Up
壓倒
2023. 1. 23. 00:06
문제

Write-Up
문제에서 주어지는 URL에 접속할 경우 로그인 화면이 나오게 된다.

실제 어떻게 로그인 과정이 이루어지는지 확인하기 위해 웹에 대한 코드인 app.py
를 살펴보자.
app.py
에는 DB를 생성하고 연결을 종료하는 등 다양한 코드가 존재하지만 실질적으로 살펴야되는 부분은 login이다.
login 코드를 보게되면 userid, password를 입력받아 동적으로 쿼리문을 생성(RawQuery)하고 DB에 해당하는 값을 받아온다. 이후 userid가 admin이면 Flag를 출력하는 과정으로 동작한다.
@app.route('/login', methods=['GET', 'POST'])
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>'
어떻게 SQL Injection 공격을 수행할까?
password 를 입력받는 부분을 주석으로 처리하고 userid 값만 admin으로 쿼리를 전송하면SQL Injection을 성공적으로 수행할 수 있다.
userid에 다음과 같은 쿼리문을 입력하면 쿼리문을 통해 admin값에 해당하는 정보를 리턴하게 되고 Flag를 획득할 수 있다.
admin" --

Flag
DH{1f136225e316add7bff3349ab1dd5400}
오류, 잘못된 점 또는 궁금한 점이 있으시다면 댓글 남겨주세요❗
Uploaded by N2T