프로젝트를 진행하다가 웹취약성에 걸렸습니다.
에러페이지 떨어지는 곳이 없다, 톰캣 매니저 페이지 접근이 가능하다 등등....
그중에서도 이번에 포스팅할 내용은
웹취약성! 크로스사이트 스크립트 처리 입니다.
그렇다면 웹취약성 크로스사이트 스크립트! 확인방법은!!!
웹취약성 TEST
<script>alert("XSS");</script>
이런식으로 게시판에 등록하여 조회 하게되면 alert창이 뜨게 됩니다.
취약점 내용
웹 애플리케이션을 사용해서 다른 최종 사용자의 클라이언트에서 임의의 스크립트가 실행되는 취약점 입니다.
크로스사이트스크립팅(XSS) 취약점은 웹 페이지가 사용자에게 입력 받은 데이터를 필터링하지 않고 그대로 동적으로 생성된 웹 페이지에 포함되어 사용자에게 재전송 할 때 발생합니다.
자바스크립트처럼 클라이언트 측에서 실행되는 언어로 작성된 악성 스크립트 코드를 웹 페이지, 웹 게시판 or 이메일에 포함시켜 사용자에게 전달하면, 해당 웹 페이지나 이메일을 사용자가 클릭하거나 읽을 경우 악성 스크립트 코드가 웹 브라우저에서 실행이 됩니다.
이와같은 공격자는 XSS 취약점이 존재하는 웹 사이트를 이용하여 자신이 만든 악의적인 스크립트를 일반 사용자의 컴퓨터에 전달하여 실행시킬 수 있습니다. 이에 따라 사용자 쿠키를 훔쳐서 해당 사용자권한으로 로그인하거나 브라우저는 제어할 수 있습니다.
보안 대책
헤더, 쿠키, 질의 문, 폼 필드와 숨겨진 필드 등과 같은 모든 파마미터들을 악의적인 스크립트가 실행되지 않도록 필터링 해야 합니다.
필터링 문자 : < > ( ) # & ' "
필터링 문자열 : script, javascript, vbscript, cookie, location, 등등
제가 처리한 필터링 코드 입니다.
public String filterStr(String str){ if(str.indexOf("<script>")!=-1){ str = str.replaceAll("<script>", ""); } if(str.indexOf("</script>")!=-1){ str = str.replaceAll("</script>", ""); } if(str.indexOf("<javascript>")!=-1){ str = str.replaceAll("<javascript>", ""); } if(str.indexOf("</javascript>")!=-1){ str = str.replaceAll("</javascript>", ""); } if(str.indexOf("<vbscript>")!=-1){ str = str.replaceAll("<vbscript>", ""); } if(str.indexOf("</vbscript>")!=-1){ str = str.replaceAll("</vbscript>", ""); } return str; }
저는 태그위주로 빈값으로 치환하여 처리 하였습니다.
[소스 수정]
public static String strFilter(String str){ StringBuffer sb = null; String[] checkStr_arr = { "", ""," ", ""," ", "onerror" }; for(String checkStr : checkStr_arr){ while(str.indexOf(checkStr)!=-1){ str = str.replaceAll(checkStr, ""); } while(str.toLowerCase().indexOf(checkStr)!=-1){ sb = new StringBuffer(str); sb = sb.replace(str.toLowerCase().indexOf(checkStr),str.toLowerCase().indexOf(checkStr)+ checkStr.length(), ""); str = sb.toString(); } } return str; }
초기 소스는 for문을 써서 처리했지만 각 문자열당 한번씩 돌기때문에
while 문으로 변경하였습니다.
scr script ipt <- 이런식으로 문자안에 치환후 다시 문자가 이어질때 버그가 있어 수정.
또 다른 방법!!!! jsp 에서 처리하기!
"word-wrap:break-word" 속성을 주고 변수 값을 <c:out>으로 묶었습니다.
'개발 > web, html5,jsp' 카테고리의 다른 글
서블릿과 JSP 의 기초 개념 (0) | 2018.10.21 |
---|---|
[jsp] a 태그를 이용한 다운로드 기능 (0) | 2018.02.12 |
[기초 잊지말자]테이블 border 두줄, 두겹 나오는 현상 (0) | 2018.02.05 |
[html5]웹 fieldset, legend, input 태그 속성 (placeholder 등) (0) | 2016.04.15 |
html tag 정리 mark, progress, meter, details (0) | 2016.04.12 |
서블릿 동작 원리 이해 및 공부, 서블릿의 라이프 사이클 (0) | 2016.04.06 |
쿠키와 세션 설명 및 이해 (0) | 2016.04.04 |