![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/rWZAB/btqAwJvDlrN/d3dfJBkdfijgh6q94KMgmk/img.png)
가. 원인 - 포멧스트링을 사용하는 함수에 입력값 검증없이 포멧문자열로 사용 - 포멧문자열과 파라미터 숫자가 일치하지 않을 경우 나. 영향 - 프로세스를 공격 - 메모리 데이터를 읽거나 쓰기 (%n) - 리턴주소를 조작하여 임의코드를 실행 다. 보안대책 - 외부입력값을 포멧스트링으로 사용하지 않고 포멧 문자열 생성에 포함제외 - 포멧스트링에 사용되는 인자와 매개변수의 갯수를 일치 - 포멧문자열을 사용하지 않는 함수를 사용 라. 안전한 코드 1. 입력값을 매개변수로 사용 public static void main( String[] args ) { ... Calendar validate = Calendar.getInstance(); ... // System.out.println("[%s] input comm..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/b80cvU/btqAt7ra2oi/0Mkf0hjstdzpYXAbHNHFDK/img.png)
가. 원인 - 버퍼 크기보다 큰 데이터를 버퍼에 기록할 경우 - 버퍼의 영역을 넘어 다른 메모리 영역에 침범할 경우 나. 영향 - 메모리 상 중요한 정보를 읽거나 시스템 충돌유도 - 리턴주소를 조작하여 임의의 코드를 실행하도록 조작 다. 보안대책 - 버퍼의 범위를 넘는 데이터를 접근하지 못하도록 버퍼 크기와 인덱스를 정확히 사용 - 문자열 저장 시 버퍼의 마지막에 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..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/cwYK0H/btqAt6FN2aC/yifEYKxkdGMxQ07tpuPrTK/img.png)
가. 원인 - 외부입력값의 신뢰를 전제하여 보호 메커니즘을 구현 나. 영향 - 보호 메커니즘을 우회하여 권한상승 - 허가되지 않은 기능 사용 다. 보안대책 - 상태정보, 민감데이터, 세션정보와 같은 중요정보는 서버에 저장 - 보안절차도 서버에서 수행 - 보안결정에 외부입력값 대신 내부 새션값을 사용 - 외부입력값을 사용해야 할 경우, 안전한 암호화 처리 및 무결성 체크 라. 안전한 코드 1. 외부입력값 미사용 int price = 1000; int quantity = Integer.parseInt( request.getParameter( "quantity" ) ); int total_price = price * quantity; ... 마. 진단방법 1. 인증여부를 확인하기 위한 변수를 확인 2. 변수가..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/qbs5V/btqAuMth7Pc/tbjVEeAbhpyUm9D50mmUmK/img.png)
가. 원인 - 정수형 입력값의 크기를 검증하지 않고 사용하는 경우 - 정수표현 범위보다 큰 값을 사용하여 음수로 사용될 경우 나. 영향 - 시스템 오류 발생 - 임의명령 실행 - 시스템 점령 등 다. 보안대책 - 언어 및 플랫폼에 따른 정수 타입의 범위를 확인 - 정수형 입력값을 연산에 사용할 경우, 연산결과의 범위를 체크 라. 안전한 코드 1. 정수범위 확인 int count = Integer.parseInt( request.getParameter("count") ); if (count < 0 ) return -1; String[] arrString = new String[ count ]; 마. 진단방법 1. 배열크기에 변수를 사용하여 동적생성하는지 확인 2. 변수가 외부입력값인지 확인 3. 해당 변수..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/ec6ubp/btqAuxpBeiD/aRoAEbw27nSlTRL3Y15LN1/img.png)
가. 원인 - 개행문자(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..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/zdyFQ/btqAwkW9Sm7/WKQ9TR8oaECOhAPgpgUPbK/img.png)
가. 원인 - 자동화된 코드를 통한 요청인지 실제 사용자의 정상적인 요청인지 확인하지 않고 요청을 처리 나. 영향 - 희생자의 권한으로 요청이 처리 - 관리자 또는 다른 사용자의 권한을 도용하여 중요기능을 실행 다. 보안대책 - 입력화면 폼 작성 시 POST방식을 사용 - CSRF토큰을 이용하여 URL 직접호출을 통한 시스템 사용을 방지 - 중요기능에 대해서 사용자 세션검증 및 재인증 라. 안전한 코드 1. CSRF토큰 이용 // 1. 입력화면을 요청받은 경우 String token = UUID.randomUUID().toString(); session.setAttribute("CSRF_TOKEN", token); // 2. 입력화면에서 Hidden 필드를 통해 전달받은 토큰을 전달 // 3. 요청 처리..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/AvIKn/btqAwjKKLFj/k03cnO6eLFVkqvp8DmhZ1k/img.png)
가. 원인 - 검증없이 외부입력값을 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..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/c1HWPd/btqAt6MwCFf/kOO8Ad9sFwRAE4stAVdDQ0/img.png)
가. 원인 - 외부입력값을 검증없이 XPath 쿼리문 생성에 사용된 경우 나. 영향 - 쿼리문의 의미 및 구조를 변경하여 임의의 쿼리를 실행 - 인가되지 않은 데이터를 열람 다. 보안대책 - 외부입력값에 특수문자( " [ ] / = @ 등 ) 및 쿼리 예약어를 필터링 - XPath대신 파라미터화된 쿼리문을 지원하는 XQuery 표현식을 사용 라. 안전한 코드 1. 입력값 필터링 String name = props.getProperty("name").replaceAll(" [ ', \\[ ] ", "" ); String pass = props.getProperty("pass").replaceAll(" [ ', \\[ ] ", "" ); String query = "//users/user[login/text..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/oNMLs/btqAt7dBCJo/SdAoXnMRF8xt3Duvpmu1xK/img.png)
가. 원인 - 외부입력값을 검증없이 XQuery 구문 생성 및 실행에 사용 나. 영향 - 쿼리문 조작을 통한 데이터 조회 및 인증우회 다. 보안대책 - XQuery에 사용되는 외부입력값에 특수문자 및 쿼리 예약어를 필터링 - 파라미터화된 쿼리문을 사용 라. 안전한 코드 1. 파라미터화된 쿼리문 사용 String name = props.getProperty("name"); String es = "doc('users.xml')/userlist/user[uname='$xname']"; XQPreparedExpression expr = conn.prepareExpression(es); expr.bindString( new QName("xname"), name, null); XQResultSequence resu..
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bQ53il/btqAvjEpFVz/c4JIRKJbthtcnNBpLg6VZ1/img.png)
가. 원인 - 외부 입력값을 검증하지 않고 외부 사이트로 자동연결 나. 영향 - 피싱사이트 연결 - 크로스 사이트 스크립트 공격 다. 보안대책 - 자동연결할 외부 사이트의 URL과 도메인을 화이트 리스트로 관리 및 사용 라. 안전한 코드 1. 화이트 리스트로 URL 검증 String allowedUrl[] = { "/main.do", "/login.jsp" }; int index = Integer.parseInt( request.getParameter("index") ); if ( index > -1 && index < allowedUrl.length ) { response.sendRedirect ( allowedUrl[ index] ); } 마. 진단방법 1. 외부 사이트로 리다이렉션 하는 함수나 메서..
- Total
- Today
- Yesterday