<문제>
<풀이>
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가 출력되었다.
'드림핵' 카테고리의 다른 글
[드림핵 워게임] Flying Chars (0) | 2023.08.09 |
---|---|
[드림핵 워게임] phpreg (0) | 2023.08.08 |
[드림핵 워게임] amocafe (0) | 2023.08.08 |
[드림핵 워게임] sql injection bypass WAF (0) | 2022.11.27 |
[드림핵 워게임] error based sql injection (0) | 2022.11.23 |