목록자바 (86)
삶 가운데 남긴 기록 AACII.TISTORY.COM
Improper Neutralization of Script-Related HTML Tags in a Web Page 크로스 사이트 스크립트 공격 취약점 정의 외부에서 입력되는 스크립트 문자열이 웹 페이지 생성에 사용되면 생성된 웹페이지를 열람하는 사용자에게 피해를 입힐 수 있습니다. 방어 방법 jsp의 document.write() 같은 DOM 객체 출력을 수행하는 메소드의 인자 값으로 외부 입력을 사용하면 위험한 문자를 제거해야 합니다. 보안성이 검증된 API를 사용하여 위험 문자열을 제거하십시오. 안전하지 않은 코드의 예 document.write("name:"+); 외부 입력을 그대로 이용하고 있습니다. 안전한 코드의 예
External Control of System or Configuration Setting 시스템 또는 구성 설정의 외부 제어 정의 시스템 설정이나 구성 설정을 외부에서 제어 가능하게 하면 예상치 못하게 악용 가능성이 있습니다. 방어 방법 외부 입력을 화이트 리스트 방식으로 검사한 후 사용합니다. 안전하지 않은 코드의 예 private final String COMMAND_PARAM = "command"; private final String CHANGE_FTP_PORT = "change_service_port"; priavte final String PORT_PARAM = "port"; //생략 protected void doPost(HttpServletRequest request, HttpServl..
SQL Injection: mybatis Data Map 정의 외부 입력 값이 SQL 의 인자값으로만 사용되지 않고 문자열로 연결되는 값으로 사용되면 SQL문에 Injection 되어 의도하지 않은 동작을 할 수 있게 됩니다. 방어 방법 외부 입력 값에 대해 안전하지 않은 문자열을 제거하도록 합니다. mybatis Data Map 에 문자열 삽입 인자($...$)를 사용하지 말고 ## 형태를 사용합니다. 안전하지 않은 예 DELETE STUDENTS WHERE NUM = #num# AND name = '$name$' $name$ 으로 전달되는 값에 ' OR 'x' = 'x' 를 외부 입력으로 전달되면 where조건이 항상 실행하게 할 수 있습니다. 안전한 코드의 예 DELETE STUDENTS WHERE..
Reliance on Untrusted Inputs in a SecurityDecision 보호 메커니즘을 우회할 수 있는 입력값 변조 정의 공격자는 다양한 방법을 통해 입력값(쿠키,환경변수,히든필드 등)을 조작할 수 있고 조작된 내용은 탐지되지 않을 수 있습니다. 따라서, 인증이나 인가 같은 보안 결정이 이런 입력값들을 기반으로 수행되면 보안을 우회할 수 있으므로 충분한 암호화 무결성 체크 등이 없는 경우 외부 입력값을 신뢰해서는 안됩니다. 방어 방법 상태 정보나 민감 데이터, 세션 정보 같은 중요한 정보는 서버에 저장하고 보안 절차도 서버에서 실행합니다. 안전하지 않은 예 Cookie[] cookies = request.getCookies(); for(int i = 0; i < cookies.leng..
정수 오버플로우 java 에서 허용한 큰 정수 값보다 더 커지면 의도하지 않게 작은 수 이거나 음수가 될 수 있습니다. 정수형 변수를 연산에 사용하는 경우 결과값의 범위를 체크하는 모듈을 사용합니다. 안전하지 않은 예 //생략 int size = new Integer(args[0]).intValue(); size += new Integer(args[1]).intValue(); MyClass[] data = new MyClass[size]; //생략 배열의 값이 오버플로우되어 음수가 되면 배열의 크기가 음수가 되어 문제가 생길 수 있습니다. 동적 메모리 할당을 위해 배열의 크기를 사용하는 경우 그 값이 음수인지 아닌지 검사하는 문장이 필요합니다. 안전한 코드의 예 //생략 int size = new Int..
Path Traversal 디렉토리 경로 조작 상대 디렉토리 경로 조작(Relative Path Traversal) 외부 입력으로 디렉터리 경로 문자열 생성이 필요한 경우 외부 입력을 필터링 하지 않으면 시스템 경로 조작이나 시스템 정보 유출, 장애, 권한 획득 등을 유발할 수 있습니다. 외부 입력에 대해서 다른 디렉터리 파일에 접근 할 수 없도록 replaceAll() 등을 이용하여 위험한 물자열(", / \ 등)을 제거해서 방어합니다. 외부 입력은 받더라도 내부 처리는 미리 정의해 놓은 데이터(경로)를 사용합니다. 안전하지 않은 예 public void accessFile(Properties request){ ... String name = request.getProperty("filename"); ..
URL Redirection to Untrusted Site 사용자의 입력값을 외부 사이트 주소로 사용해서 자동으로 연결하는 서버 프로그램은 피싱 공격에 취약점이 있습니다. 자동 연결할 외부 사이트의 URL은 화이트 리스트로 관리해서 방어합니다. 안전하지 않은 예 ... String url = request.getParameter("url"); response.sendRedirect(url); ... 안전한 예 //다른 사이트로 이동하는 URL 화이트 리스트를 만든다. String allowURL[] = {"https://url1.com", "https://url2.com", "https://url3.com"}; String nurl = request.getParameter("nurl"); try{ In..
Unrestricted Upload of File with Dangerous Type(위험한 형식 파일 업로드) 서버측에서 실행할 수 있는 파일(asp, jsp, php 등) 이 업로드 가능할 때, 이 파일을 이용해 시스템 내부 명령어를 실행하여 공격하는 방법입니다. 업로드하는 파일의 유효성 검사로 방어합니다. white list 확장자만 업로드 합니다. 업로드 디렉토리를 웹서버의 다큐먼트 외부에 설정합니다. 파일 실행 권한을 설정할 수 있는 경우 실행 권한을 제거합니다. 안전한 코드의 예 ... public void upload(HttpServletRequest request) throws SevletException{ MultipartHttpServletRequest mRequest = (Multip..
로그인 html 프로젝트의 WebContent 폴더 아래에 새 html 파일을 생성하고 이름을 login.html 으로 설정합니다. ID: PW: 로그아웃 로그인/로그아웃 서블릿 작업중인 패키지 경로에 새 서블릿 LoginOut.java 를 생성합니다. package net.aacii.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import j..
세션은 클라이언트 마다 개별적으로 생성되어 클라이언트의 브라우저를 종료할 때까지 서버쪽에서 그 객체(정보)를 유지합니다. HttpSession 생성 HttpSession객체는 개발자가 수동으로 생성하는게 아니라 HttpServletRequest의 getSession() 메서드를 이용해서 객체를 획득합니다. 새 서블릿 SessionTest.java를 생성합니다. package net.aacii.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpSe..
쿠키(Cookie) 클라이언트 단위로 상태정보를 유지해야 할 때 쿠키를 사용합니다. 예를들어 로그인 후 로그아웃 할 때까지 인증 상태를 유지 한다던지, 쇼핑몰 장바구니에 선택한 상품 정보들을 유지 한다던지 같은 유지 정보들을 관리합니다. 쿠키는 텍스트로 name=value 형태로 저장하며 만료 일자나 시간을 지정할 수 있습니다. 쿠키 저장(전송) 작업중인 패키지에 클래스 CookieTest.java를 생성합니다. package net.aacii.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; im..
ServletContext 서블릿 컨텍스트는 서버 쪽에서 웹 어플리케이션 단위로 값(정보)를 유지하는 방법입니다. 서블릿 컨테이너가 시작될 때 ServletContext 객체가 자동으로 생성되어 웹 어플리케이션이 종료될 때까지 계속 유지 합니다. init() 메소드를 재정의하여 추출 작업중인 패키지에서 class 파일을 하나 생성하고 이름을 ServletContextTest.java로 만들고 아래처럼 작성합니다. package net.aacii.test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax..
자바 웹 어플리케이션은 브라우저에서 아래 처럼 접근 할 수 있습니다. http://서버주소:포트번호/웹어플리케이션이름/서블릿orJSP 서블릿 경로(build path) 프로젝트 이름을 우클릭하고 Build Path -> Configure Build Path 를 선택합니다. 여기 source 탭에 아래 부분에 Default output folder: 항목에 Browse... 버튼을 클릭합니다. 폴더 목록에서 jsp> WebContent > WEB-INF 폴더를 선택한 후 Create New Folder를 선택합니다. 그러면 자바 소스 파일들이 컴파일 후에 방금 지정한 WEB-INF/classes 에 생성되는 것입니다. 서블릿 작성(package 경로: net.aacii.test) src 경로에 net.aa..
Web Service 네트워크상 분산된 자원들을 연동하여 자원을 공유하는 서비스입니다. SOAP기반 웹 서비스와 RESTful 기반 웹서비스가 있습니다. SOAP(Simple Object Access Protocol)는 XML로 이루어진 WSDL(Web Services Description Language) 자원(data)을 UDDI라는 전역 서비스 저장소에 등록(publish)하여 공개하면 서비스 요청자가 검색 후 SOAP프로토콜을 이용하여 메시지를 주고받는 방식입니다. SOAP envelope + SOAP header + SOAP body로 구성된 XML 메시지를 주고 받습니다. 내용이 많아서 무겁고, UDDI를 거쳐야하고, 개발환경이 지원해줘야 하므로 한계점이 명확합니다. RESTful은 리소스를 ..
byte는 8 bits 2진법(0 or 1)으로 표현된 데이터 입니다. 16진법은 0~9, A~F 까지 기호를 사용하여 숫자를 표현(코딩)하는 방식입니다. 64진법은 0~9, a~z, A~Z, +, / 기호를 이용하여 숫자를 표현(코딩)하는 방식입니다. byte array 는 2진수로 이루어진 데이터 입니다만 사람이 읽기 어려우므로 16진법(Hex digits)이나 64진법(base64)으로 변환하여 2진수의 배열(byte array)을 문자처럼 사용하기도 합니다. java에서 byte 데이터를 16진수 String으로 바꿀 때 보통 아래와 같은 소스 코드를 이용합니다. Integer.toString(((int) bytedata & 0xff)+0x100, 16).substring(1); Integer.t..