๐น๏ธ ๋ชจ์ํดํน ์ฒดํ ๋์
๐น๏ธ ๋ชจ์ํดํน ์ฒดํ ๋ฐ๋ผํ๊ธฐ โถ
STEP_1) ๊ฒ์ํ ๋ฌธ์์ด์ด ์ถ๋ ฅ ๋๋ ๊ฒ์ ํ์ธ
STEP_2) ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์ฝ์
ํ์ฌ ๊ฒ์ ์ ํน์ ๋ฌธ์๊ฐ ํํฐ๋ง๋๋ ๊ฒ์ ํ์ธ

STEP_3) ํํฐ๋ง ๋๋ ๋ฌธ์์ด์ ์ฐํํ์ฌ ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ ์ฝ์
ํ ๊ฒ์

STEP_4) ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ด ์ ์์ ์ผ๋ก ์คํ๋์ด FLAG ๊ฐ์ ํ์ธ ํ ์ ์์

O ์น ์ดํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ์ ๋ํ ํํฐ๋ง์ด ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์์ ๊ฒฝ์ฐ, ์
์์ ์ธ ์ฌ์ฉ์๊ฐ ์
๋ ฅ์ด ๊ฐ๋ฅํ ํผ(์น ๋ธ๋ผ์ฐ์ ์ฃผ์ ์
๋ ฅ ๋๋ ๊ฒ์ํ ๋ฑ)์ ์
์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์
ํ์ฌ ์ฌ์ฉ์ ์ธ์
๋์ฉ, ์
์ฑ์ฝ๋๋ฅผ ์ ํฌํ ์ ์๋ ์ทจ์ฝ์
# XSS ๊ณต๊ฒฉ ๋ฐฉ์
- Reflected XSS
: ํ๋ผ๋ฏธํฐ ๊ฐ ๋ด ์
์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ์ฌ ์ฌ์ฉ์์ ์์ฒญ๊ณผ ํจ๊ป ์ ์กํ๋ ๋ฐฉ์
: ์ ๋ฌ๋ ์
์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์์ ๋์ ์ผ๋ก ์์ฑ๋๋ ์๋ต์ ๋ฐ์๋์ด ์คํ๋๋ ์ทจ์ฝ์
- Stored XSS
: ์
์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์น ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ์ผ ๋ฑ์ ์ ์ฅํ๋ ๋ฐฉ์
: ์ ์ฅ๋ ์
์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์ฌ์ฉ์์ ์์ฒญ์ ์ง์์ ์ผ๋ก ์คํ๋๋ ์ทจ์ฝ์
O ๊ทผ๊ฑฐ ์๋ฃ
โ ์ฃผ์์ ๋ณดํต์ ๊ธฐ๋ฐ์์ค ๊ธฐ์ ์ ์ทจ์ฝ์ ๋ถ์ ํ๊ฐ ์์ธ ๊ฐ์ด๋(p.681)
โ OWASP TOP10 2021
O ํ๋จ ๊ธฐ์ค
์ํธ | ์ฌ์ฉ์ ์
๋ ฅ ์ธ์ ๊ฐ์ ๋ํ ๊ฒ์ฆ ๋ฐ ํํฐ๋ง์ด ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ |
์ทจ์ฝ | ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ์ ๋ํ ๊ฒ์ฆ ๋ฐ ํํฐ๋ง์ด ์ด๋ฃจ์ด์ง์ง ์์ผ๋ฉฐ, HTML ์ฝ๋๊ฐ ์
๋ ฅ ๋ฐ ์คํ๋๋ ๊ฒฝ์ฐ |
O ์ ๊ฒ ๋ฐฉ๋ฒ
- ๊ฒ์ํ ๋ฑ์ ์
์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์
ํ์ฌ ํด๋น ์คํฌ๋ฆฝํธ๊ฐ ํํฐ๋ง ๋๋์ง ํ์ธ
# ์์ ์คํฌ๋ฆฝํธ : <script>alert("xss")</script>, <IMG SRC=alert("XSS")>
O ์กฐ์น ๋ฐฉ๋ฒ
- ์ฌ์ฉ์ ์
๋ ฅ ๊ฐ์์ ์
๋ ฅ ๊ฐ๋ฅํ ๋ฌธ์ ์ ํํ๊ณ ๊ทธ ์ธ ๋ฌธ์ ํํฐ๋ง ์ ์ฉ
: ํํฐ๋ง ๋์ : GET ์ง์ ๋ฌธ์์ด, POST ๋ฐ์ดํฐ, ์ฟ ํค, URL ๋ฑ ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ๊ฐ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ
- ๊ฒ์ํ ๋ด HTML ํฌ๋งท์ ์ฌ์ฉํ ์ ์๋๋ก ์ค์
: HTML ํฌ๋งท์ด ํ์ํ ๊ฒฝ์ฐ ํ์ฉ๋ ํ๊ทธ๋ง ์ฌ์ฉํ๋๋ก ํ๊ณ , XSS์ ์
์ฉ๋ ์์ง๊ฐ ์๋ ํ๊ทธ๋ ์๋ฒ ์ฌ์ด๋ ์คํฌ๋ฆฝํธ์์ ์ ๊ฑฐ ๋ฐ ํน์ ๋ฌธ์๋ก ์นํํ๋๋ก ์ค์
- JAVA, Springboot ๊ฐ๋ฐ ํ๊ฒฝ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ณด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฉ
: Spring Security, OWASP Java Encoder ๋ฑ ์ด์/๊ฐ๋ฐ ํ๊ฒฝ์ ์ ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋จ ํ ์ ์ฉ ์กฐ์น
# ํํฐ๋ง ๋์ ํน์๋ฌธ์ ์์ โถ
๋ณ๊ฒฝ ์ | ๋ณ๊ฒฝ ํ |
< | < |
> | > |
( | ( |
) | ) |
# | # |
& | & |
{ | { |
} | } |
# ์์ ํํฐ๋ง ๋์ ๋ฌธ์์ด ์์ โถ
<script> | <object> | <applet> | <form> | <embed> |
<iframe> | <frame> | <base> | <body> | <frameset> |
<html> | <img> | <layer> | <a href> | <meta> |
<p> | <style> | <xxx src> | document. cookie | javascript |
# ํํฐ๋ง ๋์ ์๋ฐ ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์์ โถ
copy | cut | focusin | focusout |
fullscreenchange | fullscreenerror | onabort | onafterprint |
onanimationend
| onanimationiteration
| onanimationstart
| onbeforeprint
|
onbeforeunload
| onblur
| oncanplay
| oncanplaythrough
|
onchange
| onclick
| oncontextmenu
| ondblclick
|
ondrag
| ondragend
| ondragenter
| ondragleave
|
ondragover
| ondragstart
| ondrop
| ondurationchange
|
onended
| onerror
| onfocus
| onhashchange
|
onkeyup
| onload
| onloadeddata
| onloadedmetadata
|
onloadstart
| onmessage
| onmousedown | onmouseenter |
onmouseleave
| onmousemove
| onmouseout
| onmouseover |
onmouseup
| onmousewheel
| onoffline
| ononline |
onopen
| onpagehide
| onpageshow
| onpause |
onplay
| onplaying
| onpopstate
| onprogress |
onratechange
| onreset
| onresize
| onscroll |
onsearch
| onseeked
| onseeking
| onselect
|
onstalled
| onstorage
| onsubmit
| onsuspend |
ontimeupdate
| ontoggle
| ontransitionend
| onunload |
onvolumechange
| onwaiting
| onwheel
| paste |
show
| touchcancel
| touchend | touchmove
|
touchstart |
|
|
|
# HTML DOM Events ์ถ์ฒ: https://www.w3schools.com/jsref/dom_obj_event.asp
O ์ํ์ด ์ฝ๋ฉ(Secure Coding) ์์
# ASP โถ
.....
<%
If use_html Then // HTML tag๋ฅผ ์ฌ์ฉ
memo = Server.HTMLEncode(memo) //HTML tag๋ฅผ ๋ชจ๋ ์ ๊ฑฐ
// ํ์ฉํ HTML tag๋ง ๋ณ๊ฒฝํ๋ค
memo = replace(memo, "<p>", "<p>")
memo = replace(memo, "<P>", "<P>")
memo = replace(memo, "<br>", "<br>")
memo = replace(memo, "<BR>", "<BR>")
//HTML tag๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ ๊ฒฝ์ฐ
Else
memo = Server.HTMLEncode(memo) // HTML encoding
memo = replace(memo, "<", "<")
memo = replace(memo, ">", ">")
End If
Response.write "๊ฒ์๋ฌผ ๋ด์ฉ-" & memo & "<BR>"
.....
# JSP โถ
.....
<BODY>
<%
ย ย String user_agent = request.getHeader("USER-AGENT");
ย ย // HTTP HEADER ์ค USER_AGENT๋ฅผ ๋ณ๊ฒฝ ํ์ฌ ํฌ๋ก์ค์ฌ์ดํธ ์คํฌ๋ฆฝํธ ๊ณต๊ฒฉํ๋ ๊ฒ์ ์ฐจ๋จํ๋ค
// HTML tag๊ฐ ์์ ๊ฒฝ์ฐ ์ ๊ฑฐํ๋ค.
ย ย user_agent = user_agent.replaceAll("<","<");
user_agent = user_agent.replaceAll(">",">");
out.print("์ง๊ธ ์ฌ์ฉํ๊ณ ๊ณ์ ");
out.print(user_agent);
out.print(" ๋ธ๋ผ์ฐ์ ๋ก๋ ์ฌ์ดํธ ์ ์์ด ๋ถ๊ฐ๋ฅ ํฉ๋๋ค.");
%>
</BODY>
# XSS ๋ฐฉ์ง ๊ณตํต ๋ชจ๋ โถ
- XSSfilter.java
if(CONTENT != NULL){
CONTENT = CONTENT.replaceAll("<","<,");
CONTENT = CONTENT.replaceAll(">",">,");
CONTENT = CONTENT.replaceAll("&","&,");
CONTENT = CONTENT.replaceAll("\"","",");
}
else {
return;
}
.....
- Filter ์ธํฐํ์ด์ค ๊ตฌํ
public class FirstFilter implements javax.servlet.Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
ย public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);ย
}
public void destroy() {
ย ย }
}
- web.xml
<web-app>
ย ย <filter>
<filter-name>XSS</filter-name>
<filter-class>XSSFilter</filter-class>
ย ย ย ย <init-param>
ย ย <param-name>paramName</param-class>
<param-value>value<param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>XSS</filter-name>
<uri-pattern>/*</uri-patten>
</filter-mapping>
</web-app>
๐น๏ธ ๋ชจ์ํดํน ์ฒดํ ๋์
๐น๏ธ ๋ชจ์ํดํน ์ฒดํ ๋ฐ๋ผํ๊ธฐ โถ
STEP_1) ๊ฒ์ํ ๋ฌธ์์ด์ด ์ถ๋ ฅ ๋๋ ๊ฒ์ ํ์ธSTEP_2) ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์ฝ์ ํ์ฌ ๊ฒ์ ์ ํน์ ๋ฌธ์๊ฐ ํํฐ๋ง๋๋ ๊ฒ์ ํ์ธ
STEP_3) ํํฐ๋ง ๋๋ ๋ฌธ์์ด์ ์ฐํํ์ฌ ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ ์ฝ์ ํ ๊ฒ์
STEP_4) ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ด ์ ์์ ์ผ๋ก ์คํ๋์ด FLAG ๊ฐ์ ํ์ธ ํ ์ ์์
O ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ์ ๋ํ ํํฐ๋ง์ด ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์์ ๊ฒฝ์ฐ, ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ์ด ๊ฐ๋ฅํ ํผ(์น ๋ธ๋ผ์ฐ์ ์ฃผ์ ์ ๋ ฅ ๋๋ ๊ฒ์ํ ๋ฑ)์ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ์ฌ ์ฌ์ฉ์ ์ธ์ ๋์ฉ, ์ ์ฑ์ฝ๋๋ฅผ ์ ํฌํ ์ ์๋ ์ทจ์ฝ์
# XSS ๊ณต๊ฒฉ ๋ฐฉ์
- Reflected XSS
: ํ๋ผ๋ฏธํฐ ๊ฐ ๋ด ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ์ฌ ์ฌ์ฉ์์ ์์ฒญ๊ณผ ํจ๊ป ์ ์กํ๋ ๋ฐฉ์
: ์ ๋ฌ๋ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์๋ฒ์์ ๋์ ์ผ๋ก ์์ฑ๋๋ ์๋ต์ ๋ฐ์๋์ด ์คํ๋๋ ์ทจ์ฝ์
- Stored XSS
: ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์น ์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ์ผ ๋ฑ์ ์ ์ฅํ๋ ๋ฐฉ์
: ์ ์ฅ๋ ์ ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์ฌ์ฉ์์ ์์ฒญ์ ์ง์์ ์ผ๋ก ์คํ๋๋ ์ทจ์ฝ์
O ๊ทผ๊ฑฐ ์๋ฃ
โ ์ฃผ์์ ๋ณดํต์ ๊ธฐ๋ฐ์์ค ๊ธฐ์ ์ ์ทจ์ฝ์ ๋ถ์ ํ๊ฐ ์์ธ ๊ฐ์ด๋(p.681)
โ OWASP TOP10 2021
O ํ๋จ ๊ธฐ์ค
O ์ ๊ฒ ๋ฐฉ๋ฒ
- ๊ฒ์ํ ๋ฑ์ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ์ฌ ํด๋น ์คํฌ๋ฆฝํธ๊ฐ ํํฐ๋ง ๋๋์ง ํ์ธ
# ์์ ์คํฌ๋ฆฝํธ : <script>alert("xss")</script>, <IMG SRC=alert("XSS")>
O ์กฐ์น ๋ฐฉ๋ฒ
- ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ์์ ์ ๋ ฅ ๊ฐ๋ฅํ ๋ฌธ์ ์ ํํ๊ณ ๊ทธ ์ธ ๋ฌธ์ ํํฐ๋ง ์ ์ฉ
: ํํฐ๋ง ๋์ : GET ์ง์ ๋ฌธ์์ด, POST ๋ฐ์ดํฐ, ์ฟ ํค, URL ๋ฑ ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ๊ฐ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ
- ๊ฒ์ํ ๋ด HTML ํฌ๋งท์ ์ฌ์ฉํ ์ ์๋๋ก ์ค์
: HTML ํฌ๋งท์ด ํ์ํ ๊ฒฝ์ฐ ํ์ฉ๋ ํ๊ทธ๋ง ์ฌ์ฉํ๋๋ก ํ๊ณ , XSS์ ์ ์ฉ๋ ์์ง๊ฐ ์๋ ํ๊ทธ๋ ์๋ฒ ์ฌ์ด๋ ์คํฌ๋ฆฝํธ์์ ์ ๊ฑฐ ๋ฐ ํน์ ๋ฌธ์๋ก ์นํํ๋๋ก ์ค์
- JAVA, Springboot ๊ฐ๋ฐ ํ๊ฒฝ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ณด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฉ
: Spring Security, OWASP Java Encoder ๋ฑ ์ด์/๊ฐ๋ฐ ํ๊ฒฝ์ ์ ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋จ ํ ์ ์ฉ ์กฐ์น
# ํํฐ๋ง ๋์ ํน์๋ฌธ์ ์์ โถ
# ์์ ํํฐ๋ง ๋์ ๋ฌธ์์ด ์์ โถ
# ํํฐ๋ง ๋์ ์๋ฐ ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์์ โถ
# HTML DOM Events ์ถ์ฒ: https://www.w3schools.com/jsref/dom_obj_event.asp
O ์ํ์ด ์ฝ๋ฉ(Secure Coding) ์์
# ASP โถ
# JSP โถ
# XSS ๋ฐฉ์ง ๊ณตํต ๋ชจ๋ โถ
- XSSfilter.java
- Filter ์ธํฐํ์ด์ค ๊ตฌํ
- web.xml