Dreamhack.io simple_sqli

세렌디·2023년 4월 26일
0

정보보안

목록 보기
3/11


오늘은 Dreamhack.io simple_sqli를 풀어보고, 해설을 해보겠다.

문제 정보를 보면, 로그인 서비스라고 설명한다.
SQL INJECTION 취약점을 통해 플래그를 획득하라고 한다.
또한, 플래그는 flag.txt, 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>'

코드를 읽다보면 다음과 같은 login페이지 관련 함수를 볼 수 있을 것이다.
userid와 userpassword를 입력받고. query를 만드는데, userid가 admin이면 hello {userid} flag is {FLAG}이렇게 FLAG를 알아낼 수 있다.

SQL INJECTION 취약점을 노려보자.
앞에서 말했듯이 admin으로 로그인을 해야 FLAG를 얻어낼 수 있다.
그런데 userid가 admin인것을 알아도 비밀번호를 알 수 없다.
이것을 이용한다.

QUERY문이
select * from users where userid="{userid}" ~~니까
userid에 admin"-- 이렇게 입력해준다. 그럼 뒷부분이 주석처리가 되면서 비밀번호는 사실상 뭘 입력받던지 상관이 없어지고 admin으로 인식하게 된다.
그 이유는 주석처리를 통해 userid="{userid}"의 userid에 admin"--이 들어감으로써
userid="admin"-- 식의 QUERY가 되므로, 뒤에 오는 }" and userpassword = ~~가 다 주석처리가 된다.

이렇게 간단하게 문제를 풀어보았다.
좀 설명을 못한 것 같아서 앞으로는 글을 이해하기 쉽게 쓸 수 있는 노력을 해야겠다.

profile
당당하게 자신을 개발자라고 할 수 있는 사람이 될 때 까지

0개의 댓글