Study/WebHacking

[์ทจ์•ฝ์ ] Relative Path Overwrite

mnzy๐ŸŒฑ 2024. 4. 26. 17:42

Relative Path Overwrite (RPO)

Relative Path Overwrite (RPO)๋Š”  ์ƒ๋Œ€ ๊ฒฝ๋กœ์˜ URL์„ ๋ฎ์–ด์จ์„œ ์˜๋„ํ•˜์ง€ ์•Š์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์ด๋‹ค.

์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ํ•ด์„ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ฐจ์ด์ ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

Relative Path Confusion์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค. 

 

RPO๋ฅผ ์›น์—์„œ ์ด์•ผ๊ธฐํ•  ๋• link, script ๋“ฑ resource๋ฅผ ์ฝ์–ด์˜ค๋Š” ๊ณผ์ •์—์„œ Host๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ URL์„ Relative URL์ด๋ผ๊ณ  ํ•˜๊ณ , ์ด๋ฅผ Overwriteํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— resource์˜ ์ฃผ์†Œ ๋“ฑ์„ ์กฐ์ž‘ํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์•ก์…˜์œผ๋กœ ์œ ๋„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. (๋Œ€ํ‘œ์ ์œผ๋กœ XSS)

Path Description Example

Absolute URL  Host๊ฐ€ ํฌํ•จ๋œ URL <script src = "https://www.hahwul.com/file.js”>
Relative URL Host๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์€ URL  <src=”/file.js”>

 

์ ˆ๋Œ€ ๊ฒฝ๋กœ / ์ƒ๋Œ€ ๊ฒฝ๋กœ

๋”๋ณด๊ธฐ
  • ์ ˆ๋Œ€ ๊ฒฝ๋กœ (Absolute Path): URL์ด๋‚˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ์ตœ์ƒ์œ„ ์‹œ์ž‘์  (๋ฃจํŠธ)์œผ๋กœ๋ถ€ํ„ฐ์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ์›น์—์„œ ์ด๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„ ๋’ค์˜ ์ตœ์ƒ์œ„ ๊ฒฝ๋กœ์ธ '/' (์Šฌ๋ž˜์‹œ)๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, <script src="/app/main.js"></script>์—์„œ src ์†์„ฑ์€ ๋„๋ฉ”์ธ์˜ ๋ฃจํŠธ ๊ฒฝ๋กœ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , ์ด๋Š” ์›น ์„œ๋ฒ„์˜ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ /app/main.js ํŒŒ์ผ์„ ์ฐพ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ๋Œ€ ๊ฒฝ๋กœ (Relative Path): ํ˜„์žฌ ๋ฌธ์„œ์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ˜„์žฌ ๋ฌธ์„œ๊ฐ€ http://example.com/docs/article.html์ผ ๋•Œ, ์ƒ๋Œ€ ๊ฒฝ๋กœ app/main.js๋Š” http://example.com/docs/app/main.js๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” <script src="app/main.js"></script>์ฒ˜๋Ÿผ ๋งจ ์•ž์— ์Šฌ๋ž˜์‹œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฌธ์„œ์˜ ์œ„์น˜(์ด ๊ฒฝ์šฐ๋Š” /docs/)์—์„œ app/main.js๋ฅผ ์ฐพ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

url rewrite ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ช… ์ดํ•˜์˜ ๊ฒฝ๋กœ๋ฅผ ๋ณ„๋„๋กœ ์ง€์ •ํ•ด๋„ ๊ฐ™์€ ํŽ˜์ด์ง€๊ฐ€ ์กฐํšŒ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น ์„œ๋ฒ„์— URL์„ ์š”์ฒญํ•  ๋•Œ, URL ๋‚ด์˜ ๊ฒฝ๋กœ๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ์ง€์นจ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋•Œ, ์›น ์„œ๋ฒ„๋Š” URL rewrite ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ํŠน์ • ํŒจํ„ด์˜ ๊ฒฝ๋กœ๋ฅผ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ์žฌ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, /index.php/somepath์˜ ์š”์ฒญ์„ ๋ฐ›์•˜์„ ๋•Œ, ์›น ์„œ๋ฒ„๋Š” URL์˜ /index.php ๋ถ€๋ถ„๋งŒ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, /somepath๋Š” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋•Œ ๋งŒ์•ฝ ์›น ํŽ˜์ด์ง€ ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ์ž์›์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•˜๋Š” ํƒœ๊ทธ๊ฐ€ ๋‘ ๊ฐœ ์žˆ์„ ๋•Œ,

