Web Security
XSS, XSRF(CSRF), SQL Injection and OWASP/WebGoat
1. OWASP/WebGoat ๐ฉโ๐ป
Open Web Application Security Project ๋ ์น ๋ณด์ ์ทจ์ฝ์ ์ ์ฃผ๋ก ๋ค๋ฃจ๋ ๋น์๋ฆฌ ์คํ ์ปค๋ฎค๋ํฐ๋ก ์ ๋ขฐํ ์ ์๋ ์ฑ๊ณผ API ๋ฅผ ๊ฐ๋ฐํ๋๋ก ๋๋๋ค. ๊พธ์คํ ์ด๊ณณ์์ ๊ณต๊ฐํ๋ ์น ๋ณด์ ์ทจ์ฝ์ TOP10 ๋ง ์ ๋๋ก ์ฒ๋ฆฌํด๋ ์๋นํ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค. ์ฐธ๊ณ ๋ก OWASP GitHub ๋ ์ด๊ณณ์์ ์ด์ํ๋ ๊นํ๋ธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์น ์ทจ์ฝ์ ์ ๋ํ ๊ธฐ๋ณธ ํ์ต ๋ฐ ํ
์คํธ๋ฅผ ์ํด OWASP WebGoat ๋ฅผ ์ด์ฉํ๋ฉด
ํธ๋ฆฌํ๋ค. OWASP ์์๋ ์๊ฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก WebGoat ๋ ํ
์คํธ ํ ์ ์๋ ์น ์๋ฒ๋ก Docker
๋๋ jar
๋ก ๋ฐฐํฌ๋๋ค.
2. SQL Injection ๐ฉโ๐ป
- ๊ณต๊ฒฉ ๋์ : Database
- ๋งค๊ฐ์ฒด : ์์
- ๋ฐฉ์ : SQL ์ ์์๋๋ ๊ฐ์ด ์๋ ๊ณต๊ฒฉ ๋ชฉ์ ์ ๊ฐ์ ๋ณด๋ด ๋ฐ์ดํฐ๋ฅผ ํ์ทจ/์ญ์ /๋ณ์กฐํ๋ค. SQL ๋ฌธ์ฅ์ด ์ปดํ์ผ ๋๊ธฐ ์ String ์ํ์ผ ๋ ์ ๋ ฅ๋๋ ๋ฐ์ดํฐ์ ์ทจ์ฝํ ์ ์ ์ด์ฉํ ๊ณต๊ฒฉ์ด๋ค.
1. String SQL Injection
SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '" + lastName + "';
์ ์ฟผ๋ฆฌ์ ๋ค์๊ณผ ๊ฐ์ ๊ณต๊ฒฉ์ ํ๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ทจํ ์ ์๋ค.
SELECT * FROM user_data WHERE first_name = 'John' and last_name = '' or '1' = '1'
๋น์ทํ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๊ณต๊ฒฉ๋ ๊ฐ๋ฅํ๋ค.
2. Numeric SQL Injection
3. How to prevent?
์์ฆ์ ๋๊ฒ ์์ ์๊ฐ๋ ๋ฐฉ์์ผ๋ก๋ SQL Injection ์ด ๋ถ๊ฐ๋ฅํ๋ค. SQL ์คํ์ ์ํด ORM ๊ฐ์ ๊ฒ์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ์ฌ์ด ๊ณต๊ฒฉ์ ์คํ ์ด์ ์ ์ฐจ๋จ๋๋ค. ํ์ง๋ง ์ด๋ค ์์ผ๋ก ๊ณต๊ฒฉ์ด ์ด๋ฃจ์ด์ง๋์ง ์์์ผ ๋์์ ํ ์ ์์ผ๋ ๋ฐ๋์ ๊ธฐ๋ณธ๋ถํฐ ์์์ผํ๋ค. ๋ฌผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ฉํ๋ ๊ฒ ๋ง์ผ๋ก ์ถฉ๋ถํ์ง ์์ผ๋ฏ๋ก, ๋์ ๋ณด์์ด ์๊ตฌ๋๋ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ธ ์ฅ์น๊ฐ ํ์ํ ๊ฒ์ด๋ค.
3. CSRF(XSRF, Cross-site request forgery) ๐ฉโ๐ป
- ๊ณต๊ฒฉ ๋์ : WAS, Database
- ๋งค๊ฐ์ฒด : Browser
- ๋ฐฉ์ : ์๋ฒ๊ฐ ์ด๋ฏธ ์ธ์ฆ๋ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ ์ ์ฉํ๋ ๊ฒ์ ์ด์ฉํ ๊ณต๊ฒฉ์ด๋ค.
Cross-site Request Forgery ๋ก ์ฌ์ฉ์์ ์์ง์ ๋ฌด๊ดํ๊ฒ ์๋ฒ๊ฐ ์ด๋ฏธ ์ธ์ฆ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ์ด์ฉํด ๊ณต๊ฒฉํ๋ค. ์ฃผ๋ฌธํ์ง ์์ ๋ฌผ๊ฑด์ ๊ตฌ๋งคํ๋๋ก ํ ์๋ ์๊ณ , ๊ณ์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ๊ธฐ๋ก์ ์ญ์ ํ๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ํ์ง ์์ ์ก๊ธ์ ํ ์๋ ์๋ค.
How to prevent?
1 ) Referer ๊ฒ์ฆ
HTTP Request Header ์ ํฌํจ๋ Referer (์์ฒญ์์ ์ ๋ ์ฃผ์ ๋๋ ์ผ๋ถ ์ฃผ์๋ก
document.referrer
๋ฅผ ํตํด ์ฝ๊ฒ ํ์ธํ ์ ์๋ค) ์ ๋ณด๋ฅผ ๊ฒ์ฆํ๋ค
ํ์ง๋ง ์ด๊ฒ์ ์ฝ๊ฒ ์กฐ์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํฌ๊ฒ ๋์ ๋๋ ๋ฐฉ์์ ์๋๋ค.
2 ) CSRF Token
์ก๊ธ์ด๋ ์ ๋ณด ๋ณ๊ฒฝ๊ณผ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๋ค๋ฃฐ ๋ ์์ฒญ๋ ํฌ๊ธฐ์ ๋์ ํ ํฐ์ ๋ฐํํด ํ๋ฉด์ ์๋ตํ ๋ form
์ hidden
์ผ๋ก ๋ฃ์ด๋๊ฑฐ๋ POST
์์ฒญ ์ ํจ๊ป ์๋ตํ ์ ์๋๋ก ๋ทฐ ํ์ด์ง๋ฅผ ๋ณด๋ด์ค๋ค. ์ด๋ ๊ฒ ํ๋ฉด Cookie
๋ Local Stroage
๋ฑ์ ์ ์ฅํ์ง ์์ผ๋ฏ๋ก XSS ์ ์ํ ํ์ทจ๊ฐ ์ด๋ ค์์ง๋ค. ํด๋ผ์ด์ธํธ๋ ๋งค ์์ฒญ๋ง๋ค ์ด๋ฅผ ํจ๊ป ๋ณด๋ด์ผํ๊ณ , ์๋ฒ๋ ์ด๋ฅผ
๊ฒ์ฆํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ํ ํฐ์ ๊ฐ ๋ทฐ ํ์ด์ง๋ง๋ค ๋ฐํ๋ ํ ํ์๊ฐ ์์ด์ง๋ฉด ์ฆ์ ์ญ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก JWT
ํ ํฐ ๋๋
OAuth 2.0
์ธ์ฆ ํ ํฐ ๋ฑ์ Local Storage ์ ์ ์ฅํ๋๋ฐ ์ด๋ XSS ์ ์ํด ํ์ทจ๋๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ CSRF Token
์ผ๋ก ์ถ๊ฐ์ ์ธ ๋ณด์ ์กฐ์น๋ฅผ ํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ด ํ ํฐ์ ์์ธกํ ์ ์์ด์ผํ๋ค.
CSRF Token ๊ด๋ จํด์๋ PortSwigger - CSRF ์ PortSwigger - CSRF Token Validation ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
4. DDoS(Distributed Denial of Service) ๐ฉโ๐ป
- ๊ณต๊ฒฉ ๋์ : WAS
- ๋งค๊ฐ์ฒด : Client PC
- ๋ฐฉ์ : ๋ง์ ์ปดํจํฐ๋ฅผ ๊ฐ์ผ์์ผ ์งง์ ping ์ผ๋ก ๋์ ๋ค๋ฐ์ ์ผ๋ก ์์ฒญํด ์๋ฒ์ ๊ณผ๋ถํ๋ฅผ ์ผ์ผ์ผ ์ฅ์ ๋ฅผ ์ ๋ฐํ๋ ๊ณต๊ฒฉ์ด๋ค.
DDos ๊ณต๊ฒฉ์ ๋คํธ์ํฌ(๊ณ์ธต 3), ์ ์ก(๊ณ์ธต 4), ํํ(๊ณ์ธต 6) ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ (๊ณ์ธต 7) ๊ณ์ธต์์ ๊ฐ์ฅ ๋ง์ด ๋ํ๋๋ฉฐ ์๋น์ค์ ์ฅ์ ๋ฅผ ์ผ์ผํค๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค.
How to prevent?
์ฌ์ค์ DDoS ๊ณต๊ฒฉ์ ๊ณต๊ฒฉ ๋นํ๋ ์๋ฒ๋ฅผ ๊ฐ์ผ์ํค๋ ๊ฒ์ด ์๋ ๋ค์์ ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ์ผ์ํค๋ ๊ฒ์ด๋ผ ์๋ฒ ์ธก์์ ์๋ฐฉ์ ํ ์๋ ์๊ณ ๋ฐฉ์ด๋ง ๊ฐ๋ฅํ๋ค.
1 ) DDoS ํจํด ํ์ง
์ ์ ํธ๋ํฝ๊ณผ ๋น์ ์ ํธ๋ํฝ์ ๋ถ์ํ๊ณ ๋น ๋ฅด๊ฒ ํ์งํด ์ ์์ ์ธ ํธ๋ํฝ๋ง ์์ฉํ ์ ์๋๋ก ํด ์์ฉ ๊ฐ๋ฅํ ํธ๋ํฝ์ ์ ํํ๋ค.
2 ) CDN ๋ฑ์ ์ด์ฉํ ๋ถ์ฐ
Content Delivery Network ์ ๋ณธ๋ ๋ชฉ์ ์ ์ธ๊ณ ์ฌ๋ฌ ๊ณณ์ ๋ถ์ฐ์ํด์ผ๋ก์จ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๋จ์ถ์ํค๊ณ , ๋์ญํญ ๋น์ฉ์ ์ ๊ฐํ๋ฉฐ, ๊ฐ์ฉ์ฑ์ ๋์ด๋ ๊ฒ์ด๋ค. ์ฆ, CDN ์ ๊ตฌ์ถํ๋ค๋ ๊ฒ์ ๊ณต๊ฒฉ์ ๋์์ ํ ๊ณณ์ ์ง์คํ ์ ์๋๋ก ํด DDoS ๊ณต๊ฒฉ์ ์ํด ์ ์ฒด ์๋น์ค๊ฐ ์ ์ง๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
5. XSS(Cross-site scripting) ๐ฉโ๐ป
- ๊ณต๊ฒฉ ๋์ : Client
- ๋งค๊ฐ์ฒด : Browser
- ๋ฐฉ์ : ์ฌ์ฉ์๊ฐ ํน์ ์น ์ฌ์ดํธ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ์ด์ฉํ ๊ณต๊ฒฉ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์ฌ์ฉ์์ ์๋์ ๋ค๋ฅธ ํ์๋ฅผ ์คํ์ํค๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ๋ ๋ชจ๋ ๊ณต๊ฒฉ์ ์๋ฏธํ๋ค.
Cross-site scripting ์ ์ถ์ฝํ์ด
XSS
์ธ ์ด์ ๋CSS
๋ ์ผ๋ฐ์ ์ผ๋ก Cascading Style Sheets ๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ด๋ค.
1. Difference between XSS
and CSRF
XSS ์ CSRF ๋ ๋ชจ๋ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋งค๊ฐ์ฒด๋ก ํ๋ค๋ ์ ์ ๋์ผํ๋ค. ํ์ง๋ง CSRF ๋ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ฉํด ์ ๋ขฐํ๋ ์๋ฒ๋ฅผ
๋์์ผ๋ก ๊ณต๊ฒฉํ๋ฏ๋ก ์ฌ์ฉ์์ ์ธ์ฆ๋ ์ธ์
์ ์
์ฉ
ํ๋ค. ๋ฐ๋ฉด XSS ๋ ๋ธ๋ผ์ฐ์ ์์ฒด์ ๋ํด ๊ณต๊ฒฉ
ํ๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ์๋ํ์ง ์์
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๋ชจ๋ ๊ณต๊ฒฉ์ ์๋ฏธํ๋ค.
- CSRF ๊ณต๊ฒฉ : ๋ฌผํ ๊ตฌ๋งค๋ ์ก๊ธ๊ณผ ๊ฐ์ ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ธ๋ค. ๋๋ ๊ณต๊ฒฉ์๊ฐ ์ง์ CSRF ๋ฅผ ์ด์ฉํด ์ ๋ณด๋ฅผ ๋นผ์ ํ์ทจํ๋ค.
- CSRF & XSS ๊ณต๊ฒฉ : XSS ๋ฅผ ์ด์ฉํด ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ๋ก๋ถํฐ ์ธ์ฆ๋ ํ ํฐ์ ๋ฐ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ ธ๋ค ์ก๊ธ์ ๋ช ๋ นํ๋ ๋ฑ์ CSRF ๊ณต๊ฒฉ์ ํ๊ฑฐ๋ ์๋ฒ์ ์ ๋ขฐ๋ฅผ ํ๋ํ๊ธธ ๊ธฐ๋ค๋ ธ๋ค CSRF ์ํ๊ฐ ๋๋ฉด ์ ๋ณด๋ฅผ ํ์ทจํด XSS ๋ฅผ ์ด์ฉํด ๊ณต๊ฒฉ์์๊ฒ ์ ์กํ๋ ๋ฑ ๋ณตํจ์ ์ธ ๊ณต๊ฒฉ์ ํ ์ ์๋ค.
- XSS ๊ณต๊ฒฉ : ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋ ๊ณ์ ์ ๋ณด๋ ์ธ์ ์ ๋ณด ๋ฑ์ ๊ณต๊ฒฉ์์๊ฒ ์ ์กํด ํ์ทจํ๋ค. ์ฃผ๋ก CSRF ๊ณต๊ฒฉ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ํผ๋ํ๊ธฐ ์ฝ์ง๋ง CSRF ๊ณต๊ฒฉ์ ์๋ฒ์ ํน์ ๊ณต๊ฒฉ ํ์๋ฅผ ํ๋ ๊ฒ์ด๊ณ , XSS ๊ณต๊ฒฉ์ ์์ํ๊ฒ ์๋์น ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํค๋ ๊ณต๊ฒฉ ํ์ ์์ฒด๋ฅผ ์๋ฏธํ๋ค.
2. XSS Attack Types
XSS ๊ณต๊ฒฉ ์ ํ์ ํฌ๊ฒ 3๊ฐ์ง๋ก ๋๋๋ค.
1 ) Reflected XSS
HTTP Request/Response ๋ฅผ ์ด์ฉํ ๊ณต๊ฒฉ์ผ๋ก Request ๋ฅผ ๋ณด๋ธ ํ ๋์์จ Response ๊ฐ ํํฐ๋ง ๊ฐ์ ๊ฒ์ฆ ์์ด ์์ ํ์ง ๋ชปํ
๋ฐฉ๋ฒ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ํฌํจ
ํ๋ ๊ฒฝ์ฐ ์ด์ฉ์ด ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค์ด ๋ค์ ์์ฒญ์ ๋ณด๋์ ๋
https://insecure-website.com/status?message=All+is+well.
์๋ต ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋์ ํํฐ ์์ด ๋ฐ๋ก ๋ฐ์ํ๋ค๊ณ ํด๋ณด์.
<template>
<p>Status: {{ data }} </p>
</template>
๊ฐ๋ฐ์๋ ๋จ์ํ๊ฒ ์ด๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ์๋ํ์ ๊ฒ์ด๋ค.
<p>Status: All is well.</p>
ํ์ง๋ง ๊ณต๊ฒฉ์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฒญ์ ๋ณด๋ธ๋ค.
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>
๊ทธ ๊ฒฐ๊ณผ XSS ๊ณต๊ฒฉ์ ์ฑ๊ณตํ๋ค.
<p>Status: <script>/* Bad stuff here... */</script></p>
2 ) Stored XSS(Persistent XSS)
Persistent XSS ๋๋ Second-order XSS ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ, ์๋ฒ๊ฐ ์ ๋ขฐํ ์ ์๋ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ์์
ํ๊ณ ,
์ดํ HTTP ์์ฒญ์ ์ด ๋ฐ์ดํฐ๋ฅผ ํฌํจ
ํด ์๋ตํ ๊ฒฝ์ฐ ์ด์ฉ์ด ๊ฐ๋ฅํ๋ค.
๊ฒ์ํ ๋๋ ๋ฉ์์ง ์ฑ์ ๊ฒฝ์ฐ ํ๋์ ์์ฒญ์ด ์๋ฒ์ ์ ์ฅ๋์ด ์ดํ ์ ๊ทผํ๋ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๋ฐฐํฌ๊ฐ๋๋ค. ๋ฐ๋ผ์ ๊ณต๊ฒฉ์๋ ๋ฉ์์ง์ ๋ค์๊ณผ ๊ฐ์ด XSS ๊ณต๊ฒฉ์ ๋ณด๋ธ๋ค.
<script>/* Bad stuff here... */</script>
์ด๋ฅผ ์๋ฒ๊ฐ ๋ณ๋์ ํํฐ๋ง ์์ด ์ ์ฅ ํ, ๋ค์ ๋ค์ ์ฌ์ฉ์๊ฐ ๋ณ๋์ ํํฐ๋ง ์์ด ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ๋ค.
<p><script>/* Bad stuff here... */</script></p>
๊ณต๊ฒฉ์๋ ์๋ฒ์ XSS ๊ณต๊ฒฉ์ ์ ์ฅํ ํ ๊ธฐ๋ค๋ฆฐ๋ค. ์ดํ ์ 3์๊ฐ ์ ๊ทผํ๋ฉด XSS ๊ณต๊ฒฉ์ ์ฑ๊ณตํ๋ค.
3 ) DOM Based XSS
์ค์ฌ์ DOM XSS ๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ JavaScript ๋ก DOM ์ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด ์ ์ดํ ๋ ๋ฐ์ํ๋ค.
DOM XSS ์ทจ์ฝ์ ์ ๋ ๊ฐ์ง ์์๋ก ๋๋์ด ์๋ํ๋ค. ๊ณต๊ฒฉํ ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ๋๋ Source
์ ์ด ๊ณต๊ฒฉ์ด ์ด๋ฃจ์ด์ง๋ ๋์ Sink
๋ค.
- Source :
document.URL
,document.documentURI
,location.href
,location.search
,location.*
,window.name
, anddocument.referrer
etc. - Sink :
document.write
,(element).innerHTML
,eval
,setTimeout
,setInterval
, andexecScript
etc.
๋ค์๊ณผ ๊ฐ์ dashboard.html
์ด ์๋ค๊ณ ํ์.
<html>
(...)
Dashboard for
<script>
var pos=document.URL.indexOf("context=")+8;
document.write(decodeURIComponent(document.URL.substring(pos)));
</script>
(...)
</html>
๋ค์๊ณผ ๊ฐ์ด ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด
http://www.example.com/dashboard.html?context=Thomas
ํ์ด์ง๊ฐ ๋ก๋๋ ํ ์ฌ์ฉ์์ ์ด๋ฆ์ด ๋์ ์ผ๋ก ๋ ๋๋ง ๋ ๊ฒ์ด๋ค.
Dashboard for Thomas
ํ์ง๋ง ๊ณต๊ฒฉ์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ํ์ด์ง๋ฅผ ์์ฒญํ๋๋ก ๋งํฌ๋ฅผ ๋ณด๋ธ๋ค.
http://www.example.com/dashboard.html?context=%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%4c%45
%41%56%45%20%54%48%49%53%20%50%41%47%45%21%20%59%4f%55%20%41%52%45%20%42%45%49%4e%47%20%48%41%43%4b%45
%44%21%22%29%3b%3c%2f%73%63%72%69%70%74%3e
์ด๋ ๋์ฝ๋ฉ ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
<script>alert("LEAVE THIS PAGE! YOU ARE BEING HACKED!");</script>
๋ฐ๋ผ์ DOM ์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ์ ๋ ๊ฒ์ด๋ค.
Dashboard for <script>alert("LEAVE THIS PAGE! YOU ARE BEING HACKED!");</script>
๊ณต๊ฒฉ์๊ฐ ๋ง๋ ์ด ๋งํฌ๋ฅผ ๋ฐ์ ์ฌ์ฉ์๋ ์ํ์ ๋๋ผ๊ณ ํ์ด์ง๋ฅผ ๋ ๋๊ณ ์ด๊ฒ์ ํด๋น ์ฌ์ดํธ์ ํํ์ ์ํฅ์ ๋ฏธ์น๋ค.
DOM Based XSS ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ๋ eval
๊ณผ execScript
๋ฅผ ํ์ฉํ์ง ์๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ innerHtml
๊ณผ ๊ฐ์ด ์์ ํ์ง ์์ ๋ฐฉ๋ฒ์ผ๋ก HTML ์ ์ฝ์
ํ์ง ์๊ณ innerText
๋๋ textContent
๊ณผ ๊ฐ์ด
์์ ํ Sink
๋ฅผ ์ฌ์ฉํด ์คํฌ๋ฆฝํธ๊ฐ ์๋ํ์ง ์๋๋ก ํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ ์์ ๋ฅผ div
element ์ textContent
๋ฅผ ์ฌ์ฉํด ๋ค์๊ณผ ๊ฐ์ด ๊ณ ์น ์ ์๋ค.
<html>
(...)
Dashboard for <span id="contentholder"></span>
<script>
var pos=document.URL.indexOf("context=")+8;
document.getElementById("contentholder").textContent =
document.URL.substring(pos,document.URL.length);
</script>
(...)
</html>
XSS ๋ ์น ๊ฐ๋ฐ์ ์ทจ์ฝ์ ์ค ๊ฐ์ฅ ์น๋ช ์ ์ด๋ฉด์๋ ๊ฐ์ฅ ๋ค์ํ ์ ํ์ด ์กด์ฌํ๋ ๊ฒ ๊ฐ๋ค. ๋ฐ๋ผ์ OWASP - Cheatsheets - XSS ๋ฅผ ์ฐธ๊ณ ํด ๊พธ์คํ๊ฒ ์ ๊ฒฝ ์จ์ผ๋ง ํ ๊ฒ์ด๋ค.
3. Reflected vs. Stored vs. DOM
Reflected XSS ์ Stored XSS ๋ ๊ณต๊ฒฉ ์์ ๊ณผ ์๋ฒ ์ ์ฅ ์ ๋ฌด๊ฐ ๋ฌ๋ผ ๋ช
ํํ ๊ตฌ๋ถ๋์ง๋ง, DOM XSS ๋ XSS ๊ณผ CSRF ์ ํจ๊ป ๋ณตํฉ์ ์ผ๋ก
์ฌ์ฉ๋๋ ๊ฒ์ฒ๋ผ Reflected ๋๋ Stored XSS ์ ๋ณตํฉ์ ์ผ๋ก ์ฌ์ฉ๋๊ธฐ๋ ํ๊ธฐ ๋๋ฌธ์ ํผ๋๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๋ค๋ง DOM XSS ์์ฒด๋
์์ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ ๋ธ๋ผ์ฐ์ ์์ฒด ๋ด์์ ๋ฐ์ํ๋ Source
์ Sink
๋ฅผ ๋ค๋ฃฐ ๋ ๋ฐ์ํ๋ ์ทจ์ฝ์ ์ ๋งํ๋ค.
ย | Reflected XSS | Stored XSS | DOM XSS |
---|---|---|---|
Require HTTP | O | โณ (์๋ฒ์ ์ง์ ์ฌ์ ์๋ ์๋ค) | X (์ทจ์ฝ์ ์ ์ฌ๊ธฐ ์ํด Reflected ๋๋ Stored ์ ํจ๊ป ์ฌ์ฉํ๊ธฐ๋ ํ์ง๋ง DOM XSS ๊ณต๊ฒฉ ์์ฒด๋ ์๋ฒ์ ํต์ ์ด ํ์ ์๋ค) |
Save to Server | X | O | X |
Server XSS | O | O | X (DOM XSS ๋ ์๋ฒ์์ ๊ฐ์งํ๊ฑฐ๋ ๋ง๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค) |
Client XSS | O | O | O |
4. XSS Attack Examples
๋๋ฌด์ํค์ ์๊ฐ๋ XSS ์์ ๋ฅผ ์กฐ๊ธ ๋ ์๊ฐํด๋ณธ๋ค.
1 ) Inject script
Tag
<script>alert('XSS');</script>
๋งค์ฐ ๊ณ ์ ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ค๋๋ ์ ๋๋ถ๋ถ ๋งํ์๋ค.
- Inject
javascript:
Link
<a href="javascript:alert('XSS')">XSS</a>
๋งํฌ์ JavaScript ๋ฅผ ์คํํ๋๋ก ๋งํฌ๋ฅผ ์ฝ์
ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ script
์ฃผ์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋๋ถ๋ถ ๋งํ์๋ค.
2 ) Inject Event Attributes
<img src="#" alt="" onerror="alert('XSS')">
HTML ์์ onclick
, onload
, onerror
๊ณผ attributes ๋ ์ด๋ฒคํธ ์์ฑ์ผ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋
ํ๊ทธ์ธ ์ ์ ์ด์ฉํ๋ค.
3 ) Inject Black List Event Attributes
<ruby oncopy="alert('XSS')">XSS</ruby>
์ด๋ฒคํธ ์์ฑ์ ๊ฐ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ ์ฌ์ฉํ์ง ์๋ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ์ด๋ฒคํธ ์์ฑ์ ๋ธ๋๋ฆฌ์คํธ๋ก ๋ง์ผ๋ฉด ์ด๋ฐ ์ ์๋ ค์ง์ง ์์ ์ด๋ฒคํธ ์์ฑ์ ๋ซ๋ฆฌ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ํ์ดํธ๋ฆฌ์คํธ๋ก ๋ง์์ผ ์ด๋ฐ ์ ์๋ ค์ง์ง ์์ ์์ฑ์ผ๋ก ์ฐํํ ๊ณต๊ฒฉ์ ๋ง์ ์ ์๋ค.
4 ) ๋๋ ํ
๋ธ๋ผ์ฐ์ ๋ ์ฝ์ ์ ์์ง๋ง ์ฌ๋์ด ์ฝ๊ฒ ์ฝ์ ์ ์๋๋ก ๋๋
ํ ํ๋ค. ์ <a href="javascript:alert('XSS')">XSS</a>
๋ฅผ
์์คํค ์ฝ๋๋ก ๋๋
ํ๋ฅผ ํด๋ณด์.
Web HTML entity encoder/decoder ์ javascript:alert('XSS')
๋ถ๋ถ์
๋ฃ์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค.
<a href="javas
cript
:
alert
('XSS')">XSS</a>
๋ฌด์จ ์ฝ๋์ธ์ง ์ฌ๋์ ์ ์ ์์ผ๋ ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ์๋ฌด ๋ฌธ์ ์์ด
<a href="javascript:alert('XSS')">XSS</a>
์ ๋์ผํ๊ฒ ์ฝ๋๋ค.
์ ๋๋ ํ์ ํ ์ ๋ ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.
5. How to prevent?
1 ) OWASP ์ Cheatsheets ๋ฅผ ๊พธ์คํ ์ฐธ๊ณ ํ๋ค
OWASP - Cheatsheets - XSS ๋ฅผ ์ฐธ๊ณ ํด ์ต์ XSS ๊ณต๊ฒฉ์ ๊พธ์คํ ๋๋นํด์ผํ๋ค.
2 ) BBCode ๋ฅผ ์ฌ์ฉํ๋ค
Bulletin Board Code ๋ ์ ์ ๊ฒ์ํ์ ๊ธ์ ์์ฑํ๋๋ฐ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๊ฐ๋ฒผ์ด ๋งํฌ์
์ธ์ด๋ก HTML ๊ณผ ๋น์ทํ
์ญํ ์ ํ๋ฉฐ ๋ฌธ๋ฒ๋ ์ ์ฌํ๋ค. ๋จ, HTML ์ด๋ XML ์ด <
, >
๋ก ํ๊ทธ๋ฅผ ๋ํ๋ด๋ ๊ฒ๊ณผ ๋น๊ตํด [
, ]
๋ก ํ๊ทธ๋ฅผ ํ๋๋ธ๋ค.
์ฆ, <b>
ํ๊ทธ ๋์ [b]
ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋๋ก ํด XSS ๊ณต๊ฒฉ์ ์ฐจ๋จํ๋ค.
3 ) Filter ๋๋ Library ๋ฅผ ์ฌ์ฉํ๋ค
์ ์ฒด ์ ์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ Filter ๋ก ๊ฒ์ฌํ๊ฑฐ๋ ํ์ํ ๊ณณ์ Library ๋ฅผ ์ ์ฉํ๋ค.
<
, >
์ฒ๋ผ ๋จ์ ๋ฌธ์๋ก ์ธ์ํ๋๋ก ํํฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ํด๋ผ์ด์ธํธ์์ ์ด๋ฅผ ์คํํ ๋ XSS
๊ฐ ๋์ํ์ง ์๋๋ก
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ์์ ์ ๋ฌด๋ฅผ ๊ฒ์ฌํ๋ค.
4 ) CSP ์ฌ์ฉ
์ต์ ๋ธ๋ผ์ฐ์ ๋ ์ผ๋ฐ์ ์ผ๋ก SOP
(Same-Origin Policy)๋ฅผ ์ ์ฉํ๋ค. ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ CORS
(Cross-Origin Resource Sharing)๋ฅผ ํ์ํ๊ธฐ๋ ํ๋ฉฐ, SOP ๋ฅผ ์ ์ฉํ๋ค ํ๋๋ผ๋ ์ด๋ฅผ ์ฐํํ๋ ๊ณต๊ฒฉ๋ฒ์ด ์กด์ฌํ๋ฏ๋ก SOP ๋ผ๊ณ ์์ฌํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ Content Security Policy ๋ฅผ ์ฌ์ฉํด ์คํฌ๋ฆฝํธ ์คํ์ ๋ํ ์ถ์ฒ ์กฐ๊ฑด์ ํ์ดํธ๋ฆฌ์คํธ๋ก ์ ํํ๋๋ก ์ถ๊ฐ์ ์ธ ๋ณด์ ์กฐ์น๊ฐ ํ์ํ๋ค.
5 ) Frontend Frameworks/Library ์ฌ์ฉ
๋ฌผ๋ก , ํํฐ๋ฅผ ์ง์ ์ ์ํ๊ฑฐ๋ ๊ณต๊ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ์ข์ง๋ง ์ฐ์ ์ ์ผ๋ก Angular
, React
, Vue
, Svelte
์
๊ฐ์ ํ๋ ์์ํฌ ๋๋ ํ๋ ์์ํฌ์ ๊ฐ๊น์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ๊ฐ๋ฐํ๋ ๊ฒ์ด๋ค. ์ด๋ค์ ๋ฐฐํฌํ Documents ์ HTML ์ ๋ถ์ํ๊ธฐ ์ด๋ ต๊ฒ
๋ง๋ค๊ณ , ๋ง์ ์ ๋ณด๋ฅผ ์บก์ํ ํ๋ฉฐ, ๊ธฐ์กด์ ์๋ ค์ง ๋ง์ ์ทจ์ฝ์ ์ ์ข ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ๊ฒ ์ปจํธ๋กค ํ๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจํ๊ณ ์๋ค.
ํ์ง๋ง Vue ๋ฅผ ์๋ก ๋ค๋ฉด v-html
๋๋ findDOMNOde
, ref
์ ๊ฐ์ ๊ฐ๋ฐ์ ํธํ๊ฒ ํด์ฃผ๋ escape hatch
๊ฐ ์กด์ฌํ๋๋ฐ
์ด๋ฌํ ์ฝ๋๋ Vue ๊ฐ ๋ค์ XSS ๊ณต๊ฒฉ์ ๋
ธ์ถ๋๊ธฐ ์ฝ๊ฒ ๋ง๋ ๋ค. ๋ฐ๋ผ์ DOM XSS Examples ์์ ์ค๋ช
ํ
๊ฒ์ฒ๋ผ HTML ์ฝ๋๋ฅผ ์ง์ ์ถ๋ ฅํ๋ ๊ฒ์ ํผํด์ผํ๋ฉฐ, ์ ๋ง ํ์ํ ๊ฒฝ์ฐ๋
vue-sanitize ๋๋
sanitize-html ๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ค.
Reference
- โOWASP Top Ten.โ OWASP. accessed Jan. 20, 2023, OWASP Top Ten.
- โ์ฌ์ดํธ ๊ฐ ์คํฌ๋ฆฝํ .โ Wikipedia. Aug. 26, 2022, Wikipedia - ์ฌ์ดํธ ๊ฐ ์คํฌ๋ฆฝํ .
- โXSS.โ ๋๋ฌด์ํค. Aug. 09, 2022, ๋๋ฌด์ํค - XSS.
- โWebGoat/WebGoat.โ GitHub. Jan. 15, 2023, https://github.com/WebGoat/WebGoat.
- โReferer.โ MDN Web Docs. Oct. 28, 2022, MDN - Referer.
- โCross-site request forgery (CSRF).โ PortSwigger. accessed Jan. 20, 2023, PortSwigger - CSRF.
- โBypassing CSRF token validation.โ PortSwigger. accessed Jan. 20, 2023, PortSwigger - CSRF Token Validation.
- โDDoS ๊ณต๊ฒฉ์ด๋ ๋ฌด์์ ๋๊น?.โ AWS. accessed Jan. 20, 2023, DDoS ๊ณต๊ฒฉ์ด๋ ๋ฌด์์ ๋๊น?.
- โCDN์ด๋ ๋ฌด์์ ๋๊น?.โ AWS. accessed Jan. 20, 2023, CDN์ด๋ ๋ฌด์์ ๋๊น?.
- โHTML entity encoder/decoder.โ Web developer tools. accessed Jan. 22, 2023, Web HTML entity encoder/decoder.
- Tomasz Andrzej Nidecki. โDOM-based cross-site scripting.โ Invicti. accessed Jan. 22, 2023, DOM-based XSS.
- โDOM based XSS Prevention Cheat Sheet.โ OSASP. accessed Ja. 22, 2023, OWASP - Cheatsheets - XSS.
- โBBCode.โ Wikipedia. Dec. 11, 2022, Wikipedia - BBCode.