본문 바로가기
반응형

전체 글135

SQL 삽입공격 : mybatis Data Map - 외부에서 입력된 값이 질의어의 인자값으로만 사용되지 않고, 질의 명령어에 연결되는 문자열로 사용되면, 공격자가 의도하지 않았던 문자열을 전달할 수 있다. - 문자열 삽입 인자($...$) 를 사용하지 않고 ## 형태의 질의문을 사용한다. DELETE STUDENTS WHERE NUM = #num# AND Name = '$name$' ▼ DELETE STUDENTS WHERE NUM = #num# AND Name = '#name#' 2022. 11. 18.
보호 메커니즘을 우회할 수 있는 입력값 변조 - 인증이나 인가와 같은 보안결정이 입력값(쿠키, 환경변수, 히든필드 등)에 기반으로 수행되는 경우 공격자는 이런 입력값을 조작하여 응용프로그램의 보안을 우회할 수 있다. - 상태정보나 민감한 데이터 (사용자 세션정보 등)는 서버에 저장하고 보안확인 절차도 서버에서 실행한다. 안전하지 않은 코드 ▼ 사용자의 role을 설정할 때 사용자 웹브라우저의 쿠키의 role에 할당된 값을 사용하고 있는데, 사용자에 의해 변경되는 경우 role값이 의도하지 않은 값으로 할당될 수 있다. Cookie[] cookies = request.getCookies(); for (int i=0; i 2022. 11. 18.
정수 오버플로우 - 정수형 변수의 오버플로우는 정수값이 증가하면서, Java에서 허용된 가장 큰 값보다 더 커져서 실제 저장되는 값은 의도하지 않게 아주 작은 수이거나 음수가 될 수 있다. - 특히 반목문 제어, 메모리 할당, 메모리 복사 등을 위한 조건에서 발생하면 보안상 문제를 유발할 수 있다. - 언어/플래폼 별 정수타입의 범위를 확인하여 사용한다. ex) 1. 배열의 크기 값이 음수값이 아닌지 검사한다. if (size Integer.MAX_VALUE / DATA_SIZE)){ return; } 2022. 11. 17.
HTTP 응답 분할 - HTTP 요청에 들어 있는 인자값이 HTTP 응답헤더에 포함되어 사용자에게 다시 전달 될 때 입력값에 CR(Carriage Return)이나 LF(Line Feed)와 같은 개행문자가 존재하면 HTTP응답이 2개 이상으로 분리될 수 있다. - 이 경우 공격자는 개행문자를 이용하여 첫 번째 응답을 종료시키고 두 번째 응답에 악의적인 코드를 주입하여 XSS 및 캐시 훼손(cache poisoning) 공격 등을 수행할 수 있다. CR = \r LF = \n - 외부에서 입력된 인자값을 사용하여 HTTP 응답헤더(Set Cookie 등)에 포함시킬 경우 CR, LF등을 제거하거나 적절한 인코딩 기법을 사용하여 변환한다. 안전하지 않은 코드 ▼ throws IOException, ServletExceptio.. 2022. 11. 16.
절대 디렉터리 경로 조작 - 외부 입력이 파일 시스템을 조작하는 경로를 직접 제어할 수 있거나 영향을 끼치면 위험하다. - 외부의 입력을 통해 파일의 생성 및 접근을 허용하지 말고, 외부 입력에 따라 접근이 허용된 파일의 리스트에서 선택하도록 프로그램을 작성하는 것이 바람직하다. 안전하지 않은 코드 ▼ import java.io.*; import java.net.URLDecoder; import java.sql.*; import java.util.*; import javax.servlet.*; public class DocumentService extends HttpServlet { private final String APPLY_STYLE_COMMAND = "apply_style"; private final String USE.. 2022. 11. 16.
상대 디렉터리 경로 조작 - 외부 입력을 통하여 디렉터리 경로 문자열 생성이 필요한 경우, 외부 입력값에 대해 경로 조작에 사용될 수 있는 문자를 필터링하지 않으면, 예상 밖의 접근 제한 영역에 대한 경로 문자열 구성이 가능해져 시스템 정보누출, 서비스 장애 등을 유발 시킬 수 있다. - 즉, 경로 조작을 통해서 공격자가 허용되지 않은 권한을 획득하여, 설정에 관계된 파일을 변경할 수 있거나 실행시킬 수 있다. - 외부의 입력이 직접 파일이름을 생성할 수 없도록 한다. 불가피하게 직접 사용하는 경우, 다른 디렉터리의 파일을 접근할 수 없도록 replaceAll() 등의 메소드를 사용하여 위험 문자열(",/,\)을 제거하는 필터를 거치도록 한다. - 외부에서 받아들인 데이터 중 미리 정의된 케이스를 제외하고는 모두 무시하도록 한다.. 2022. 11. 16.
크로스사이트 요청 위조 - 특정 웹사이트에 대해서 사용자가 인지하지 못한 상황에서 사용자의 의도와는 무관하게 공격자가 의도한 행위를 요청하게 하는 공격 - 공격자는 사용자가 인증한 세션이 특정 동작을 수행하여도 계속 유지되어 정상적인 요청과 비정상적인 요청을 구분하지 못하는 점을 악용하여 피해가 발생한다. - GET방식으로 전달된다면 공격자가 이를 쉽게 알아내어 원하는 요청을 보냄으로써 위험한 작업을 요청할 수 있게 된다. - 입력화면 폼 작성 시 GET방식 보다는 POST방식을 사용하고 입력화면 폼과 해당 입력을 처리하는 프로그램 사이에 토큰을 사용하여, 공격자의 직접적인 URL 사용이 동작하지 않도록 처리한다. - GET방식은 단순히 FORM데이터를 URL 뒤에 덧붙여서 전송하기 때문에 GET방식의 FORM을 사용하면 전달.. 2022. 11. 16.
신뢰 되지 않는 URL 주소로 자동 접속 연결 - 자동 연결할 외부 사이트의 URL 과 도메인은 화이트 리스트로 관리하고, 사용자 입력값을 자동 연결할 사이트주소로 사용하는 경우에는 입력된 값이 화이트 리스트에 존재하는지 확인해야 한다. 안전하지 않은 코드 ▼ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOExcepetion { String query = request.getQueryString(); if(query.contains("url")) { String url = request.getParameter("url"); response.sendRedirect(url); } //... } 안전한 코드 ▼ p.. 2022. 11. 15.
위험한 형식 파일 업로드 - 업로드하는 파일 타입과 크기를 제한하고, 업로드 디렉터리를 웹 서버의 다큐먼트 외부에 설정한다. - 화이트리스트 방식으로 허용된 확장자만 업로드되도록 하고, 확장자도 대소문자 구분 없이 처리하도록 한다. - 공격자의 웹을 통한 직접 접근을 차단한다, 또한, 파일 실행 여부를 설정할 수 있는 경우, 실행 속성을 제거한다. > 보안에서 화이트리스트란 기본 정책이 모두 차단인 상황에서 예외적으로 접근이 가능한 대상을 지정하는 방식 또는 그 지정된 대상들을 말한다.블랙리스트 반대 개념. 안전하지 않은 코드 ▼ public void upload(HttpServletRequest request) throws ServletException { MultipartHttpServletRequest mRequest = .. 2022. 11. 15.
크로스 사이트 스크립트 웹 페이지에 악의적인 스크립트를 포함시켜 사용자 측에서 실행되게 유도하여 공격 - 사용자가 입력한 문자열에서 , &, "," 등을 replace등의 문자 변환 함수나 메소드를 사용하여 &lt, &gt, &amp, &quot로 치환 - HTML 태그를 허용하는 게시판에서는 게시판에서 지원하는 HTML 태그의 리스트(White List)를 선정한 후, 해당 태그만 허용하는 방식 적용 - 보안성이 검증되어 있는 API를 사용하여 위험한 문자열 제거 예제 1 안전하지 않은 코드 ▼ Name : 외부로 받은 name을 그대로 출력하므로 안전하지 않다. 안전한 코드 ▼ replaceAll 사용 2022. 11. 11.
반응형