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

+ Recent posts