๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ•ธ๏ธ ์›น ํ•ดํ‚น

[wargame] ๋“œ๋ฆผํ•ต xss-2 ๋ฌธ์ œํ’€์ด

by ๋ถˆํƒ€๋Š” ์ฐธ์ƒˆ 2025. 3. 6.

๊ฒ‰๋ณด๊ธฐ์—” 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 ์—”๋“œํฌ์ธํŠธ์— ์ฟ ํ‚ค๋ฅผ ํƒˆ์ทจํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค. 

 
memo๋กœ ์ด๋™ํ•˜๋ฉด ํƒˆ์ทจํ•œ ์ฟ ํ‚ค(FLAG)๊ฐ€ ๋ณด์ธ๋‹ค.

 

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 ์š”์†Œ๋กœ ๋ณ€ํ™˜ํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹คํ–‰.