ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Cross Site Scripting(XSS) 취약점을 고려하자
    in office 2019. 5. 14. 20:08
    반응형

    오늘 처리한 이슈는 사용자의 입력 내용과 출력 내용이 다른 부분에 관한 것이었다. 원인은 입력 내용을 text로 화면에 뿌리다 보니 개행문자가 무시되어서 한 줄로 표기 된 부분이다. 간단히 개행문자를 <br> 태그로 바꿔서 해결할 수가 있었다.

    <script>
    	
        ...
        // 수정 전
        $("#examText").text(" ... \n ... \n ...");
        
        // 수정 후
        $("#examText").html(" ... \n ... \n ...".replace(/\n/gi,"<br>"));
    
    	...
    </script>

    이렇게 코드를 바꾸면 문제없이 개행문자를 처리할 수 있다. 그런데 문제가 있다. 만약 사용자가 임의로 태그를 입력하게 된다면 어떻게 될까? 경우에 따라서는 페이지가 깨지거나 심각한 오류를 발생시키기도 할 것이다. 만약 스크립트를 삽입하게 된다면 이를통해 다른 사용자를 방해하거나 개인정보 등을 탈취하는 경우도 있을 수 있다.

     

    이렇게 악의적인 스크립트에 의해 페이지가 깨지거나 다른 사용자의 사용을 방해하거나 쿠키 혹은 다른 개인정보를 빼 가는 공격을 Cross Site Scripting(XSS)라고 한다. 개발자는 당연히 이런 공격을 미리 대비하고 있어야 한다.

     

    악성 스크립트를 서버에 저장시켜 클라이언트가 해당 페이지를 열람할 때 악성 스크립트를 실행시키는 Stored XSS(=Persistent XSS), 서버에 저장하지 않고 곧바로 클라이언트로 반환되는 Reflected XSS 취약점(=Non-Persistent XSS), DOM(Document Object Model)객체를 포함하는 자바스크립트 등을 이용하여 검증되지 않은 입력값을 삽입하게 하는 DOM XSS 등 XSS 를 이용한 공격은 다양한 형태가 있을 수 있다.

     

    그러나 대부분의 XSS가 태그를 통해 입력되어 실행 되는 것이 원인이기 때문에 해당 문자열을 다른 문자열로 변환하게 되면 비교적 간단하게 방어를 할 수 있다. 

     

    그러나 태그 이름 가령 예를 들어 '<script>' 와 같은 형식으로 필터링을 하게 되면 대소문자 변환 등을 이용해 쉽게 회피 가능하기 때문에 주의 해야 한다. 가장 보편적인 방법은 '<'를 '&lt;' 로 '>'를 '&gt;'로 변환하는 것이다.

    <script>
    
        ...
        $("#examText").html(" ... \n ... \n ..."
            .replace(/</gi,"&lt").replace(/>/gi,"&gt")
            .replace(/\n/gi,"<br>"));
        
        ...
    </script>

    웹 애플리케이션을 개발하게 되면 이런 코드가 계속해서 등장하게 되므로 해당하는 코드를 처리하는 함수나 객체를 만들어 두면 편리할 것이다. 

     

    물론 브라우저 마다 다르겠지만 요즘은 브라우저에서 이 공격을 일부분 막아주기도 한다고 한다. 그러나 웹 개발시에는 반드시 XSS에 대한 방어를 해야한다.

    반응형
Designed by Tistory.