์ฒซ ๋ฒˆ์งธ ์ค„๊ณผ ๋‘ ๋ฒˆ์งธ ์ค„์˜ ์ฐจ์ด๋Š” src ์†์„ฑ ๋งจ ์•ž์— ์กด์žฌํ•˜๋Š” /์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

<script src="/app/main.js"></script>
<script src="app/main.js"></script>

 

์ฒซ ๋ฒˆ์งธ ์ค„์€ ์•ž์— ์กด์žฌํ•˜๋Š” /์— ์˜ํ•ด ์Šคํฌ๋ฆฝํŠธ ๋กœ๋“œ ์‹œ ์ตœ์ƒ์œ„ ๊ฒฝ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ํƒ์ƒ‰ (์ ˆ๋Œ€ ๊ฒฝ๋กœ)ํ•˜๊ณ  ๋กœ๋“œํ•œ๋‹ค.

๋ฐ˜๋ฉด์— ๋‘ ๋ฒˆ์งธ ์ค„์˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ํ˜„์žฌ ๊ฒฝ๋กœ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ํƒ์ƒ‰ (์ƒ๋Œ€ ๊ฒฝ๋กœ)ํ•˜๊ณ  ๋กœ๋“œํ•œ๋‹ค.

 

- http://host/rpo.php์— ์š”์ฒญํ•œ ๊ฒฝ์šฐ (์ฆ‰, ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์ตœ์ƒ์œ„ ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•  ๋•Œ)

rpo.php์— ์œ„ ๋‘ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑํ•œ ํ›„ http://host/app/main.js ์™€ ๊ฐ™์ด ์ ‘๊ทผ ์‹œ ๊ฐ™์€ ๊ฒฝ๋กœ์— ์กด์žฌํ•˜๋Š” /app/main.js๋ฅผ ๋กœ๋“œํ•œ๋‹ค.

https://learn.dreamhack.io/575

- http://host/rpo.php/์— ์š”์ฒญํ•œ ๊ฒฝ์šฐ (์ฆ‰, ํ˜„์žฌ ์œ„์น˜์™€ ์ตœ์ƒ์œ„ ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅผ ๋•Œ)

๊ทธ๋Ÿฌ๋‚˜ URL์— ์ถ”๊ฐ€๋กœ ์Šฌ๋ž˜์‹œ(/)๊ฐ€ ํฌํ•จ๋˜์–ด http://host/rpo.php/์™€ ๊ฐ™์ด ์š”์ฒญ๋  ๊ฒฝ์šฐ, ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๋ฒˆ์งธ <script> ํƒœ๊ทธ๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ฒฝ์šฐ, ๋ธŒ๋ผ์šฐ์ €๋Š” /rpo.php/๋ฅผ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๊ฐ„์ฃผํ•˜๊ณ , /rpo.php/app/main.js ๊ฒฝ๋กœ๋กœ ์ž์›์„ ์š”์ฒญํ•˜๊ฒŒ ๋œ๋‹ค. 

https://learn.dreamhack.io/575

 

์ฆ‰, index.php์˜ ํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋‚ด์šฉ์œผ๋กœ์จ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

Relative Path Overwrite (RPO) ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•

RPO๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋‚˜ ์Šคํƒ€์ผ์‹œํŠธ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฒฝ๋กœ ํ•ด์„์˜ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ž„ํฌํŠธํ•˜๋Š” ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ์กฐ์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ์Šคํƒ€์ผ์‹œํŠธ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ์—ฐ๊ณ„

