XSHM (Cross Site History Manipulation)

๐Ÿ” Introduction

XSHM (Cross Site History Manipulation)์€ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹จ์ˆœํžˆ ์ด์ „ history๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํŽ˜์ด์ง€๋กœ ์ด๋™๋˜๋„๋ก ํ•˜๋Š” ํ”ผ์‹ฑ ๋ฐฉ๋ฒ•๋ถ€ํ„ฐ, SOP๋ฅผ ์šฐํšŒํ•˜๊ฑฐ๋‚˜ CSRF ๋˜๋Š” IFRAME์„ ์ด์šฉํ•˜์—ฌ ์ค‘์š” ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ history๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ถ€๋ถ„์€

1
2
history.pushState('','','https://www.hahwul.com/fafa')
history.replaceState('','','https://www.hahwul.com/z')

๐Ÿ—ก Offensive techniques

Detect

ํ•ด๋‹น ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์€ ๋‹จ๋…์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค๊ธฐ ๋ณด๋‹จ XSS๋‚˜ ์—…๋กœ๋“œ๋œ ํŒŒ์ผ ๋“ฑ ๊ณต๊ฒฉ์ž๊ฐ€ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€์—์„œ ์Šคํฌ๋ฆฝํŠธ ์‚ฝ์ž…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Exploitation

Phishing

history.pushState, history.replaceState ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œํ‘œ์‹œ์ค„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ด ๊ณผ์ •์€ SOP์˜ ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— Same-Origin ํ•œ์ •์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์™€ ๊ฐ™์ด https://www.hahwul.com/cullinan/main/ ํŽ˜์ด์ง€ ์ ‘๊ทผ ํ›„ history.pushState() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ URL์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํŽ˜์ด์ง€๋Š” ๋ณ€ํ•จ์—†์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œํ‘œ์‹œ์ค„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

Same-Origin์ด๋ž€ ์ œํ•œ์ด ์žˆ์ง€๋งŒ, ์˜ˆ๋ฅผ๋“ค์–ด ๋„๋ฉ”์ธ ๋‚ด XSS๋‚˜ html ํŒŒ์ผ ์—…๋กœ๋“œ ๊ตฌ๊ฐ„์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉ์ž๋ฅผ / ๊ฒฝ๋กœ์™€ ๊ฐ™์ด ์‹ ๋ขฐ๋„๊ฐ€ ๋†’์€ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํ”ผ์‹ฑ์˜ ์„ฑ๊ณต๋ฅ ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ๊ฐ€์ง€ ์˜ˆ๋ฅผ๋“ค๋ฉด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋ชจ์Šต์˜ ํ”ผ์‹ฑ ํŽ˜์ด์ง€๊ฐ€ ์•„๋ž˜ 2๊ฐœ์˜ Path ์ค‘ ์–ด๋””๋กœ ๋ณด์ผ ๋–„ ์‹ ๋ขฐ๋„๊ฐ€ ๋†’์„์ง€ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ฐ”๋กœ ๋‹ต์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

  • /users/file/125412519827125.html
  • /logins

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ํ•จ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1
2
history.pushState(state, unused, url)
history.replaceState(stateObj, unused, url)

Cross-Site Condition Leakage

Cross-Site Condition Leakage์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ณต๊ฒฉ์ž๊ฐ€ ์กฐ๊ฑด๋ฌธ์˜ ๋ฏผ๊ฐํ•œ ๊ฐ’์„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ 30x ๊ฐ™์€ Redirect ํŽ˜์ด์ง€๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ด๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์กฐ๊ฑด ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๋ฉด ๋งŒ์•ฝ GET /myinfo ํŽ˜์ด์ง€๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋Š” 200 OK ๋น„๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž๋Š” 302๋ฅผ ํ†ตํ•ด /error ๋ผ๋Š” ํŽ˜์ด์ง€๋กœ redirect ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ณต๊ฒฉ์ž๋Š” iframe์„ ์ด์šฉํ•ด ๋จผ์ € /error ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ํ›„ history.length ์‚ฌ์ด์ฆˆ๋ฅผ ๊ธฐ๋กํ•ด๋‘ก๋‹ˆ๋‹ค.

1
2
<iframe id="f" src="/error" onload="console.log(f.contentWindow.history.length)">
</iframe>

์ดํ›„ src๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ /myinfo ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ๋˜์—ˆ๋‹ค๋ฉด 200OK๋กœ history.length์˜ ๊ฐ’์ด ํ•˜๋‚˜ ๋Š˜๊ฒ ์ง€๋งŒ, ๋น„๋กœ๊ทธ์ธ์ธ ๊ฒฝ์šฐ /error๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋˜๊ณ  ๊ธฐ์กด๊ณผ ๋™์ผํ•œ ํŽ˜์ด์ง€๊ธฐ ๋•Œ๋ฌธ์— history๊ฐ€ ์นด์šดํŒ…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1
2
3
4
5
f.src="/myinfo"
console.log(f.contentWindow.history.length)

// login: history=> 2
// not-login; history=> 1

์˜ˆ์‹œ๋กœ๋Š” ๋‹จ์ˆœํžˆ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ์ฒดํฌ์˜€์ง€๋งŒ, ํ˜ธ์ถœํ•˜๋Š” API๋‚˜ ํŽ˜์ด์ง€์— ์ข…๋ฅ˜์— ๋”ฐ๋ผ์„œ true/false๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ค‘์š”์ •๋ณด๋‚˜ ๊ฐœ์ธ์ •๋ณด๋ฅผ ์œ ์ถ”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” XS-Leaks ๋ฐฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์œผ๋กœ ์•Œ๋ ค์ง„ ์นดํ…Œ๊ณ ๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Login Detection
  • Resource Mapping
  • Error Leakage
  • State Detection
  • Information Inference

๐Ÿ›ก Defensive techniques

SOP์™€ ๋ธŒ๋ผ์šฐ์ € ์ •์ฑ…๋“ค์˜ ๊ฐ•ํ™”๋กœ Cross-Origin์—์„  ์ƒ๋Œ€์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๊ทธ๋ž˜๋„ Same-Origin ํ•œ์ •์œผ๋กœ๋Š” XSHM์„ ์ด์šฉํ•˜์—ฌ ๊ธฐ์กด ์ทจ์•ฝ์ ์œผ๋กœ ์–ป์„ ์ˆ˜ ์—†๋Š” ์ •๋ณด๋ฅผ ํƒˆ์ทจํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— X-Frame-Options, CSP ๋“ฑ์˜ ๋ณด์•ˆ ํ—ค๋”๋ฅผ ํ†ตํ•ด ํ—ˆ๋“ค์„ ๋†’์ด๊ณ  XSS๋‚˜ CSRF ๋“ฑ์˜ ์ทจ์•ฝ์ ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์˜ˆ๋ฐฉํ•˜๊ณ  ์ฃผ๊ธฐ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ References

Licensed under CC BY-NC-SA 4.0