user 02-19
보안취약점 조치
@a526ad07e126b30d81fbef0ab57109e577ccd426
pom.xml
--- pom.xml
+++ pom.xml
@@ -24,7 +24,7 @@
 	<repositories>
 		<repository>
 			<id>mvn2</id>
-			<url>http://repo1.maven.org/maven2/</url>
+			<url>https://repo1.maven.org/maven2/</url>
 			<releases>
 				<enabled>true</enabled>
 			</releases>
@@ -34,7 +34,7 @@
 		</repository>
 		<repository>
 			<id>egovframe</id>
-			<url>http://www.egovframe.go.kr/maven/</url>
+			<url>https://maven.egovframe.go.kr/maven/</url>
 			<releases>
 				<enabled>true</enabled>
 			</releases>
 
src/main/java/egovframework/com/cmm/InterceptorHandler.java (added)
+++ src/main/java/egovframework/com/cmm/InterceptorHandler.java
@@ -0,0 +1,101 @@
+package egovframework.com.cmm;
+
+import java.util.Enumeration;
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import egovframework.com.cmm.util.EgovXSSUtil;
+
+
+public class InterceptorHandler extends HandlerInterceptorAdapter{
+
+	private static final Pattern SQL_PATTERN = Pattern.compile(
+        "(?i)(select|insert|delete|update|create|drop|alter|where|substr|substring|group by|union|xp_cmdshell|and|or|having|from|unio|case|when|if|--|;|/\\*|\\*/|\\bor\\b|\\band\\b)"
+    );
+	 
+	@Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		
+    	/**
+    	 * URL 호출 전 넘어오는 파라미터 체크
+    	 * request로 넘어오는 모든 파라미터 데이터를 검사하여 XSS 문자가 포함되어 있으면 메인화면으로 튕김
+    	 * */
+    	boolean returnSts1 = true;
+    	Enumeration e = request.getParameterNames();
+		while ( e.hasMoreElements() ){
+			String name = (String) e.nextElement();
+			
+			{ //XSS 보안조치
+				if(name.toLowerCase().contains("cmplntreqcn")
+						|| name.toLowerCase().contains("autcn")
+						|| name.toLowerCase().contains("file_0")
+						|| name.toLowerCase().contains("file_1")
+						|| name.toLowerCase().contains("seccn")
+						|| name.toLowerCase().contains("nttcn")
+				) {	
+					String[] values = request.getParameterValues(name);
+					for (String value : values) {
+						
+						boolean returnSts = EgovXSSUtil.cleanXSS(value);
+						if(!returnSts) {//XSS 문자 체크 결과 false일 경우 메인화면으로 이동
+							returnSts1 = returnSts;
+							System.out.println("+++++++++++++++++++++++++++XSS 필터 처리 Filter::: ");
+							System.out.println("name="+ name + ", value="+ value);
+							System.out.println("+++++++++++++++++++++++++++XSS 필터 처리 Filter End::: ");
+							response.sendRedirect(request.getContextPath() + "/");
+						}
+					}
+				}
+			}
+
+			{ //SQL Injection 보안조치
+				if(name.toLowerCase().contains("searchsortcnd")
+						|| name.toLowerCase().contains("searchsortord")
+				) {	
+					
+					//파라미터 중에 URL 주소를 넘겨주는 부분이 있어서 해당 부분에것 select~, update~, delete~ 로 시작하는 주소경로가 있어서 제외처리를 하였음
+					String[] values = request.getParameterValues(name);
+					
+					for (String value : values) {
+						 if (value != null && SQL_PATTERN.matcher(value.toLowerCase()).find()) {
+							System.out.println("+++++++++++++++++++++++++++XSS Html 필터 처리 Filter Start::: ");
+							System.out.println("name="+ name + ", value="+ value);
+							System.out.println("+++++++++++++++++++++++++++XSS Html 필터 처리 Filter End::: ");
+							response.sendRedirect(request.getContextPath() + "/");
+			            }
+					}
+				}
+			}
+		}
+		
+		if(!returnSts1) {//XSS 포함문자가 있는경우 메인화면으로 이동시킨다.
+			response.sendRedirect(request.getContextPath() + "/");
+			return true;
+		}
+    	
+        return true;
+    }
+    
+	/*
+	 * view 화면으로 데이터가 넘어가기 이전에 실행
+	 * modelAndView 값을 체크할 수 있음
+	 * */
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+        super.postHandle(request, response, handler, modelAndView);
+    }
+    
+    /*
+     * 
+     * view에서 모든 처리를 완료한 후에 실행
+     * */
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        super.afterCompletion(request, response, handler, ex);
+    }
+}
src/main/java/egovframework/com/cmm/util/EgovXSSUtil.java
--- src/main/java/egovframework/com/cmm/util/EgovXSSUtil.java
+++ src/main/java/egovframework/com/cmm/util/EgovXSSUtil.java
@@ -2,6 +2,71 @@
 
 public class EgovXSSUtil {
 	
+	public static boolean cleanXSS(String str) {
+		
+		String str_low= str.toLowerCase();
+		boolean returnSts = true;
+		if(
+		str_low.contains("javascript")
+		||str_low.contains("eval")
+		||str_low.contains("title")
+		||str_low.contains("onload")
+		||str_low.contains("onmousewheel")
+		||str_low.contains("onactive")
+		||str_low.contains("expression")
+		||str_low.contains("charset")
+		||str_low.contains("ondataavailable")
+		||str_low.contains("oncut")
+		||str_low.contains("applet")
+		||str_low.contains("document")
+		||str_low.contains("onafteripudate")
+		||str_low.contains("onclick")
+		||str_low.contains("meta")
+		||str_low.contains("string")
+		||str_low.contains("onmousedown")
+		||str_low.contains("onchange")
+		||str_low.contains("xml")
+		||str_low.contains("create")
+		||str_low.contains("onbeforeactivate")
+		||str_low.contains("onbeforecut")
+		||str_low.contains("blink")
+		||str_low.contains("append")
+		||str_low.contains("onbeforecopy")
+		||str_low.contains("ondbclick")
+		||str_low.contains("link")
+		||str_low.contains("binding")
+		||str_low.contains("onbeforedeactivate")
+		||str_low.contains("ondeactivate")
+		||str_low.contains("style")
+		||str_low.contains("alert")
+		||str_low.contains("prompt")
+		||str_low.contains("comfire")
+		||str_low.contains("ondrag")
+		||str_low.contains("script")
+		||str_low.contains("msgbox")
+		||str_low.contains("cnbeforeprint")
+		||str_low.contains("embed")
+		||str_low.contains("refresh")
+		||str_low.contains("cnbeforepaste")
+		||str_low.contains("object")
+		||str_low.contains("void")
+		||str_low.contains("iframe")
+		||str_low.contains("cookie")
+		||str_low.contains("ondatasetchaged")
+		||str_low.contains("ondragend")
+		||str_low.contains("ondragenter")
+		||str_low.contains("ondragleave")
+		||str_low.contains("onbeforeeditfocus")
+		||str_low.contains("onbeforeuload") 
+		||str_low.contains("ondragover")
+		||str_low.contains("onerror")
+		)
+		{
+			returnSts = false;
+		}
+		return returnSts;
+	}
+	
 	public String unscript(String data) {
 		if (data == null || data.trim().equals("")) {
 			return "";
 
src/main/java/egovframework/com/cmm/util/FileExtCheckUtil.java (added)
+++ src/main/java/egovframework/com/cmm/util/FileExtCheckUtil.java
@@ -0,0 +1,18 @@
+package egovframework.com.cmm.util;
+
+public class FileExtCheckUtil {
+	
+	public static boolean fileExtCheck(String fileExt) {
+		final String[] PERMISSION_FILE_EXT_ARR = {"ZIP", "GIF", "JPEG", "JPG", "PNG", "BMP", "PDF", "HWP", "XLSX", "DOCX", "PPTX"};
+		boolean isPermissionFileExt = false;
+		fileExt = fileExt.toUpperCase();
+		for( int i = 0; i < PERMISSION_FILE_EXT_ARR.length; i++ ) {
+			System.out.println(fileExt + "  :  "+PERMISSION_FILE_EXT_ARR[i]);
+			if( PERMISSION_FILE_EXT_ARR[i].equals(fileExt) ) {
+				isPermissionFileExt = true;
+				break;
+			}
+		}
+		return isPermissionFileExt;
+	}
+}
src/main/java/egovframework/let/itsm/edu/web/EduManageController.java
--- src/main/java/egovframework/let/itsm/edu/web/EduManageController.java
+++ src/main/java/egovframework/let/itsm/edu/web/EduManageController.java
@@ -24,6 +24,8 @@
 import egovframework.com.cmm.service.EgovFileMngService;
 import egovframework.com.cmm.service.EgovFileMngUtil;
 import egovframework.com.cmm.service.FileVO;
+import egovframework.com.cmm.util.FileExtCheckUtil;
+import egovframework.com.cmm.util.RedirectUrlMaker;
 import egovframework.let.cop.bbs.service.BoardVO;
 import egovframework.let.itsm.audit.service.AuditItemVO;
 import egovframework.let.itsm.audit.service.AuditVO;
@@ -772,7 +774,6 @@
 			final MultipartHttpServletRequest multiRequest,
     		ModelMap model) throws Exception {
 		
-   		
 		ModelAndView modelAndView = new ModelAndView();
     	modelAndView.setViewName("jsonView");
     	Boolean isAuthenticated = EgovUserDetailsHelper.isAuthenticated();
@@ -789,6 +790,13 @@
     			result = fileUtil.parseFileInf(files, "AUDIT_", 0, "", "", "");
 				if(result.size() != 0) {
 					for(FileVO tempFile : result) {
+						String extension = tempFile.orignlFileNm.substring(tempFile.orignlFileNm.lastIndexOf(".")+1);
+						 
+						if(!FileExtCheckUtil.fileExtCheck(extension)) {
+			        	    	modelAndView.addObject("result", "extension");
+			        	    	return modelAndView;
+						 }
+						 
 						tempFile.setRefId(eduVO.getAutId());
 					}
 				}
src/main/java/egovframework/let/uss/umt/web/EgovUserManageController.java
--- src/main/java/egovframework/let/uss/umt/web/EgovUserManageController.java
+++ src/main/java/egovframework/let/uss/umt/web/EgovUserManageController.java
@@ -314,8 +314,22 @@
         	return "uat/uia/EgovLoginUsr";
     	}*/
 		
+		List<String> authorities = EgovUserDetailsHelper.getAuthorities();
+		boolean  adminYN = false;
+		for (String authority : authorities) {
+			if (authority.equals("ROLE_ADMIN")) {
+				 adminYN = true;
+			}
+		}
+		
 		LoginVO sessionLogin = (LoginVO) EgovUserDetailsHelper.getAuthenticatedUser();
 		String uniqId = "".equals(userSearchVO.getSelectedId()) ? sessionLogin.getUniqId() : userSearchVO.getSelectedId() ;
+
+		if(!adminYN) {
+			if(!sessionLogin.getUniqId().equals(uniqId)) {
+				return "redirect:/";
+			}
+		}
 		
 		ComDefaultCodeVO vo = new ComDefaultCodeVO();
 
src/main/resources/egovframework/spring/com/context-security.xml
--- src/main/resources/egovframework/spring/com/context-security.xml
+++ src/main/resources/egovframework/spring/com/context-security.xml
@@ -6,6 +6,8 @@
         http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd
 		http://www.egovframe.go.kr/schema/egov-security http://www.egovframe.go.kr/schema/egov-security/egov-security-3.7.xsd">
 
+
+<security:http pattern="/direct/**" security="none"/>
     <security:http pattern="/css/**" security="none"/>
 	<security:http pattern="/html/**" security="none"/>
     <security:http pattern="/images/**" security="none"/>
 
src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-interceptor-servlet.xml (added)
+++ src/main/webapp/WEB-INF/config/egovframework/springmvc/egov-interceptor-servlet.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/mvc"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:beans="http://www.springframework.org/schema/beans"
+    xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
+        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+    
+	<interceptors>
+	    <interceptor>
+	        <mapping path="/uss/**"/>
+	        <mapping path="/cop/**"/>
+	        <beans:bean class="egovframework.com.cmm.InterceptorHandler"/>
+	    </interceptor>
+	</interceptors>
+</beans:beans>(No newline at end of file)
src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovUserManage.jsp
--- src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovUserManage.jsp
+++ src/main/webapp/WEB-INF/jsp/cmm/uss/umt/EgovUserManage.jsp
@@ -138,6 +138,11 @@
     document.peristalsisForm.submit();
 }
 
+function fnPeristalsis() {
+    document.peristalsisForm.action = "<c:url value='/let/itsm/sync/syncOrgchtRefresh.do'/>";
+    document.peristalsisForm.submit();
+}
+
 
 function linkPage(pageNo){
 	var searchForm = document.searchForm ;
 
src/main/webapp/WEB-INF/jsp/uat/uia/EgovLoginUsr2.jsp (added)
+++ src/main/webapp/WEB-INF/jsp/uat/uia/EgovLoginUsr2.jsp
@@ -0,0 +1,38 @@
+<%--
+  Class Name : EgovLoginUsr.jsp
+  Description : 로그인화면
+  Modification Information
+ 
+      수정일         수정자                   수정내용
+    -------    --------    ---------------------------
+     2009.03.10    박지욱             최초 생성
+     2011.08.31   JJY       경량환경 버전 생성
+ 
+    author   : 공통서비스 개발팀  박지욱
+    since    : 2009.03.10
+--%>
+<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
+<!DOCTYPE html>
+<html lang="ko">
+<head>
+<meta http-equiv="Content-Language" content="ko" >
+<meta http-equiv="X-UA-Compatible" content="IE=edge" />
+<script src="<c:url value='/js/jquery-1.12.4.min.js' />"></script>
+<title>로그인</title>
+<!-- <link href="/css/post.css?ver=1" rel="stylesheet" > -->
+<script type="text/javascript">
+$( document ).ready(function(){
+
+	alert("세션이 만료 되었습니다. 재로그인해주세요");
+	 window.close(); 
+});
+</script>
+</head>
+<body>
+</body>
+</html>(No newline at end of file)
src/main/webapp/WEB-INF/jsp/uss/itsm/edu/ConfFileUpload.jsp
--- src/main/webapp/WEB-INF/jsp/uss/itsm/edu/ConfFileUpload.jsp
+++ src/main/webapp/WEB-INF/jsp/uss/itsm/edu/ConfFileUpload.jsp
@@ -160,6 +160,8 @@
             success: function(returnData , status){
                 if(returnData.result == 'auth_fail'){
                 	alert("세션이 종료되었습니다.");
+                }else if(returnData.result == 'extension'){
+                	alert("첨부파일 확장자 확인 부탁드립니다.");
                 }else if(returnData.result == 'success'){
         			 $('.upload_box_img').hide();  //list 박스 형식 변경
 			         $('.upload_box_text').hide();
src/main/webapp/WEB-INF/jsp/uss/itsm/edu/eduPlanView.jsp
--- src/main/webapp/WEB-INF/jsp/uss/itsm/edu/eduPlanView.jsp
+++ src/main/webapp/WEB-INF/jsp/uss/itsm/edu/eduPlanView.jsp
@@ -29,7 +29,6 @@
     <script src="/direct/js/popup_open_2.js"></script>
     <script type="text/javascript" src="<c:url value='/js/EgovMultiFile.js'/>"></script>
     <script type="text/javascript" src="/js/audit/audit.common.js"></script>  
-	<%@ taglib prefix="ckeditor" uri="http://ckeditor.com"%> 
 	  
     <script type="text/javaScript" language="javascript">
     
@@ -295,6 +294,8 @@
             success: function(returnData , status){
                 if(returnData.result == 'auth_fail'){
                 	alert("세션이 종료되었습니다.");
+                }else if(returnData.result == 'extension'){
+                	alert("첨부파일 확장자 확인 부탁드립니다.");
                 }else if(returnData.result == 'success'){
         			 $('.upload_box_img').hide();  //list 박스 형식 변경
 			         $('.upload_box_text').hide();
Add a comment
List