
가. 원인 - 인가 사용자만 접근해야 하는 기능에 올바른 접근권한 검증을 수행하지 않을 경우 나. 영향 - 권한없는 사용자에 의해 기능이 사용됨 - 권한없는 사용자에 의해 데이터가 유출 다. 보안대책 - 역할에 따라 제공되는 정보와 기능의 노출을 최소화 - 사용자 권한 별 ACL을 적용 - URL 조작을 통해 리소스에 직접 접근할 수 없도록 차단 - 파라미터 조작을 통한 직접 접근을 할 수 없도록 차단 라. 안전한 코드 1. 권한검증 public ModelAndView deleteUserInfo( ... ) { String userID = (String) session.getAttribute("LoginID"); ... // 로그인 사용자가 유저정보를 삭제할 권한이 있는지 확인 if ( checkUser..

가. 원인 - 적절한 인증과정 없이 중요정보를 열람 또는 변경처리 나. 영향 - 권한없는 사용자가 중요기능을 사용 - 권한없는 사용자가 중요정보를 변조 다. 보안대책 - 보안검사를 우회하여 서버에 접근할 수 없도록 설계 - 중요정보를 제공하는 페이지에 접근 시 재인증 수행 - 안전하다고 확인된 라이브러리나 프레임워크를 사용 라. 안전한 코드 1. 정보 소유자 검증 public ModelAndView modifyUserInfo( ... ) { String userID = (String) session.getAttribute("LoginID"); String requestID = request.getParameter("userID"); // 회원정보를 변경하려는 ID와 기능요청자의 ID가 동일한 사람인지 화..

가. 원인 - 포멧스트링을 사용하는 함수에 입력값 검증없이 포멧문자열로 사용 - 포멧문자열과 파라미터 숫자가 일치하지 않을 경우 나. 영향 - 프로세스를 공격 - 메모리 데이터를 읽거나 쓰기 (%n) - 리턴주소를 조작하여 임의코드를 실행 다. 보안대책 - 외부입력값을 포멧스트링으로 사용하지 않고 포멧 문자열 생성에 포함제외 - 포멧스트링에 사용되는 인자와 매개변수의 갯수를 일치 - 포멧문자열을 사용하지 않는 함수를 사용 라. 안전한 코드 1. 입력값을 매개변수로 사용 public static void main( String[] args ) { ... Calendar validate = Calendar.getInstance(); ... // System.out.println("[%s] input comm..

가. 원인 - 버퍼 크기보다 큰 데이터를 버퍼에 기록할 경우 - 버퍼의 영역을 넘어 다른 메모리 영역에 침범할 경우 나. 영향 - 메모리 상 중요한 정보를 읽거나 시스템 충돌유도 - 리턴주소를 조작하여 임의의 코드를 실행하도록 조작 다. 보안대책 - 버퍼의 범위를 넘는 데이터를 접근하지 못하도록 버퍼 크기와 인덱스를 정확히 사용 - 문자열 저장 시 버퍼의 마지막에 NULL로 종료 라. 안전한 코드 1. 버퍼 크기를 정확히 사용 typedef struct _charvoid { char data[16]; void *prev; void *next; } charvoid; public void main( char* args ) { charvoid cv_struct; ... int data_size = sizeof..

가. 원인 - 외부입력값의 신뢰를 전제하여 보호 메커니즘을 구현 나. 영향 - 보호 메커니즘을 우회하여 권한상승 - 허가되지 않은 기능 사용 다. 보안대책 - 상태정보, 민감데이터, 세션정보와 같은 중요정보는 서버에 저장 - 보안절차도 서버에서 수행 - 보안결정에 외부입력값 대신 내부 새션값을 사용 - 외부입력값을 사용해야 할 경우, 안전한 암호화 처리 및 무결성 체크 라. 안전한 코드 1. 외부입력값 미사용 int price = 1000; int quantity = Integer.parseInt( request.getParameter( "quantity" ) ); int total_price = price * quantity; ... 마. 진단방법 1. 인증여부를 확인하기 위한 변수를 확인 2. 변수가..

가. 원인 - 정수형 입력값의 크기를 검증하지 않고 사용하는 경우 - 정수표현 범위보다 큰 값을 사용하여 음수로 사용될 경우 나. 영향 - 시스템 오류 발생 - 임의명령 실행 - 시스템 점령 등 다. 보안대책 - 언어 및 플랫폼에 따른 정수 타입의 범위를 확인 - 정수형 입력값을 연산에 사용할 경우, 연산결과의 범위를 체크 라. 안전한 코드 1. 정수범위 확인 int count = Integer.parseInt( request.getParameter("count") ); if (count < 0 ) return -1; String[] arrString = new String[ count ]; 마. 진단방법 1. 배열크기에 변수를 사용하여 동적생성하는지 확인 2. 변수가 외부입력값인지 확인 3. 해당 변수..

가. 원인 - 개행문자(CR/LF)가 포함된 외부입력값을 응답헤더에 사용할 경우 나. 영향 - 두 번째 응답에 악성코드를 주입하여, XSS 공격 및 캐시훼손 공격 다. 보안대책 - HTTP 응답헤더에 사용하는 외부입력값에 개행문자를 제거 후 사용 라. 안전한 코드 1. 개행문자 삭제 // Set-Cookie에 입력값 저장 String lastLogin = request.getParaeter("last_login"); lastLogin = lastLogin.replaceAll("[\\r\\n]", ""); Cookie c = new Cookie("LASTLOGIN", lastLogin); response.addCookie( c ); // Location에 입력값 저장 String nextURL = requ..

가. 원인 - 자동화된 코드를 통한 요청인지 실제 사용자의 정상적인 요청인지 확인하지 않고 요청을 처리 나. 영향 - 희생자의 권한으로 요청이 처리 - 관리자 또는 다른 사용자의 권한을 도용하여 중요기능을 실행 다. 보안대책 - 입력화면 폼 작성 시 POST방식을 사용 - CSRF토큰을 이용하여 URL 직접호출을 통한 시스템 사용을 방지 - 중요기능에 대해서 사용자 세션검증 및 재인증 라. 안전한 코드 1. CSRF토큰 이용 // 1. 입력화면을 요청받은 경우 String token = UUID.randomUUID().toString(); session.setAttribute("CSRF_TOKEN", token); // 2. 입력화면에서 Hidden 필드를 통해 전달받은 토큰을 전달 // 3. 요청 처리..

가. 원인 - 검증없이 외부입력값을 LDAP 필터문에 사용하여 LDAP 명령구문을 변조 나. 영향 - LDAP 필터문을 조작하여 정보유출 및 정보조작 다. 보안대책 - 사용자입력값에 특수문자( = + # ; \ 등 ) 필터링 - 특수문자가 일반문자로 인식되도록 처리 (이스케이프) 라. 안전한 코드 1. 화이트 리스트로 URL 검증 String userSN = request.getParameter("usersn"); String userPass = request.getParameter("pass"); ... if ( !userSN.matches("[\\w\\s]*") || !userPass.matches("[\\w]*") ) { return; } String filter = "(&(sn=" + us..

가. 원인 - 외부입력값을 검증없이 XPath 쿼리문 생성에 사용된 경우 나. 영향 - 쿼리문의 의미 및 구조를 변경하여 임의의 쿼리를 실행 - 인가되지 않은 데이터를 열람 다. 보안대책 - 외부입력값에 특수문자( " [ ] / = @ 등 ) 및 쿼리 예약어를 필터링 - XPath대신 파라미터화된 쿼리문을 지원하는 XQuery 표현식을 사용 라. 안전한 코드 1. 입력값 필터링 String name = props.getProperty("name").replaceAll(" [ ', \\[ ] ", "" ); String pass = props.getProperty("pass").replaceAll(" [ ', \\[ ] ", "" ); String query = "//users/user[login/text..
- Total
- Today
- Yesterday