(1) ์ดํด
XSS(Cross-Site Scripting)๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณด์ ์ทจ์ฝ์ ์ค ํ๋๋ก, ์
์์ ์ธ ์ฌ์ฉ์๊ฐ ์น ํ์ด์ง์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์
ํ์ฌ ๋ค๋ฅธ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์คํ์ํค๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ด๋ค. ๋ง์น ๋ค๋ฅธ ์ฌ๋์ ์ง์ ๋ชฐ๋ ๋ค์ด๊ฐ ์ ๋ฑ์ ์ผ๊ฑฐ๋ ์์
์ ํ์ด๋๋ ๊ฒ๊ณผ ๋น์ทํ๋ค.
![[๊ทธ๋ฆผ 1-1] XSS ๊ณต๊ฒฉ](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F6d7fa230-23c2-4b9c-b287-fdeb076e90bd%2Fdc989b5d-3a3d-4794-a00b-173833335368%2Fxss_(4).png?table=block&id=bb8a1d3f-9f3d-4427-90f1-ea2042065684&cache=v2)
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ณต๊ฒฉ์๋ XSS๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ์
์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณด๋ด๊ณ , ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ ์คํฌ๋ฆฝํธ๊ฐ ์ ๋ขฐํ ์ ์๋ ์ถ์ฒ์์ ์๋ค๊ณ ๊ฐ์ฃผํ๋ฏ๋ก ํด๋น ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ๋ณด๊ด๋๊ณ ์คํ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, ์
์ฑ ์คํฌ๋ฆฝํธ๋ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์ฟ ํค, ์ธ์
ํ ํฐ ๋๋ ๊ธฐํ ๋ฏผ๊ฐํ ์ ๋ณด์ ์ก์ธ์คํ ์ ์๊ฒ ๋๋ค. ์ด๋ ๊ฒ ๊ณต๊ฒฉ์๋ XSS๋ฅผ ํตํด ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ํ์ทจํ๊ฑฐ๋ ์น ์ฌ์ดํธ๋ฅผ ๋ณ์กฐ/์์์ํฌ ์ ์๋ค.
ย
(2) XSS ๊ณต๊ฒฉ์ ์ข ๋ฅ
1) Stored XSS(์ ์ฅํ XSS)
Stored XSS๋ ์
์์ ์ธ ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์ ์ ์ฅ๋์ด ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ํด๋น ์น ํ์ด์ง์ ์ ์ํ ๋๋ง๋ค ์คํ๋๋ XSS ๊ณต๊ฒฉ์ด๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํฌ๋ฆฝํธ๊ฐ ์ง์ ์ ์ฅ๋๋ ๋ฐฉ์์ผ๋ก ๊ณต๊ฒฉ์ด ์ด๋ฃจ์ด์ง๋ฏ๋ก ๋ค๋ฅธ ์ฌ์ฉ์๋ค์๊ฒ ์ง์์ ์ผ๋ก ์ํ์ด ๋๋ค. Stored XSS๋ ๋๊ธ์ด๋ ๊ฒ์๊ธ, ํ๋กํ ๋ฑ ์ฌ์ฉ์ ์์ฑ ์ฝํ
์ธ ๊ฐ ์ ์ฅ๋๋ ๊ณณ์์ ์ฃผ๋ก ๋ฐ์ํ๋ค.
์๋ฅผ ๋ค์ด, ๊ฒ์ํ์ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ํฌํจํ์ฌ ๊ธ์ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
<script>alert('XSS ๊ณต๊ฒฉ!');</script>
๋ฐ๋ก XSS ๊ณต๊ฒฉ์ ๋ํ ์๋ฐฉ์ด ๋์ด์์ง ์๋ค๋ฉด ์๋ฒ์ ์ ์ฅ๋ ํด๋น ๊ฒ์๊ธ์ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ ์ํ ๋๋ง๋ค ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ด ๊ฒฝ๊ณ ์ฐฝ์ด ๋จ๊ฒ ๋ ๊ฒ์ด๋ค.
2) Reflected XSS(๋ฐ์ฌํ XSS)
Reflected XSS๋ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ์ด ์๋ฒ์์ ์ฒ๋ฆฌ๋ ํ ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํ๋ ๋ ๋ฐ์ํ๋ XSS ๊ณต๊ฒฉ์ด๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ์
์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ ์
๋ ฅ์ ์๋ฒ์ ๋ณด๋์ ๋ ์๋ฒ๊ฐ ์ด๋ฅผ ํํฐ๋งํ์ง ์๊ณ ๊ทธ๋๋ก ๋ฐํํ์ฌ ๊ณต๊ฒฉ์ด ์คํ๋๋ ๊ฒ์ด๋ค. ์ฃผ๋ก URL์ ์
์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํด ๋ณด๋ด๋ ์์ผ๋ก ๊ณต๊ฒฉ์ด ์ด๋ฃจ์ด์ง๋ฉฐ, ์ผํ์ฑ ๊ณต๊ฒฉ์ด๋ผ๋ ํน์ง์ด ์๋ค. ์ด์ ๊ฐ์ด Reflected XSS๋ ๊ฒ์ ์์ง, ๋ก๊ทธ์ธ ํ์ด์ง, ๊ฒ์ํ์ ๊ฒ์ ๊ธฐ๋ฅ ๋ฑ์์ ์ฃผ๋ก ๋ฐ์ํ๋ค.
์๋ฅผ ๋ค์ด,
http://example.com/search?q=<script>alert('XSS ๊ณต๊ฒฉ!');</script>
๊ณผ ๊ฐ์ด URL์ ์
๋ ฅํ์ฌ ๊ฒ์์ ์ํํ๊ฒ ๋๋ฉด ๊ฒ์ ๊ฒฐ๊ณผ ํ์ด์ง์์ ํด๋น ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ด ๊ฒฝ๊ณ ์ฐฝ์ด ๋จ๊ฒ ๋ ๊ฒ์ด๋ค.3) DOM-based XSS(DOM ๊ธฐ๋ฐ XSS)
DOM-based XSS๋ ํด๋ผ์ด์ธํธ ์ธก ์คํฌ๋ฆฝํธ์์ DOM์ ์กฐ์ํ์ฌ ๋ฐ์ํ๋ XSS ๊ณต๊ฒฉ์ด๋ค. ํด๋ผ์ด์ธํธ ์ธก JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ทจ์ฝ์ ์ ์ด์ฉํ์ฌ ๊ณต๊ฒฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ด๋ ๋ฏ ์๋ฒ ์ธก์ด ์๋ ํด๋ผ์ด์ธํธ ์ธก์์ ์ทจ์ฝ์ ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ ์ธก ํํฐ๋ง ๋ง์ผ๋ก๋ ๋ฐฉ์ด๊ฐ ์ด๋ ค์ฐ๋ฏ๋ก, ์ฌ์ฉ์ ์
๋ ฅ์ ๊ทธ๋๋ก DOM์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ ํนํ ์ ์ํด์ผ ํ๋ค. DOM-based XSS๋ JavaScript๋ก ๋์ ์ผ๋ก ์์ฑ๋๋ HTML ์ฝํ
์ธ ๋ฑ์์ ์ฃผ๋ก ๋ฐ์ํ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด ์ฌ์ฉ์์ ์
๋ ฅ ๊ฐ์ ์ฝ์ด์ ๊ทธ๋๋ก DOM์ ์ถ๊ฐํ๋ JavaScript ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
<input type="text" id="userInput"> <button onclick="displayMessage()">๋ฉ์์ง ํ์</button> <div id="message"></div> <script> function displayMessage() { // ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ ๊ฐ์ ธ์ค๊ธฐ const userInput = document.getElementById("userInput").value; // ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ์ ์ง์ innerHTML์ ์ฝ์ (์ทจ์ฝ์ !) document.getElementById("message").innerHTML = userInput; } </script>
์์ ๊ฒฝ์ฐ ์
๋ ฅ ๊ฐ์
<script>alert('XSS ๊ณต๊ฒฉ!');</script>
๊ณผ ๊ฐ์ ๊ฐ์ด ๋ค์ด์ค๊ฒ ๋๋ฉด, JavaScript ์ฝ๋์์ ํด๋น ์
๋ ฅ ๊ฐ์ ์ฝ์ด์ DOM์ ์ง์ ์ถ๊ฐํ๊ฒ ๋๋ฏ๋ก, ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ด ๊ฒฝ๊ณ ์ฐฝ์ด ๋จ๊ฒ ๋๋ค.ย
์ธ ๊ฐ์ง์ XSS ๊ณต๊ฒฉ์ ์์ฝํด๋ณด๋ฉด ๋ค์ ํ์ ๊ฐ๋ค.
๊ตฌ๋ถ | Stored XSS | Reflected XSS | DOM-based XSS |
ํน์ง | ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํตํด ๊ณต๊ฒฉ | ์ฌ์ฉ์ ์
๋ ฅ์ด ์๋ฒ๋ฅผ ๊ฑฐ์ณ ๋ค์ ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ฌ๋์ด ๊ณต๊ฒฉ | ํด๋ผ์ด์ธํธ ์ธก ์คํฌ๋ฆฝํธ์์ DOM์ ์กฐ์ํ์ฌ ๊ณต๊ฒฉ |
๋ฐ์ ์์น | ์๋ฒ | ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด | ํด๋ผ์ด์ธํธ |
์ ์ฅ ์์น | ์๋ฒ์ ์ ์ฅ๋จ | ์๋ฒ์ ์ ์ฅ๋์ง ์์ | ์๋ฒ์ ์ ์ฅ๋์ง ์์ |
๊ณต๊ฒฉ ์ง์์ฑ | ์ง์์ | ์ผํ์ฑ | ์ผํ์ฑ ๋๋ ์ง์์ |
๊ณต๊ฒฉ ๋ฒ์ | ๋ค์ ์ฌ์ฉ์ | ํน์ ์ฌ์ฉ์ | ํน์ ์ฌ์ฉ์ |
์ ์์๋ค์ ์ค๋ช
์ ๋๊ธฐ ์ํด ๊ฐ์ ํ ๊ฐ๋จํ XSS ๊ณต๊ฒฉ์ ์์์ด๋ฉฐ, ์ค์ XSS ๊ณต๊ฒฉ์ ๋์ฑ ๋ณต์กํ๊ณ ๋ค์ํ ํํ๋ก ์ด๋ฃจ์ด์ง ์ ์๋ค.
ย
(3) XSS ๋ฐ์ ๊ฒฝ์ฐ
1) ์ ๋ ฅ ๊ฐ์ ๋ํ ๊ฒ์ฆ ๋ถ์กฑ
์
๋ ฅ ๊ฐ์ ๋ํ ๊ฒ์ฆ์ด ๋ถ์กฑํ ๋ XSS ๊ณต๊ฒฉ์ ๋
ธ์ถ๋ ์ ์๋ค. ์น ์ดํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ์ ์
๋ ฅ์ ์ ๋๋ก ๊ฒ์ฌํ์ง ์๊ณ ๊ทธ๋๋ก ๋ฐ์ํ ๊ฒฝ์ฐ, ์
์์ ์ธ ์คํฌ๋ฆฝํธ๊ฐ ์ฝ์
๋ ์ ์๋ค.
2) ์ถ๋ ฅ ๊ฐ์ ๋ํ ์ธ์ฝ๋ฉ ๋ถ์กฑ
์ถ๋ ฅ ๊ฐ์ ๋ํ ์ธ์ฝ๋ฉ์ด ๋ถ์กฑํ ๋์๋ ์ด๋ฌํ XSS ๊ณต๊ฒฉ์ ๋
ธ์ถ๋ ์ ์๋ค. ์น ํ์ด์ง์ ์ถ๋ ฅ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ๊ฒ ์ธ์ฝ๋ฉํ์ง ์์ผ๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์คํฌ๋ฆฝํธ๋ก ํด์ํ์ฌ ์คํํ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก, XSS ๊ณต๊ฒฉ์ ์๋ฐฉํ๊ธฐ ์ํด์๋ ์
๋ ฅ ๊ฐ์ ๋ํ ๊ฒ์ฆ๊ณผ ์ถ๋ ฅ ๊ฐ์ ๋ํ ์ธ์ฝ๋ฉ์ด ํ์์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ์ผํ๋ค.
ย
(4) XSS ๋์ฑ ๋ฐฉ๋ฒ
1) ์ ๋ ฅ ๊ฐ ๊ฒ์ฆ
๋จผ์ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ์ ๋ํด ๊ฒ์ฆ์ ๊ฑฐ์น๋ ๋ฐฉ๋ฒ์ด ์๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ฐ์ดํฐ์ ์
์์ ์ธ ์ฝ๋๊ฐ ํฌํจ๋์ด ์๋์ง ๊ฒ์ฌํ๋ ๊ณผ์ ์ด๋ค. ์
๋ ฅ ๊ฐ์ ๊ฒ์ฆํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค. ์ด๋ฌํ ์
๋ ฅ ๊ฐ ๊ฒ์ฆ์ XSS ๊ณต๊ฒฉ์ ์ฒซ ๋ฒ์งธ ๋ฐฉ์ด์ ์ด๋ฉฐ, ๊ฐ์ฅ ์ค์ํ ์๋ฐฉ ์กฐ์น ์ค ํ๋์ด๋ค.
์
๋ ฅ๊ฐ ๊ฒ์ฆ ๋ฐฉ๋ฒ
- ํ์ดํธ๋ฆฌ์คํธ ๋ฐฉ์: ํ์ฉ๋๋ ๋ฌธ์์ ํน์ ๋ฌธ์๋ง ์ ์ํ๊ณ , ์ด๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ฌธ์๋ ๊ฑฐ๋ถํ๋ ๋ฐฉ๋ฒ
- ๋ธ๋๋ฆฌ์คํธ ๋ฐฉ์: ๊ธ์ง๋ ๋ฌธ์์ ํน์ ๋ฌธ์๋ฅผ ์ ์ํ๊ณ , ์ด๋ฌํ ๋ฌธ์๊ฐ ํฌํจ๋ ์ ๋ ฅ์ ๊ฑฐ๋ถํ๋ ๋ฐฉ๋ฒ
- ์ ๊ท ํํ์: ๋ณต์กํ ํจํด์ ์ฌ์ฉํ์ฌ ์ ์์ ์ธ ์ฝ๋๋ฅผ ํ์งํ๊ณ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ
- ์ ๋ ฅ ๊ธธ์ด ์ ํ: ์ ๋ ฅ ๊ฐ๋ฅํ ๋ฌธ์์ ์ต๋ ๊ธธ์ด๋ฅผ ์ ํํ์ฌ ๊ณผ๋ํ ์ ๋ ฅ์ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ
2) ์ถ๋ ฅ ๊ฐ ์ธ์ฝ๋ฉ
์ถ๋ ฅ ๊ฐ ์ธ์ฝ๋ฉ์ ์น ํ์ด์ง์ ์ถ๋ ฅ๋๋ ๋ฐ์ดํฐ๋ฅผ HTML ์ํฐํฐ๋ก ๋ณํํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์คํฌ๋ฆฝํธ๋ก ํด์ํ์ง ๋ชปํ๋๋ก ํ๋ ๊ณผ์ ์ด๋ค. ์ถ๋ ฅ ๊ฐ์ ์ธ์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค. ์ถ๋ ฅ ๊ฐ ์ธ์ฝ๋ฉ์ ์
๋ ฅ ๊ฐ ๊ฒ์ฆ๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ๋์ฑ ๊ฐ๋ ฅํ ๋ณด์ ์ฒด๊ณ๋ฅผ ๊ตฌ์ถํ ์ ์๋ค.
์ถ๋ ฅ ๊ฐ ์ธ์ฝ๋ฉ ๋ฐฉ๋ฒ
- HTML ์ํฐํฐ:
<
,>
,&
,'
,"
๋ฑ์ ํน์ ๋ฌธ์๋ฅผ<
,>
,&
,'
,"
์ ๊ฐ์ HTML ์ํฐํฐ๋ก ๋ณํ
<script>alert('XSS ๊ณต๊ฒฉ!');</script>
โก๏ธ<script>alert('XSS Attack!')</script>
- Context-aware escaping: ์ถ๋ ฅ๋๋ ์์น์ ๋ฐ๋ผ ์ ์ ํ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ ์ฉ
(์๋ฅผ ๋ค์ด, JavaScript ์ฝ๋ ๋ด์์ ์ถ๋ ฅ๋๋ ๋ฐ์ดํฐ๋ JavaScript ์ํฐํฐ๋ก ์ธ์ฝ๋ฉ)
ย
XSS ๊ณต๊ฒฉ์ ์๋ฐฉํ๊ธฐ ์ํด์๋ ์
๋ ฅ ๊ฐ ๊ฒ์ฆ, ์ถ๋ ฅ ๊ฐ ์ธ์ฝ๋ฉ ๋ฑ ๋ค์ํ ๋ณด์ ์กฐ์น๋ฅผ ํจ๊ป ์ ์ฉํด์ผ ํ๋ค. ๋ํ, ๊ฐ๋ฐ ๊ณผ์ ์์๋ถํฐ ๋ณด์์ ๊ณ ๋ คํ๊ณ , ์ ๊ธฐ์ ์ธ ๋ณด์ ์ ๊ฒ์ ์ํํ๋ ๊ฒ์ด ์ค์ํ๋ค.