๐ดโ ๏ธ CTF ๐ดโ ๏ธ/โ๏ธ ์น โ๏ธ (6) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ [Dream Hack - Web] sql injection bypass WAF ๋ฌธ์ ํด์error based sql injection ๋ฌธ์ ์ ๋ฌ๋ผ์ง ์ ์ค์ด ํฌ๊ฒ ๋๊ฐ์ง ๋ณด์๋ค.keywords์ ์๋ ๋ฌธ์์ด์ ํฌํจํ๋ ๊ฒฝ์ฐ, SQL ๋ฌธ์ด ์คํ๋์ง ์๋๋ค.keywords = ['union', 'select', 'from', 'and', 'or', 'admin', ' ', '*', '/']def check_WAF(data): for keyword in keywords: if keyword in data: return True return False๋ ์ด์ ์๋ฌ๋ฌธ์ ์ถ๋ ฅํ์ง ์๋๋ค.uid = request.args.get('uid') if uid: if check_WAF(uid): return 'your r.. [Dream Hack - Web] error based sql injection Error Based SQL Injection๊ณต๊ฒฉ์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ๋ ๋ด๋ถ ์ ๋ณด๋ฅผ ํ๋ํ๋ ๊ณต๊ฒฉ๊ธฐ๋ฒ์ด๋ค. ๊ณต๊ฒฉ์๋ SQL ์ฟผ๋ฆฌ์ ์ทจ์ฝ์ ์ ์ด์ฉํ์ฌ ์๋ฌ๋ฅผ ์ ๋ํ๊ณ , ๊ทธ ์๋ฌ๋ฅผ ๋ถ์ํ์ฌ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ค. EXTRACTVALUE( {XML ํ์์ ๊ฐ}, {XPath ์กฐ๊ฑด์} )ํน์ ํ XPath ์กฐ๊ฑด์์ ๊ธฐ๋ฐ์ผ๋ก XML ๋ฌธ์์์ ๊ฐ์ ์ถ์ถํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.- BOOK_XML ์ด๋ฆฐ ์์ ์ํฌ์ ๋ ์ํ์ฅํ๋ฆฌ 9,800 - ์์ ์ฟผ๋ฆฌSELECT EXTRACTVALUE(BOOK_XML, '/STORE/BOOK/TITLE') FROM BOOK_LIST; - ์คํ ๊ฒฐ๊ณผ์ด๋ฆฐ์์ ํ์ด ๋ฐฉ๋ฒ flag ๊ธธ์ด ๊ตฌํ๊ธฐ' or extractvalue(1, c.. [Dream Hack - Web] csrf-2 ๋ฌธ์ ํด์/ ํ์ด์ง@app.route("/")def index(): session_id = request.cookies.get('sessionid', None) try: username = session_storage[session_id] except KeyError: return render_template('index.html', text='please login') return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not an admin"}')์ฟ ํค์์ session id๋ฅผ ํ์ธํ๊ณ ๊ทธ ๊ฐ์ ๋ฐ๋ผ.. [Dream Hack - Web] csrf-1 CSRF๋?CSRF๋, Cross Site Request Forgery์ ์ฝ์๋ก, ์ฌ์ดํธ๊ฐ ์์ฒญ ์์กฐ๋ฅผ ๋ปํฉ๋๋ค. CSRF๋ ์ฌ์ฉ์๊ฐ ์์ ์ ์์์๋ ๋ฌด๊ดํ๊ฒ ๊ณต๊ฒฉ์๊ฐ ์๋ํ ํ์(๋ฐ์ดํฐ ์์ , ์ญ์ , ๋ฑ๋ก ๋ฑ)์ ํน์ ์น์ฌ์ดํธ์ ์์ฒญํ๋ ๊ณต๊ฒฉ์ ๋๋ค.์๋ฅผ ๋ค์ด, ํผํด์์ ์ ์ ๋ฉ์ผ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ํธ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์๊ธ์ด์ฒด๋ฅผ ํ๋ ๋ฑ์ ๋์์ ์ํํ๊ฒ ํ ์ ์์ต๋๋ค. ๋, ํน์ฑ์ ๋ฐ๋ผ ๊ณต๊ฒฉ์๋ ์ฌ์ฉ์์ ๊ณ์ ์ ๋ํ ์์ ํ ์ ์ด๊ถ์ ์ป์ ์๋ ์์ต๋๋ค.์๋ฒ๋ ๋ก๊ทธ์ธ ์ ์ธ์ฆ๋ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ธ์ (session)์ ์ ์ฅํ๊ณ ์ด์ ๋งค์นญ๋๋ ์ธ์ ์์ด๋(session ID)์ ๋ง๋ ๋ค.์๋ฒ๋ ์ ์ฅ๋ ์ธ์ ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ์ธ์ ์์ด๋๋ฅผ Set-Cookie ํค๋์ ๋ด์์ ์ ๋ฌํ๋ค.. [Dream Hack - Web] xss-2 ๋ฌธ์ ํด์/vuln ํ์ด์งxss-1์์์ ๋ค๋ฅด๊ฒ script ์ฝ๋๊ฐ ๋์ํ์ง ์๋๋ค. /vuln ๋ผ์ฐํฐ๋ฅผ ์ดํด๋ณด๋ vuln.html ํ์ด์ง๋ฅผ ๋ ๋๋งํ๊ณ ์๋ค.@app.route("/vuln")def vuln(): return render_template("vuln.html"){% block content %} {% endblock %}์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด,location.search ⇒ URL ์ฟผ๋ฆฌ ๋ฌธ์์ด ๋ถ๋ถ์ ๋ฐํํ๋ค. ์๋ฅผ ๋ค์ด, http://example.com?page=1¶m=test์ธ ๊ฒฝ์ฐ location.search๋ ?page=1¶m=test ๊ฐ ๋๋ค.new URLSearchParams(location.search) ๋ ์ด ์ฟผ๋ฆฌ ๋ฌธ์์ด์ URLSearchParams ๊ฐ์ฒด.. [Dream Hack - Web] xss-1 ๋ฌธ์ ํด์/vuln ํ์ด์ง/vuln ๋ผ์ฐํฐ๋ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ทธ๋๋ก html์ ๋๋๋ง ํด์ฃผ๊ธฐ ๋๋ฌธ์ XSS ์ทจ์ฝ์ ์ ๋ณด์ ํ๊ณ ์๋ค.@app.route("/vuln")def vuln(): param = request.args.get("param", "") return param๊ทธ๋์ http://127.0.0.1:8000?param= ์ ๋๊ฒผ์ ๋, ์๋์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค./memo ํ์ด์งํ๋ผ๋ฏธํฐ๋ก ๋๊ธด memo ๊ฐ์ ๋ํด ๊ณ์ ์ด์ด๋ถ์ฌ ๋๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.@app.route("/memo")def memo(): global memo_text text = request.args.get("memo", "") memo_text += text + ".. ์ด์ 1 ๋ค์