-
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>' 와 같은 형식으로 필터링을 하게 되면 대소문자 변환 등을 이용해 쉽게 회피 가능하기 때문에 주의 해야 한다. 가장 보편적인 방법은 '<'를 '<' 로 '>'를 '>'로 변환하는 것이다.
<script> ... $("#examText").html(" ... \n ... \n ..." .replace(/</gi,"<").replace(/>/gi,">") .replace(/\n/gi,"<br>")); ... </script>
웹 애플리케이션을 개발하게 되면 이런 코드가 계속해서 등장하게 되므로 해당하는 코드를 처리하는 함수나 객체를 만들어 두면 편리할 것이다.
물론 브라우저 마다 다르겠지만 요즘은 브라우저에서 이 공격을 일부분 막아주기도 한다고 한다. 그러나 웹 개발시에는 반드시 XSS에 대한 방어를 해야한다.
반응형'in office' 카테고리의 다른 글
Several ports required by Tomcat Server at localhost are already in use. (0) 2019.05.23 꼭 클라이언트/서버 양측에서 유효성 검사를 하자 (0) 2019.05.14 이클립스에서 서버 timeout 시간 늘이는 법 (0) 2019.05.07 DOM에 dependent하게 프로그램 하지 말자 (0) 2019.05.03 SQL로 중복된 값이 있는지 찾기?(COUNT, GROUP BY 사용) (0) 2019.04.26