๋งŒ์•ฝ RPO ์ทจ์•ฝ์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์˜ ์•ž ๋ถ€๋ถ„์„ ๊ณต๊ฒฉ์ž๊ฐ€ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, XSS ๊ณต๊ฒฉ์œผ๋กœ์˜ ์—ฐ๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณต๊ฒฉ์ž๊ฐ€ RPO ์ทจ์•ฝ์ ์„ ํ†ตํ•ด ์›๋ž˜ /static/script.js๋กœ ๋กœ๋“œ๋˜์–ด์•ผ ํ•  ํŒŒ์ผ์„ /USER_INPUT/static/script.js์˜ ํ˜•ํƒœ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์„œ๋ฒ„์—์„œ /USER_INPUT/static/script.js๊ฐ€ ํฌํ•จ๋œ ์ฑ„๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด XSS ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด ๊ฒฝ์šฐ ๊ณต๊ฒฉ์ž๋Š” USER_INPUT ๋ถ€๋ถ„์„ ์กฐ์ž‘ํ•˜์—ฌ index.php/;alert(1);//static/script.js์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ฒฝ๋กœ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์ด script ํƒœ๊ทธ์˜ src๋กœ ๋“ค์–ด๊ฐ€ alert(1); ์ด๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์—ฌ๊ธฐ์„œ ;๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ statement๊ฐ€ ๋์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ณ  //๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•ด์„ํ•  ์ˆ˜ ์—†๋Š” ๋‹จ์ˆœ ๋ฌธ์ž์—ด์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋กœ๋“œํ•˜๋Š” ์ฝ”๋“œ ๋‚ด์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ๋ฒ• ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์‹ ๊ฒฝ์จ์•ผ ํ•œ๋‹ค.

 

CSS์™€ ์—ฐ๊ณ„

์Šคํƒ€์ผ์‹œํŠธ์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋กœ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๋ฌธ๋ฒ•์„ ๋งŒ๋‚˜๋ฉด ๋ฌด์‹œํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๋ฌธ๋ฒ•์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๋ฌธ๋ฒ•์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค๋Š” ํŠน์ง•์ด ์กด์žฌํ•œ๋‹ค.

์ฆ‰, RPO ์ทจ์•ฝ์ ์„ ์ด์šฉํ•ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ์Šคํƒ€์ผ์‹œํŠธ ํŽ˜์ด์ง€๋ฅผ ์ž„ํฌํŠธํ•˜๋„๋ก ํ•˜๊ณ , ํ•ด๋‹น ํŽ˜์ด์ง€ ๋‚ด ์ผ๋ถ€๋ถ„์— ์œ ํšจํ•œ CSS ๋ฌธ๋ฒ•์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋ฅผ CSS Injection์œผ๋กœ ์—ฐ๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ด์šฉํ•œ ๊ณต๊ฒฉ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฌธ๋ฒ•์— ๋งž์ง€ ์•Š๋Š” ์ฝ”๋“œ๊ฐ€ ๋‚˜์™€๋„ ์ •์ƒ์ ์œผ๋กœ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•œ XSS ๊ณต๊ฒฉ๋ณด๋‹ค ์ข€ ๋” ์ œ์•ฝ์กฐ๊ฑด์ด ์ค„์–ด๋“ ๋‹ค. ๋งŒ์•ฝ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•œ XSS ๊ณต๊ฒฉ์ด ๊นŒ๋‹ค๋กญ๋‹ค๋ฉด, CSS Injection์œผ๋กœ ๊ณต๊ฒฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์˜ˆ์‹œ์ด๋‹ค.

์‹ค์ œ๋กœ ๊ณผ๊ฑฐ ๊ตฌ๊ธ€์—์„œ RPO ์ทจ์•ฝ์ ์„ ์ด์šฉํ•ด CSS Injection์œผ๋กœ ์—ฐ๊ณ„ํ•˜์—ฌ ๊ตฌ๊ธ€ ๋ฒ„๊ทธ๋ฐ”์šดํ‹ฐ ํฌ์ƒ์„ ์ œ๊ณตํ•œ ์ด๋ ฅ๋„ ์กด์žฌํ•œ๋‹ค.

 

base-uri ๋ฏธ์ง€์ •

๋งŒ์•ฝ ์ž„์˜์˜ ํƒœ๊ทธ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ณ , ํŽ˜์ด์ง€ ๋‚ด์— RPO ์ทจ์•ฝ์ ์ด ์กด์žฌํ•œ๋‹ค๋ฉด, ๊ณต๊ฒฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์ž์‹ ์˜ ์„œ๋ฒ„๋ฅผ base ์ฃผ์†Œ๋กœ ์„ค์ •ํ•˜๊ณ  ๋กœ๋“œ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๊ณผ ๊ฐ™์€ ์ด๋ฆ„์˜ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

[์ฐธ๊ณ ]

https://learn.dreamhack.io/575

https://www.hahwul.com/cullinan/rpo