Chapter 07 소스코드의 취약점 분석
01 소스코드의 취약점 02 소스코드의 취약점 분석 방법 03 프로그래밍 언어별 주요 취약점
소스코드의 취약점 분석 접근 방식을 학습한다. 소스코드의 취약점 유형을 학습한다. 프로그래밍 언어별 주요 취약점 패턴 및 함수 종류를 학습한다.
1.1 웹 애플리케이션의 보안 취약점 찾기 ‘Black Box Testing’ 방식 소스코드를 보지 않고 웹 애플리케이션의 외부 인터페이스나 구조를 분석하여 취약점을 발견 White Box Testing에 비해 취약점을 찾는 속도가 빠르며 다양한 취약점 찾기 시도 가능 인터페이스 간의 상관관계를 분석하여 취약점이 발생하는 부분 식별 가능
1.1 웹 애플리케이션의 보안 취약점 찾기 ‘ White Box Testing’ 방식 ‘Gray Box Testing’ 방식 개발된 소스코드를 살펴봄으로써 코딩의 취약점을 찾는 것 내부 소스코드를 볼 수 있기 때문에 보안 취약점의 존재 유무를 좀 더 확실히 알 수 있으나 시간이 오래 소요됨. ‘Gray Box Testing’ 방식 Black Box Testing과 White Box Testing의 장점을 혼합 외부에서 보이는 취약점을 웹 애플리케이션 보안 진단을 통해 확인하고, 소스 코드에서 접근 통제, 입력값 검증, 세션 처리 문제 등을 같이 살펴보면서 취약 점을 조사하는 방식
1.2 소스코드의 취약점 유형
2.1 입력값 검증 취약점 입력값 검증 취약점 대표적인 예로는 SQL 인젝션, 크로스 사이트 스크립팅, 위험한 형식의 파일 업 로드, 디렉터리 경로 조작 등이 있음.
2.1 입력값 검증 취약점 LoginSqlInjection.java 파일 확인 C:\[WebGoat 설치 디렉터리]\extract\webapps\WebGoat\plugin_ extracted\org\owasp\webgoat\plugin\sqlinjection\LoginSqlInjection.java
2.1 입력값 검증 취약점 LoginSqlInjection.java 파일 확인 public boolean login(WebSession s, String userId, String password) { // System.out.println("Logging in to lesson"); boolean authenticated = false; try String query = "SELECT * FROM employee WHERE userid = " + userId + " and password = '" + password + “’”; // System.out.println("Query:" + query); Statement answer_statement = WebSession.getConnection(s) .createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet answer_results = answer_statement.executeQuery(query);
2.1 입력값 검증 취약점 입력값 검증 미비의 문제점 확인 문제가 되는 핵심 코드의 실행 과정 사용자가 입력한 아이디와 패스워드는 userId와 password 변숫값으로 저장된다. userId와 password 변숫값을 포함하여 SELECT 문장을 만든다. 완성된 SELECT 문장을 executeQuery 함수를 통해 실행한다. 공격자가 아이디, 패스워드에 admin, ‘or’‘=’를 입력하면 만들어지는 쿼리문 → SQL 인젝션 취약점의 검증을 위해 소스코드를 분석할 때는 SELECT문과 같은 데이터베이스 쿼리문을 검색하고, 필터링 규칙이 포함되어 있는지 살펴봐야 함. SELECT * FROM employee WHERE userid = 'admin' and password = ''or''=''
2.1 입력값 검증 취약점 StoredXss.java 파일 확인 C:\[WebGoat 설치 디렉터리]\extract\webapps\WebGoat\plugin_extracted \org\owasp\ webgoat\plugin\StoredXss.java
2.1 입력값 검증 취약점 StoredXss.java 파일 확인 protected void addMessage(WebSession s) { try String title = HtmlEncoder.encode(s.getParser( ).getRawParameter(TITLE, "")); String message = s.getParser( ).getRawParameter(MESSAGE, ""); ⋮ statement.setString(2, title); statement.setString(3, message);
2.1 입력값 검증 취약점 입력값 검증 미비의 문제점 확인 문제가 되는 핵심 코드의 실행 과정 사용자가 입력한 title과 message 변수를 getRawParameter 함수를 통해 받아들인다. 해당 변수를 필터링 없이 데이터베이스 쿼리문에 포함하여 저장한다. → 사용자가 입력하는 값을 getRawParameter 함수를 통해 받아들이며, 이후 추 가적인 필터링 기능이 없는 것 확인
2.1 입력값 검증 취약점 MaliciousFileExecution.java 파일 확인 C:\[WebGoat 설치 디렉터리]\extract\webapps\WebGoat\plugin_extracted \org\owasp\webgoat\plugin\MaliciousFileExecution.java
2.1 입력값 검증 취약점 MaliciousFileExecution.java 파일 확인 File userfile = new File(uploads_and_target_parent_directory + TARGET_RELATIVE_PATH + java.io.File.separator + s.getUserName() + ".txt"); String image_query = "SELECT image_relative_url FROM mfe_images WHERE user_name = '" + s.getUserName() + "'"; Statement image_statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet image_results = image_statement.executeQuery(image_query);
2.1 입력값 검증 취약점 위험한 형식의 파일 업로드에 대한 입력값 검증 미비의 문제점 확인 getUserName으로 파일명을 가져와서 처리할 때 파일명 및 확장자에 대한 필 터링이 없는 것 확인 → 웹 애플리케이션의 파일을 업로드하는 부분에서 파일 확장자를 검사하는지 살펴볼 필요가 있음.
2.1 입력값 검증 취약점 디렉터리 경로 조작 파일명을 받아서 처리하는 부분에 파일명에 대한 필터링이 없으면 공격자는 디 렉터리 경로를 조작하여 상위 디렉터리에 있는 임의의 파일에 접근할 수 있음. → 파일명을 받는 file 변수나 getRawParameter 변수를 통해 필터링하고 있는지 확인
2.2 세션 처리 및 접근 통제 취약점 매개변수 조작 URL에서 변수 또는 POST 형태로 전송되는 매개변숫값을 조작하여 자신이 소 유한 것 외의 권한을 획득하는 공격 기법 매개변수 조작 취약점이 존재하는지 확인하려면 사용자 권한이 필요한 페이지 에 접근할 때 세션 처리를 하는 코드를 포함하는지 확인 예) 사용자가 입력한 매개변숫값을 받아들여 쿠키로 저장하고 그 쿠키 값으로 인증하는 경우
2.2 세션 처리 및 접근 통제 취약점 쿠키 조작 브라우저의 쿠키 값을 통해 사용자 권한을 부여하는 코드 쿠키 값은 쉽게 조작할 수 있기 때문에 쿠키 값으로 인증하는 코드는 안전하 지 않음. → 매개변수와 쿠키 조작 취약점 관련 소스코드를 살펴보려면 getCookie와 같이 쿠키를 입력받아 처리하는 부분이 있는지 확인 Cookie[] = cookies = request.getCookies(); for(int i = 0; i < cookies.length; i + +) { Cookie c = cookies[i]; if(c.getName().equals("role")) { userRole = c.getValue(); }
2.2 세션 처리 및 접근 통제 취약점 강제 브라우징 권한이 필요한 페이지에 권한 체크 코드가 누락되었을 때 발생 /admin/과 같은 관리자 디렉터리 내에 있는 소스코드 중에 세션 처리 등의 코 드가 존재하는지 확인해봄으로써 강제 브라우징 취약점이 존재하는 페이지를 찾을 수 있음. → 관리자 페이지 및 인증이 필요한 페이지에 세션 처리 코드가 포함되어 있는 지 확인
2.3 코드 내 중요 정보 노출 취약점 중요 정보 평문 전송 중요 정보 평문 전송 취약점을 확인하는 방법 패스워드나 주민등록번호와 같은 민감한 내용을 암호화하지않고 평문으로 전 송할 때 발생하는 취약점 중요 정보 평문 전송 취약점을 확인하는 방법 사용자의 중요 정보를 전송하는 페이지가 HTTPS(SSL) 등의 암호화된 채널로 통신하는지 확인 소스코드 내에서 중요한 정보를 암호화 함수를 통해 전송하는지 확인
2.3 코드 내 중요 정보 노출 취약점 행정안전부 소프트웨어 개발 보안 가이드 예제 네트워크상에서 Socket 함수로 데이터를 전송할 때 암호화를 하지 않는다면 공격자가 스니핑을 통해 패스워드를 얻을 수 있음. void foo( ) { try Socket socket = new Socket("transit", 4444); PrintWriter out = new PrintWriter(socket.getOutputStream( ), true); String password = getPassword( ); out.write(password) } catch (FileNotFoundException e) ⋮
2.3 코드 내 중요 정보 노출 취약점 암호화 함수를 이용한 전송 소스코드 또는 중요 정보를 암호화하더라도 복호화 함수나 복호화 키가 쉽게 노출된다면 암호화된 정보가 공격자에 의해 악용될 수 있음.
2.3 코드 내 중요 정보 노출 취약점 하드 코딩된 패스워드 하드 코딩(hard coding) : 패스워드 및 시스템 접속 정보와 같은 민감한 정보가 소스코드 내에 그대로 노출되어 있는 경우 공격자가 소스코드를 외부에서 열람할 경우 심각한 2차 공격에 악용될 수 있음. 데이터베이스 접속 정보 중 패스워드(anesra)를 하드 코딩한 예 public Connection DBConnect(String url, String id) { try conn = DriverManager.getConnection(url, id, "anesra"); } catch (SQLException e) System.err.println("..."); return conn;
2.3 코드 내 중요 정보 노출 취약점 주석 처리된 중요 정보 주석에는 해당 소스코드가 어떤 기능을 하는지 설명하는 내용이 많은데, 간혹 개발 단계에서 수정이 발생한 소스코드를 삭제하지 않고 주석 처리를 하는 경 우가 있음. → 언어별 주석 처리를 하는 코드만 발췌하여 해당 코드 내에 패스워드 또는 데 이터베이스 접속 정보 등 민감한 내용이 포함되어 있는지 확인
3.1 자바 입력값 처리 함수
3.1 자바 사용자 세션 처리 함수 그 외에 살펴볼 함수
3.2 ASP.NET 입력값 처리 함수
3.2 ASP.NET 사용자 세션 처리 함수 그 외에 살펴볼 함수