개발/web, html5,jsp

웹취약성 크로스사이트 스크립트(XSS) 처리하기

Mr.Lee 하루 2017. 9. 7. 11:00

프로젝트를 진행하다가 웹취약성에 걸렸습니다.

에러페이지 떨어지는 곳이 없다, 톰캣 매니저 페이지 접근이 가능하다 등등....

그중에서도 이번에 포스팅할 내용은

웹취약성! 크로스사이트 스크립트 처리 입니다.


그렇다면 웹취약성 크로스사이트 스크립트! 확인방법은!!!


웹취약성 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>으로 묶었습니다.