๊ฒ๋ณด๊ธฐ์ xss-1 ์์ ์ ๋น์ทํ๋ค.
xss-1 ์์ ์์๋ memo ํ์ด์ง ์๋ํฌ์ธํธ์ document.cookie๋ก ์ฟ ํค๋ฅผ ํ์ทจํด ํ๋ผ๋ฏธํฐ๋ก ๋ณด๋ด์ฃผ์๋ค.
์ด๋ฒ์๋ ๋๊ฐ์ด ํด์ฃผ์์ง๋ง...FLAG๊ฐ ์ป์ด์ง์ง ์๋๋ค...(OMG๐ฅน)
๊ฑฐ์ ๋จน๊ธฐ ์คํจํ์ผ๋ ์ฒ์๋ถํฐ ์ฝ๋๋ฅผ ์ดํด๋ณด์
ํ์ผ์ ๋ค์ด ๋ฐ์ app.py๋ฅผ ์ด์ด์ฃผ๋ฉด vuln ํ์ด์ง์ memo ํ์ด์ง ๋ชจ๋ render_template์ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ ์ ์ ์๋ค.
@app.route("/")
def index():
return render_template("index.html")
@app.route("/vuln")
def vuln():
return render_template("vuln.html")
render_template ํจ์๋?
- Flask ์น ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ํจ์๋ก, Jinja2 ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ์ฌ HTML ํ ํ๋ฆฟ ํ์ผ์ ๋ ๋๋ง. ์ฃผ์ด์ง ํ ํ๋ฆฟ ํ์ผ์ ์ด๋ฆ๊ณผ ํจ๊ป ์ ๋ฌ๋ ๋ณ์๋ ๊ฐ๋ค์ ํ ํ๋ฆฟ์ ์ ์ฉํ์ฌ ์์ฑ๋ HTML์ ์์ฑ.
- render_template ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ์ ๋ฌ๋ ํ ํ๋ฆฟ ๋ณ์๊ฐ ๊ธฐ๋ก๋ ๋ HTML ์ํฐํฐ์ฝ๋๋ก ๋ณํํด ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ XSS๊ฐ ๋ฐ์ํ์ง ์๊ฒ ๋จ. ์ฆ, ์ด์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ ํ์ด์ง์ ๊ทธ๋๋ก ์ถ๋ ฅํ์ง ์์.
์ฆ ๊ธฐ์กด์ ํ๋ <script> ๋ฐฉ์์ผ๋ก๋ ์ฟ ํค๋ฅผ ํ์ทจํ ์ ์๋ค.
์ทจ์ฝ์ ๋ถ์
<script>๋ฅผ ์ธ ์ ์๋ค๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
vuln ํ์ด์ง๋ฅผ ๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ํค๊ณ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ์ ์ทจ์ฝ์ ์ ๋ฐ๊ฒฌํ ์ ์๋ค.
<script>
var x = new URLSearchParams(location.search);
document.getElementById('vuln').innerHTML = x.get('param');
</script>
- location ๊ฐ์ฒด๋ ๋ธ๋ผ์ฐ์ ์ ํ์ฌ ์ฃผ์(URL) ์ ๋ณด๋ฅผ ๋ด๊ณ ์์
- ๊ทธ์ค์์๋ location.search๋ URL์ "?" ๋ค์ ์๋ ์ฟผ๋ฆฌ ๋ฌธ์์ด(query string) ์ ๋ฐํ
- URLSearchParams๋ ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ๋ถ์ํ๊ณ ๋ค๋ฃจ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ฃผ๋ ๊ฐ์ฒด
- ์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด param ๊ฐ์ ํน์ ํ ๊ฐ์ ์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์์
- get() ๋ฉ์๋๋ ์ฟผ๋ฆฌ ๋ฌธ์์ด์์ ํน์ ํ ํค(key)์ ํด๋นํ๋ ๊ฐ์ ๊ฐ์ ธ์ค๋ ์ญํ
- ์ ์ฝ๋์์๋ param์ด๋ผ๋ ํค์ ๊ฐ์ ๊ฐ์ ธ์ด.
- document.getElementById('vuln')
→ HTML ๋ฌธ์์์ id="vuln"์ธ ์์๋ฅผ ์ฐพ์ - innerHTML = x.get('param')
→ ์ฐพ์ ์์์ innerHTML์ param ๊ฐ์ผ๋ก ๋ณ๊ฒฝํจ
์ฆ ํ์ฌ ํ์ด์ง์ URL ์ฟผ๋ฆฌ ๋ฌธ์์ด์์ param ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ์ถ์ถํ๊ณ , ํด๋น ๊ฐ์ ํ์ด์ง ๋ด์ vuln ์ด๋ผ๋ ID๋ฅผ ๊ฐ์ง ์์์ ๋ด๋ถ HTML๋ก ์ค์ ํ๋ ์ฝ๋์ด๋ค.
cf) HTML ๋ฌธ์์ ๊ตฌ์กฐ๋ ๋ด์ฉ์ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ์กฐ์ํ ์ ์๋ ์ฃผ์ ์ฝ๋
var content = document.getElementById('example').innerHTML; | ์ฝ๊ธฐ: ์์์ ๋ด๋ถ HTML์ ๊ฐ์ ธ์ต๋๋ค. |
document.getElementById('example').innerHTML = 'New Content'; | ์ฐ๊ธฐ: ์์์ ๋ด๋ถ HTML์ ๋ณ๊ฒฝํฉ๋๋ค. |
๋ฌธ์ ํด๊ฒฐ
flag ํ์ด์ง์ param์ ์๋ ์ฝ๋๋ฅผ ์์ฑํด์ค๋ค.
<img src="XSS-2" onerror="location.href='/memo?memo='+document.cookie">
script ํ๊ทธ ๋์ img ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด vuln ํ์ด์ง์ XSS-2๋ผ๋ src๋ฅผ ๊ฐ์ง ์ด๋ฏธ์ง๋ฅผ ์ฝ์ ํ๋ ค ํ๋ค.
๋ฌผ๋ก ์ด๋ฐ ์ด๋ฏธ์ง๋ ์์ผ๋ฏ๋ก ์ด๋ฏธ์ง ์ฝ์ ์ ์คํจํ๊ฒ ๋๊ณ ๊ทธ๋ผ onerror(์๋ฌ๊ฐ ์ผ์ด๋ฌ์ ๋ ์คํ)์ ๋ฐ๋ผ memo ์๋ํฌ์ธํธ์ ์ฟ ํค๋ฅผ ํ์ทจํด ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๊ฒ ๋๋ค.

