드림핵
[드림핵 워게임] cg-simple_sqli
humangyng
2023. 8. 8. 17:24
<문제>

<풀이>
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가 출력되었다.