본문 바로가기

드림핵

[드림핵 워게임] cg-simple_sqli

<문제>

 

<풀이>

1. 사이트 및 코드 확인

문제 사이트에 접속하면 처음에 보이는 페이지다. Login을 클릭해보았다.

 

로그인 입력창을 확인할 수 있다.

 

DATABASE = "database.db"
if os.path.exists(DATABASE) == False:
    db = sqlite3.connect(DATABASE)
    db.execute('create table users(userid char(100), userpassword char(100));')
    db.execute(f'insert into users(userid, userpassword) values ("guest", "guest"), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}");')
    db.commit()
    db.close()

코드를 확인해보면 guest 계정이 있는 것을 볼 수 있다.

기능을 확인하기 위해 guest 계정으로 로그인을 해보았다.

 

userid = guest, userpassword = guest

 

로그인하자 hello guest라는 alert 창이 뜬다.

자 이제 admin으로 로그인을 해야 한다.

 

@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>'

코드를 살펴보면 로그인 입력창에서 사용자가 입력한 userid와 userpassword를 아무런 필터링 없이 그대로 받아서 sql문에 대입한다.

쿼리문의 주석을 이용해 알 수 없는 뒷부분을 지워서 간단한 sql injection을 시도해보면 될 것 같다.

 

 

2. 익스플로잇

userid에 admin"--을 입력해서 " and userpassword="{userpassword}" 부분을 주석처리하는 익스플로잇 코드이다.

password 입력란에는 아무 값이나 입력하고 로그인을 시도했다.

 

3. 플래그 획득

flag가 출력되었다.