728x90
반응형
SMALL
SW개발보안가이드중 구현단계에서의 점검항목은 크게 7가지 이다. (입보시에코캡아)
1. 입력데이터 검증 및 표현
1-1. SQL삽입
1-2. 경로조작 및 자원삽입
1-3. 크로스 사이트 스크립트 (XSS)
1-4. 운영체제 명령어 삽입
1-5. 위험한 형식 파일 업로드
1-6. 신뢰하지 않은 URL주소로 자동 접속 연결
1-7. XQuery 삽입
1-8. XPath 삽입
1-9. LDAP삽입
1-10 크로스사이트 요청 위조 (CSRF)
1-11 HTTP 응답 분할
1-12 정수형 오버플로우
1-13 보안기능 결정에 사용되는 부적절한 입력값
1-14 메모리 버퍼 오버플로우
1-15 포맷 스트링 삽입
2. 보안기능
3. 시간 및 상태
4. 에러처리
5. 코드오류
6. 캡슐화
7. API 오용
이 장에서는 "1.입력데이터 검증 및 표현" 에 대한 점검항목을 설명한다. (두번째)
1-6. 신뢰하지 않은 URL주소로 자동 접속 연결
구분 | 설명 |
원인/영향 | 외부입력값을 외부사이트로 이동할 주소로 사용하는 경우 공격자는 입력값을 조작하여 피싱 사이트로 유도해서 XSS 공격을 할 수 있다. |
대응 | ① WhiteList - 자동 연결을 허용할 URL과 도메인을 목록으로 관리한다. |
취약) String rd = request.getParameter("rediect"); response.sendRedirect(rd); 안전) String allowURL[] = { "/main.do","/login.jsp","list.do" }; <- 허용할 도메인 WhiteList 정의 String rd = request.getParameter("rediect"); rd = allowURL[Integer.parseInt(rd)]; if (rd == 0) { response.sendRedirect(rd); ] |
1-7. XQuery 삽입
구분 | 설명 |
원인/영향 | 외부입력값을 검증없이 XQuery 쿼리문 생성에 이용할 경우 조작된 입력값에 의해 데이터를 무단조회 |
대응 | ① 필터링 - 외부입력값에 대해 특수문자 및 예약어를 필터링한다. ② 파라미터화된 쿼리문 - 정적쿼리로 쿼리문 구성 |
취약) String name = pros.getProperty("name"); String es = "doc('user.xml')/userlist/user[ name='" + name + "' ]"; 안전) String name = pros.getProperty("name"); String es = "doc('user.xml')/userlist/user[ name='$xname' ] "; expr = conn.prepareExpression(es); expr.bindString(new QName("xname") , name , null); expr.executeQuery)); |
1-8. XPath 삽입
구분 | 설명 |
원인/영향 | 외부입력값을 검증없이 XPath 쿼리문 생성에 이용할 경우 조작된 입력값에 의해 데이터를 무단조회 |
대응 | ① 필터링 - 외부입력값에 대해 특수문자 및 예약어를 필터링한다. ② 파라미터화된 쿼리문을 지원하는 XQuery 표현식을 사용한다 |
안전) public String XPathFilter (String input) { if (input != null) return input.replaceAll("[ ' , \\[ ]" , ""); <-- ' , [ 문자 치환 // 외부입력값에 대해 필터를 적용한다. String name = XPathFilter(props.getProperty("name")); expr = xpath.compile("//user/user[login/text()=' + name + "']/home_dir/text()"); ...... |
1-9. LDAP삽입
구분 | 설명 |
원인/영향 | 외부입력값을 LDAP필터문에 사용하는 경우 공격자는 입력값을 조작하여 정보를 유출하거나 조작 |
대응 | LDAP필터에 사용되는 외부입력값에는 특수문자가 포함되지 않도록 제거한다. |
1-10 크로스사이트 요청 위조 (CSRF)
구분 | 설명 |
원인/영향 | 공격자가 심어놓은 악성코드가 포함된 요청이 검증없이 서버로 전달될 때 희생자의 권한으로 악성코드가 실행되어 게시판자동글쓰기, 자동회원가입, 등의 공격이 수행될 수있다. |
대응 | ① POST방식 - 폼작성시 GET방식이 아닌 POST방식으로 사용 ② CSRF토큰 - 입력화면과 서버사이에 CSRF토큰을 통해 인증 ③ 추가/재인증 - 중요기능에 대해서는 추가적인 인증이나 재인증을 요청하는 방식 사용 |
1-11 HTTP 응답 분할
구분 | 설명 |
원인/영향 | HTTP요청시 쿠키및 헤더정보에 삽입한 외부입력값이 HTTP응답헤더에 포함되어 사용자에게 다시 전달될 때 개행문자을 이용하여 첫번째 응답을 종료시키고 두번째 응답에 악의적인 스크립트를 주입해서 XSS공격을 유발 (setHeader, addCookies…등으로 입력한 값은 나중에 응답페이지의 헤더에 포함되어 리턴된다) |
대응 | ① 개행문자 - 외부입력값을 응답헤더에 포함시킬 경우 개행문자(CRLF)포함시 제거한다. |
1-12 정수형 오버플로우
구분 | 설명 |
원인/영향 | 외부입력값을 정수형으로 사용시 정수값이 허용된 범위를 벗어나는 큰 수가 입력되면 실제 저장되는 값은 음수이거나 아주 큰 수가 되어 반복문제어, 메모리할당 등의 조건으로 사용시 시스템오류 발생 ,악성코드 실행등의 문제를 유발 |
대응 | ① 범위체크 - 입력값의 범위를 체크 |
1-13 보안기능 결정에 사용되는 부적절한 입력값
구분 | 설명 |
원인/영향 | 사용자가 전달하는 쿠키,환경변수,히든필드값을 조작하여 상승된 권한을 획득하거나 파라미터를 조작해서 금액 같은 중요값 변경가능 |
대응 | ① 중요정보는 서버에 저장하고 보안절차도 서버에서 실행한다. ② 보안결정에 사용되는 값은 외부입력값을 사용하지 않고 내부 세션값을 사용한다. |
취약) Cookie[] cookies = request.getCookies(); Cookie c = cookies[0]; if (c.getName().equals("role")) { userRole = c.getValue(); <-- 쿠키값을 가지고 바로 권한 할당 } 안전) HttpSessioni session = context.getSession(id); String userRole = (String)sesssion.getValue("role"); <-- 세션에 있는 정보로 권한 할당. |
1-14 메모리 버퍼 오버플로우
구분 | 대응 |
원인/영향 | 버퍼의 크기보다 큰 값을 버퍼에 저장할 때 버퍼의 경계를 넘어서 저장되면서 다른 메모리영역을 침범하여 리턴주소를 조작하여 임의의 악성코드가 실행되게 할 수 있다. |
대응 | ① 버퍼의 범위를 벗어나서 접근이 안되도록 할당된 버퍼의 크기내에서 데이터가 사용될수 있도록 한다. ② 문자열 저장을 위해 메모리 버퍼를 사용하는 경우 널(NULL)문자로 종료한다 |
1-15 포맷 스트링 삽입
구분 | 설명 |
원인/영향 | printf(), fprintf(), sprintf() 와 같은 포맷스트링 출력함수를 사용하는 경우 외부입력값을 조작을 통해 메모리내용을 읽거나 리턴주소를 조작하여 임의의 악성코드를 실행되게 할수 있다. |
대응 | ① 사용자의 입력값을 바로 포맷문자열로 바로 사용하거나 포맷스트링생성에 바로 사용하지 않는다. |
728x90
반응형
LIST
'정보보안' 카테고리의 다른 글
SW보안약점진단원 : 구현단계 - 보안기능 (2/2) (0) | 2019.11.25 |
---|---|
SW보안약점진단원 : 구현단계 - 보안기능 (1/2) (0) | 2019.11.24 |
SW보안약점진단원 : 구현단계 - 입력데이터 검증 및 표현 (1/2) (0) | 2019.11.22 |
SW 개발보안 가이드 : 분석/설계단계 - 에러처리 와 세션통제 (0) | 2019.11.21 |
SW보안약점진단원 : 분석/설계단계 - 보안기능 (0) | 2019.11.20 |