QnA
Q: vuln ํ์ด์ง์์render_template์ ์ฌ์ฉ. ๊ทธ๋์ <script>๋ฅผ ์ด์ฉํ ์ฟ ํค ํ์ทจ๊ฐ ์๋๊ณ ๋์ innerHTML์ด ๊ฐ์ง ์ทจ์ฝ์ ์ ์ด์ฉํด์ <img src="XSS-2" onerror="location.href='/memo?memo='+document.cookie">๋ก ์ฟ ํค๋ฅผ ํ์ทจํ์. ๊ทผ๋ฐ script๋ ์๋๋ฉด์ img src๋ ๊ฐ๋ฅํ ์ด์ ๊ฐ ๋ญ๊น?
A: innerHTML์ HTML ํ๊ทธ๋ฅผ ๋ฌธ์์ด์ด ์๋๋ผ ์ค์ HTML ์์๋ก ํด์, innerHTML์ด <img> ํ๊ทธ๋ฅผ ๋ฌธ์์ด์ด ์๋๋ผ ์ค์ HTML ์์๋ก ๋ณํํด ๋ธ๋ผ์ฐ์ ๊ฐ ์คํ.
'๐ธ๏ธ ์น ํดํน' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[wargame] ๋๋ฆผํต xss-1 ๋ฌธ์ ํ์ด (0) | 2025.03.06 |
---|---|
Cross-Site Scripting (XSS) ๊ฐ๋ ์ ๋ฆฌ (0) | 2025.03.05 |
์น ๋ธ๋ผ์ฐ์ ๋ณด์ ์ ์ฑ SOP, CORS, JSONP ๊ฐ๋ ์ ๋ฆฌ (0) | 2025.03.05 |
[wargame] Dreamhack ๋ฌธ์ ํ์ด: session-basic (0) | 2025.03.05 |
[wargame] ๋๋ฆผํต beginner cookie ๋ฌธ์ ํ์ด (0) | 2025.03.03 |