Dreamhack/Web hacking

simple-sqli Write-Up

壓倒 2023. 1. 23. 00:06

문제


simple-sqli(출처 : dreamhack)

Write-Up


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

주어지는 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" --
SQL Injection 성공 후 화면

Flag


DH{1f136225e316add7bff3349ab1dd5400}

오류, 잘못된 점 또는 궁금한 점이 있으시다면 댓글 남겨주세요❗


Uploaded by N2T