웹취약성 크로스사이트 스크립트(XSS) 처리하기 :: 개발/일상_Mr.lee

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

Posted by Mr.mandu.
2017. 9. 7. 11:00 개발/web, html5,jsp

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

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

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

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


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


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