웹 취약점 점검 항목(1편) / 1~10번 항목

웹 취약점은 현대 정보통신 서비스에서 가장 흔하게 발생하는 보안 문제 중 하나로, 해커들의 노출 및 공격 시도의 주요 대상입니다. 이에 따라 웹 취약점 분석과 평가는 주요정보통신기반시설의 보안 강화를 위한 필수적인 단계로 간주됩니다.

본 문서에서는 KISA에서 제시하는 2023년도 최신 기준으로 웹 취약점 점검 항목 28가지에 대한 상세한 기술 포스팅을 작성해봤습니다.
기존 주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세가이드 문서에서 제공되는 예제가 아닌 좀 더 상세하고 최신 보안 동향을 반영하여 다양한다양한 설명을 덧붙여 기관 및 조직의 웹 애플리케이션 보안 강화에 도움이 되도록 안내하겠습니다.

* 근거: 주요정보통신기반시설 기술적 취약점 분석 평가 방법 상세가이드(2021)

목차

1. 버퍼 오버플로우(BO)

점검 내용:

버퍼오버플로우 취약점 점검은 소프트웨어의 코드에서 사용자 입력을 저장하는 버퍼를 초과하여 데이터를 쓸 수 있는지 확인하는 과정입니다. 이를 통해 메모리 오버플로우를 방지하고 시스템 안전성을 강화할 수 있습니다.

점검 목적:

  • 시스템 및 소프트웨어의 안전성 확보
  • 악성 코드 실행 및 시스템 침투를 방지
  • 서비스 중단 및 데이터 유출 방지

보안위협:

버퍼오버플로우 취약점을 악용하면 공격자가 시스템 메모리를 침범하여 다음과 같은 위험을 초래할 수 있습니다:

  • 악성 코드 실행
  • 시스템 다운 또는 마비
  • 민감한 정보 유출

대상:

모든 소프트웨어, 특히 C, C++, Rust 등의 저수준 언어로 작성된 프로그램 및 시스템

판단기준:

양호 (Good):

  • 입력값의 길이를 검증하여 버퍼 크기를 초과하지 않음
  • 안전한 함수(예: fgets(), snprintf())를 사용하여 입력 처리

취약 (Vulnerable):

  • 입력값의 길이 검증이 누락되어 버퍼 오버플로우 발생 가능성 존재
  • 안전하지 않은 함수(예: gets(), sprintf())로 인해 취약점 노출

조치방법:

  1. 입력 길이 검증: 사용자 입력의 길이를 확인하고, 버퍼 크기를 초과하지 않도록 검증해야 합니다.
  2. 안전한 함수 사용: 안전한 함수를 사용하여 입력값을 처리하고, C 언어의 경우 gets()sprintf() 대신 fgets()snprintf()를 활용해야 합니다.
  3. 버퍼 크기 조정: 버퍼의 크기를 적절히 조정하여 입력이 버퍼를 초과하지 않도록 합니다.
  4. ASLR(주소 공간 무작위화): 운영체제에서 제공하는 ASLR을 활성화하여 메모리 주소를 무작위로 할당하여 버퍼오버플로우 공격의 어려움을 증가시킵니다.
  5. 보안 패치 적용: 사용하는 라이브러리나 프레임워크의 버퍼 오버플로우 관련 보안 패치를 정기적으로 적용해야 합니다.

예시 구문 (취약코드):

#include <stdio.h>

void welcome_user(char *name) {
    char buffer[10];
    strcpy(buffer, name);
    printf("환영합니다, %s님!\n", buffer);
}

int main() {
    char input[50];
    printf("이름을 입력하세요: ");
    gets(input); // 취약점 발생: 버퍼 오버플로우 가능성 있음
    welcome_user(input);
    return 0;
}

위 코드에서 gets() 함수는 입력값의 길이를 검증하지 않고 버퍼 오버플로우를 발생시킬 수 있는 취약한 함수입니다.

예시 구문 (보완된 코드):

#include <stdio.h>
#include <string.h>

void welcome_user(char *name) {
    char buffer[10];
    strncpy(buffer, name, sizeof(buffer) - 1); // 버퍼 크기 초과 방지
    buffer[sizeof(buffer) - 1] = '\0'; // 문자열 종료
    printf("환영합니다, %s님!\n", buffer);
}

int main() {
    char input[50];
    printf("이름을 입력하세요: ");
    fgets(input, sizeof(input), stdin); // 안전한 입력 함수 사용
    welcome_user(input);
    return 0;
}

보완된 코드에서는 strncpy() 함수를 사용하여 입력값의 길이를 검증하고 버퍼 크기를 초과하지 않도록 조치하였습니다. 또한, fgets() 함수를 사용하여 안전하게 사용자 입력을 받도록 변경하였습니다. 이렇게 함으로써 버퍼오버플로우 취약점을 보완하고 안전성을 확보할 수 있습니다.

2. 포맷스트링(FS)

점검 내용:

포맷스트링 취약점은 문자열 포맷을 처리하는 함수에서 발생하는 보안 취약점으로, 사용자 입력을 포맷 지정자로 인식하여 악의적인 코드 실행을 허용할 수 있는 문제입니다.

점검 목적:

  • 시스템 안전성 확보: 포맷스트링 취약점을 식별하여 악의적인 코드 실행을 차단하여 시스템의 안전성을 확보합니다.
  • 데이터 유출 방지: 공격자가 포맷스트링을 이용하여 시스템 정보나 민감한 데이터를 노출시키는 것을 방지합니다.

보안위협:

포맷스트링 취약점을 악용하면 다음과 같은 위험을 초래할 수 있습니다:

  • 메모리 누수 및 파괴
  • 악성 코드 실행
  • 민감한 정보 노출

대상:

프로그래밍 언어에서 문자열 포맷 처리를 하는 모든 함수 및 메소드

판단기준:

양호 (Good):

  • 사용자 입력을 포맷 문자열에 직접 사용하지 않음
  • 안전한 방식으로 포맷 문자열 생성 및 처리

취약 (Vulnerable):

  • 사용자 입력이 포맷 지정자에 직접 사용되거나 처리되지 않음
  • 포맷 문자열 관련 보안 처리가 누락됨

조치방법:

  1. 사용자 입력 검증: 사용자 입력을 정확한 데이터 타입으로 검증하여 포맷 문자열에 직접 사용하지 않도록 합니다.
  2. 포맷 스트링 처리: 안전한 함수 및 라이브러리를 사용하여 포맷 문자열을 생성하고 처리합니다.
  3. 포맷 스트링 예방: 포맷 문자열 생성 시, 사용자 입력을 직접 사용하지 않도록 주의합니다.
  4. 프로퍼 에러 처리: 포맷스트링 취약점이 발견될 경우, 프로그램이 비정상적으로 종료되지 않도록 적절한 에러 처리를 수행합니다.

예시 구문 (취약한 코드):

가정: C 언어로 작성된 프로그램에서 사용자의 입력을 포맷 문자열에 직접 사용하는 경우를 가정합니다.

#include <stdio.h>

int main() {
    char user_input[50];
    printf("이름을 입력하세요: ");
    scanf("%s", user_input);
    printf(user_input); // 취약점 발생: 사용자 입력이 직접 포맷 문자열로 사용됨
    return 0;
}

예시 구문 (보완된 코드):

#include <stdio.h>

int main() {
    char user_input[50];
    printf("이름을 입력하세요: ");
    scanf("%s", user_input);
    printf("안녕하세요, %s님!\n", user_input); // 안전한 방식으로 포맷 문자열 처리
    return 0;
}

위의 예시 코드에서 보완된 버전은 사용자 입력을 안전한 방식으로 포맷 스트링에 적용하여 취약점을 방지하고 있습니다.

3. LDAP 인젝션(LI)

점검 내용:

LDAP 인젝션은 웹 애플리케이션에서 LDAP (Lightweight Directory Access Protocol) 서버에 악의적인 입력을 삽입하여 인증 우회나 민감한 정보 노출과 같은 보안 취약점을 유발할 수 있는 문제입니다.

점검 목적:

  • 시스템 보안 강화: LDAP 인젝션 취약점을 식별하여 시스템 보안을 강화하고, 공격자의 접근을 차단합니다.
  • 개인 정보 보호: 민감한 사용자 정보가 노출되지 않도록 인증 우회 공격을 방지합니다.

보안위협:

LDAP 인젝션은 다음과 같은 위험을 초래할 수 있습니다:

  • 인증 우회: 공격자가 인증을 우회하여 민감한 기능에 접근 가능
  • 데이터 노출: 사용자 정보 등 민감한 데이터가 공격자에게 노출될 수 있음

대상:

웹 애플리케이션에서 LDAP 서버와 상호 작용하는 모든 부분

판단기준:

양호 (Good):

  • 입력값이 적절하게 검증되고 이스케이프되어 LDAP 쿼리에 사용되는 경우

취약 (Vulnerable):

  • 입력값이 적절하게 검증되지 않고 그대로 LDAP 쿼리에 사용되는 경우

조치방법:

  1. 입력값 검증: 사용자 입력값이 올바른 형식인지 검증하고, 필요한 경우 데이터 타입 변환을 수행합니다.
  2. 파라미터화 쿼리: Prepared Statements 또는 파라미터화된 쿼리를 사용하여 입력값을 안전하게 LDAP 쿼리에 적용합니다.
  3. 이스케이프 처리: 입력값에 이스케이프 처리를 수행하여 특수 문자의 인젝션을 방지합니다.

예시 구문 (취약한 코드):

가정: 웹 애플리케이션에서 사용자 입력을 직접 LDAP 쿼리에 사용하는 경우를 가정합니다.

String userInput = request.getParameter("username");
String ldapQuery = "(&(objectClass=user)(cn=" + userInput + "))"; // 취약점 발생: 사용자 입력이 직접 LDAP 쿼리에 사용됨

예시 구문 (보완된 코드):

String userInput = request.getParameter("username");
String ldapQuery = "(&(objectClass=user)(cn=?" + userInput + "))"; // 파라미터화된 쿼리 사용
// ... (파라미터 바인딩 및 실행)

위의 예시 코드에서 보완된 버전은 파라미터화된 쿼리를 사용하여 입력값을 안전하게 처리하고 있습니다.

4. 운영체제 명령 실행(OC)

점검 내용:

운영체제 명령 실행 취약점은 웹 애플리케이션에서 사용자 입력을 조작하여 운영체제 명령을 실행하는 공격을 의미합니다. 공격자가 시스템 명령을 실행하거나 민감한 파일에 접근할 수 있는 위험이 있습니다.

점검 목적:

  • 시스템 안전성 강화: 운영체제 명령 실행 취약점을 식별하여 시스템의 안전성을 높이고, 공격자의 잠재적 침입을 방지합니다.
  • 데이터 보호: 시스템 명령 실행을 통한 민감한 데이터 노출을 방지합니다.

보안위협:

운영체제 명령 실행 취약점은 다음과 같은 위험을 초래할 수 있습니다:

  • 시스템 명령 실행: 공격자가 시스템 명령을 실행하여 시스템을 조작 또는 침투할 수 있음
  • 파일 접근: 공격자가 민감한 파일에 접근하여 데이터를 유출할 수 있음

대상:

웹 애플리케이션에서 사용자 입력을 운영체제 명령에 직접 사용하는 모든 부분

판단기준:

양호 (Good):

  • 사용자 입력을 운영체제 명령에 직접 사용하지 않음
  • 안전한 방식으로 운영체제 명령 실행 및 처리

취약 (Vulnerable):

  • 사용자 입력이 운영체제 명령에 직접 사용되거나 처리되지 않음
  • 운영체제 명령 실행 관련 보안 처리가 누락됨

조치방법:

  1. 입력값 검증: 사용자 입력값을 검증하여 허용되지 않는 문자나 명령어를 필터링하고 처리합니다.
  2. 운영체제 명령 대체: 안전한 API나 라이브러리를 사용하여 운영체제 명령을 실행하고 결과를 처리합니다.
  3. 권한 제한: 애플리케이션이 실행하는 운영체제 명령의 권한을 최소한으로 제한하여 공격 범위를 줄입니다.

예시 구문 (취약한 코드):

가정: 웹 애플리케이션에서 사용자 입력을 직접 운영체제 명령에 사용하는 경우를 가정합니다.

import os

user_input = input("파일명을 입력하세요: ")
os.system("cat " + user_input)  # 취약점 발생: 사용자 입력이 운영체제 명령에 직접 사용됨

예시 구문 (보완된 코드):

import os

user_input = input("파일명을 입력하세요: ")
file_path = "/path/to/files/" + user_input
with open(file_path, "r") as file:
    content = file.read()
print(content)  # 안전한 방식으로 파일 읽기 수행

위의 예시 코드에서 보완된 버전은 사용자 입력을 안전한 방식으로 처리하여 운영체제 명령 실행 취약점을 방지하고 있습니다.

5. SQL 인젝션(SI)

점검 내용:

SQL 인젝션은 웹 애플리케이션에서 사용자 입력을 조작하여 데이터베이스 쿼리를 악용하는 공격을 의미합니다. 공격자는 데이터베이스를 조작하거나 민감한 정보를 유출할 수 있습니다.

점검 목적:

  • 시스템 보안 강화: SQL 인젝션 취약점을 식별하여 시스템의 보안을 강화하고, 데이터베이스의 무단 접근을 방지합니다.
  • 개인 정보 보호: 민감한 데이터가 노출되거나 조작되는 것을 방지하여 사용자 정보 보호를 강화합니다.

보안위협:

SQL 인젝션은 다음과 같은 위험을 초래할 수 있습니다:

  • 데이터 노출: 공격자가 데이터베이스에서 민감한 정보를 노출시킬 수 있음
  • 데이터 조작: 데이터베이스를 조작하여 정보를 변경하거나 삭제할 수 있음

대상:

웹 애플리케이션에서 사용자 입력을 데이터베이스 쿼리에 직접 사용하는 모든 부분

판단기준:

양호 (Good):

  • 사용자 입력이 적절하게 검증되고 이스케이프되어 데이터베이스 쿼리에 사용되는 경우

취약 (Vulnerable):

  • 사용자 입력이 적절하게 검증되지 않고 그대로 데이터베이스 쿼리에 사용되는 경우

조치방법:

  1. 입력값 검증: 사용자 입력값을 검증하여 허용되지 않는 문자나 쿼리 조작을 방지합니다.
  2. 파라미터화 쿼리: Prepared Statements 또는 파라미터화된 쿼리를 사용하여 입력값을 안전하게 쿼리에 적용합니다.
  3. ORM 사용: Object-Relational Mapping (ORM) 라이브러리를 사용하여 쿼리를 생성하고 실행합니다.

예시 구문 (취약한 코드):

가정: 웹 애플리케이션에서 사용자 입력을 직접 데이터베이스 쿼리에 사용하는 경우를 가정합니다.

$user_input = $_POST['username'];
$query = "SELECT * FROM users WHERE username = '$user_input'"; // 취약점 발생: 사용자 입력이 직접 쿼리에 사용됨
$result = mysqli_query($conn, $query);

예시 구문 (보완된 코드):

$user_input = $_POST['username'];
$query = "SELECT * FROM users WHERE username = ?"; // 파라미터화된 쿼리 사용
$stmt = mysqli_prepare($conn, $query);
mysqli_stmt_bind_param($stmt, "s", $user_input);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);

위의 예시 코드에서 보완된 버전은 파라미터화된 쿼리를 사용하여 입력값을 안전하게 처리하고 있습니다.

6. SSI 인젝션(SS)

SSI (Server Side Includes) 인젝션은 웹 서버에서 동적으로 웹 페이지를 생성하는 경우, 사용자 입력을 악용하여 서버 측 코드를 실행시키는 공격입니다. 공격자는 서버에서 실행되는 코드를 조작하여 원하지 않는 동작을 유발할 수 있습니다.

점검 목적:

  • 웹 서버 안전성 강화: SSI 인젝션 취약점을 식별하여 웹 서버의 안전성을 높이고, 서버 측 코드 실행을 방지합니다.
  • 데이터 유출 방지: 민감한 정보가 노출되거나 공격자에게 노출될 수 있는 위험을 방지합니다.

보안위협:

SSI 인젝션은 다음과 같은 위험을 초래할 수 있습니다:

  • 코드 실행: 공격자가 서버 측 코드를 실행하여 웹 페이지의 동작을 조작할 수 있음
  • 정보 노출: 서버 측 코드의 내용이 노출될 수 있음

대상:

웹 서버에서 SSI를 사용하여 동적으로 웹 페이지를 생성하는 모든 부분

판단기준:

양호 (Good):

  • 사용자 입력이 적절하게 검증되고 이스케이프되어 SSI 태그 또는 서버 측 코드에 사용되는 경우

취약 (Vulnerable):

  • 사용자 입력이 적절하게 검증되지 않고 그대로 SSI 태그 또는 서버 측 코드에 사용되는 경우

조치방법:

  1. 입력값 검증: 사용자 입력값을 검증하여 허용되지 않는 문자나 코드 실행을 방지합니다.
  2. 이스케이프 처리: 사용자 입력이 SSI 태그 또는 서버 측 코드에 사용되기 전에 이스케이프 처리를 수행하여 코드 실행을 방지합니다.
  3. 실제 파일 경로 사용: SSI에서 외부 파일을 포함하는 경우, 실제 파일 경로 대신 사용자 입력을 사용하지 않도록 합니다.

예시 구문 (취약한 코드):

가정: 웹 페이지에서 SSI 태그에 사용자 입력을 직접 사용하는 경우를 가정합니다.

<!DOCTYPE html>
<html>
<head>
    <title>환영합니다</title>
</head>
<body>
    <!-- 취약점 발생: 사용자 입력이 직접 SSI 태그에 사용됨 -->
    <!-- #include virtual="$user_input" -->
</body>
</html>

예시 구문 (보완된 코드):

<!DOCTYPE html>
<html>
<head>
    <title>환영합니다</title>
</head>
<body>
    <!-- 안전한 방식으로 SSI 태그 처리 -->
    <!-- #include virtual="/path/to/file" -->
</body>
</html>

위의 예시 코드에서 보완된 버전은 안전한 방식으로 SSI 태그를 사용하여 취약점을 방지하고 있습니다.

7. XPath 인젝션(XI)

점검 내용:

XPath 인젝션은 XML 데이터를 처리하는 웹 애플리케이션에서 사용자 입력을 조작하여 XPath 쿼리를 악용하는 공격을 의미합니다. 공격자는 XML 데이터를 조작하거나 민감한 정보를 노출시킬 수 있습니다.

점검 목적:

  • 웹 애플리케이션 보안 강화: XPath 인젝션 취약점을 식별하여 웹 애플리케이션의 보안을 강화하고, 민감한 데이터의 노출을 방지합니다.
  • 데이터 무결성 보호: XML 데이터의 무결성을 유지하고, 데이터 변조나 조작을 방지합니다.

보안위협:

XPath 인젝션은 다음과 같은 위험을 초래할 수 있습니다:

  • 데이터 노출: 공격자가 XML 데이터를 조작하여 민감한 정보를 노출시킬 수 있음
  • 데이터 변조: XML 데이터를 조작하여 데이터의 무결성을 침해할 수 있음

대상:

웹 애플리케이션에서 XML 데이터를 처리하고 XPath 쿼리에 사용하는 모든 부분

판단기준:

양호 (Good):

  • 사용자 입력이 적절하게 검증되고 이스케이프되어 XPath 쿼리에 사용되는 경우

취약 (Vulnerable):

  • 사용자 입력이 적절하게 검증되지 않고 그대로 XPath 쿼리에 사용되는 경우

조치방법:

  1. 입력값 검증: 사용자 입력값을 검증하여 허용되지 않는 문자나 XPath 쿼리 조작을 방지합니다.
  2. 이스케이프 처리: 사용자 입력이 XPath 쿼리에 사용되기 전에 이스케이프 처리를 수행하여 쿼리 조작을 방지합니다.
  3. 파라미터화된 XPath: 필요한 경우 XML 데이터와 XPath 쿼리를 파라미터화하여 사용합니다.

예시 구문 (취약한 코드):

가정: 웹 애플리케이션에서 사용자 입력을 직접 XPath 쿼리에 사용하는 경우를 가정합니다.

String userInput = request.getParameter("username");
String xPathQuery = "/users/user[@name='" + userInput + "']"; // 취약점 발생: 사용자 입력이 직접 XPath 쿼리에 사용됨

예시 구문 (보완된 코드):

String userInput = request.getParameter("username");
String xPathQuery = "/users/user[@name=?]"; // 파라미터화된 XPath 사용
XPathExpression expr = xpath.compile(xPathQuery);
expr.setString(1, userInput);
NodeList result = (NodeList) expr.evaluate(document, XPathConstants.NODESET);

위의 예시 코드에서 보완된 버전은 파라미터화된 XPath를 사용하여 입력값을 안전하게 처리하고 있습니다.

8. 디렉터리 인덱싱(DI)

점검 내용:

디렉터리 인덱싱은 웹 서버에서 디렉터리에 포함된 파일 목록을 노출시키는 기능을 말합니다. 공격자는 노출된 파일 목록을 통해 시스템 정보나 민감한 파일을 탐색할 수 있습니다.

점검 목적:

  • 웹 서버 보안 강화: 디렉터리 인덱싱 취약점을 식별하여 웹 서버의 보안을 강화하고, 민감한 파일의 노출을 방지합니다.
  • 정보 노출 방지: 시스템 정보나 민감한 파일의 노출을 막아 사용자 정보를 보호합니다.

보안위협:

디렉터리 인덱싱은 다음과 같은 위험을 초래할 수 있습니다:

  • 정보 노출: 민감한 파일이나 디렉터리 구조가 공격자에게 노출될 수 있음

대상:

웹 서버에서 디렉터리 인덱싱 기능을 사용하는 모든 부분

판단기준:

양호 (Good):

  • 디렉터리 인덱싱이 비활성화되어 있는 경우

취약 (Vulnerable):

  • 디렉터리 인덱싱이 활성화되어 있는 경우

조치방법:

  1. 디렉터리 인덱싱 비활성화: 웹 서버 설정에서 디렉터리 인덱싱을 비활성화합니다.
  2. 인덱스 페이지 제공: 대신 인덱스 페이지를 제공하여 사용자가 디렉터리 내용을 탐색할 수 있도록 합니다.
  3. 디렉터리 접근 권한 설정: 민감한 파일이나 디렉터리에 대한 접근 권한을 설정하여 무단 접근을 방지합니다.

예시 구문 (활성화된 디렉터리 인덱싱):

가정: 웹 서버의 디렉터리 인덱싱이 활성화되어 있는 경우를 가정합니다.

http://example.com/files/

예시 구문 (비활성화된 디렉터리 인덱싱):

가정: 웹 서버의 디렉터리 인덱싱이 비활성화되어 있는 경우를 가정합니다.

403 Forbidden

위의 예시 코드에서는 디렉터리 인덱싱이 활성화된 경우와 비활성화된 경우를 나타내고 있습니다.

9. 정보 누출(IL)

점검 내용:

정보 누출은 웹 애플리케이션에서 민감한 정보나 개인 정보가 무단으로 노출되는 것을 의미합니다. 공격자는 누출된 정보를 악용하여 사용자의 개인 정보를 유출하거나 시스템의 무단 접근을 시도할 수 있습니다.

점검 목적:

  • 사용자 정보 보호: 정보 누출 취약점을 식별하여 사용자의 개인 정보와 민감한 데이터를 보호합니다.
  • 시스템 보안 강화: 민감한 시스템 정보가 노출되지 않도록 하여 시스템의 보안을 강화합니다.

보안위협:

정보 누출은 다음과 같은 위험을 초래할 수 있습니다:

  • 개인 정보 유출: 사용자의 개인 정보가 노출되어 개인 정보 보호법을 위반할 수 있음
  • 시스템 정보 노출: 민감한 시스템 정보가 노출되어 시스템에 대한 공격이 수행될 수 있음

대상:

웹 애플리케이션에서 사용자 정보, 데이터베이스 정보, 시스템 정보 등 모든 종류의 정보

판단기준:

양호 (Good):

  • 민감한 정보가 안전하게 저장되고 처리되며, 외부로 유출되지 않는 경우

취약 (Vulnerable):

  • 민감한 정보가 취약한 상태로 저장되거나 처리되어 무단으로 노출될 수 있는 경우

조치방법:

  1. 데이터 암호화: 민감한 정보를 저장할 때 데이터 암호화를 사용하여 외부 노출을 방지합니다.
  2. 접근 제어: 민감한 정보에 대한 접근 권한을 제한하여 무단 접근을 방지합니다.
  3. 보안 설정 강화: 웹 서버 및 데이터베이스의 보안 설정을 강화하여 누출 가능성을 줄입니다.

예시 구문 (정보 누출 취약점):

가정: 웹 애플리케이션에서 민감한 사용자 정보를 평문으로 저장하는 경우를 가정합니다.

$user_id = $_POST['user_id'];
$user_password = $_POST['user_password'];
$query = "INSERT INTO users (id, password) VALUES ('$user_id', '$user_password')"; // 취약점 발생: 민감한 정보가 평문으로 저장됨

예시 구문 (정보 누출 방지):

가정: 웹 애플리케이션에서 민감한 사용자 정보를 해시 함수를 사용하여 저장하는 경우를 가정합니다.

$user_id = $_POST['user_id'];
$user_password = password_hash($_POST['user_password'], PASSWORD_BCRYPT);
$query = "INSERT INTO users (id, password) VALUES ('$user_id', '$user_password')"; // 안전한 방식으로 민감한 정보가 저장됨

위의 예시 코드에서는 정보 누출 취약점과 정보 누출 방지 방법을 나타내고 있습니다.

10. 악성 콘텐츠(CS)

점검 내용:

악성 콘텐츠 점검은 웹 애플리케이션에서 사용자에게 제공되는 콘텐츠(이미지, 링크, 파일 등)에 악성 코드나 스크립트가 포함되지 않도록 하는 것을 의미합니다. 악성 콘텐츠는 사용자의 기기나 시스템에 해를 입힐 수 있는 악의적인 코드를 포함할 수 있습니다.

점검 목적:

  • 사용자 보호: 악성 콘텐츠 점검을 통해 사용자의 기기나 시스템을 보호하여 악성 코드 실행을 방지합니다.
  • 웹 서버 안전성 강화: 웹 애플리케이션에서 제공하는 모든 콘텐츠가 신뢰할 수 있는지 확인하여 웹 서버의 안전성을 강화합니다.

보안위협:

악성 콘텐츠는 다음과 같은 위험을 초래할 수 있습니다:

  • 악성 코드 실행: 사용자 기기에서 악성 코드가 실행되어 개인 정보 유출이나 시스템 침입이 발생할 수 있음
  • 피싱 시도: 사용자를 유인하여 개인 정보를 빼내거나 해킹 사이트로 유도할 수 있음

대상:

웹 애플리케이션에서 제공하는 모든 콘텐츠(이미지, 링크, 파일, 스크립트 등)

판단기준:

양호 (Good):

  • 모든 콘텐츠가 안전한 형식으로 제공되며, 악성 코드가 포함되어 있지 않은 경우

취약 (Vulnerable):

  • 악성 콘텐츠가 포함된 콘텐츠가 사용자에게 제공되는 경우

조치방법:

  1. 입력 검증: 사용자 입력을 콘텐츠에 포함하기 전에 검증하여 악성 코드가 포함되지 않도록 합니다.
  2. 이스케이프 처리: 콘텐츠에 사용되는 데이터가 안전하게 이스케이프 처리되어 스크립트가 실행되지 않도록 합니다.
  3. 웹 방화벽: 웹 애플리케이션 방화벽을 사용하여 악성 콘텐츠의 감지와 차단을 수행합니다.

예시 구문 (악성 콘텐츠 취약점):

가정: 웹 애플리케이션에서 사용자 입력을 검증 없이 콘텐츠에 포함하는 경우를 가정합니다.

<img src="<?php echo $_GET['user_input']; ?>" />

예시 구문 (악성 콘텐츠 방지):

가정: 웹 애플리케이션에서 사용자 입력을 검증하고 이스케이프 처리하여 콘텐츠에 포함하는 경우를 가정합니다.

<?php
$user_input = htmlspecialchars($_GET['user_input'], ENT_QUOTES, 'UTF-8');
?>
<img src="<?php echo $user_input; ?>" />

위의 예시 코드에서는 악성 콘텐츠 취약점과 악성 콘텐츠 방지 방법을 나타내고 있습니다.

이것으로 이번 포스팅 글에서는 1번부터 10번 웹 취약점 점검 항목에 따른 상세 개요와 판단기준, 점검 목적, 조치 방법, 예시 구문까지 알아보았습니다.
다음 포스팅 글에서는 이어 11번 부터 20번 웹 취약점 점검 항목에 대해 상세히 기술하겠습니다.
감사합니다.

[Reference]
1. KISA 한국인터넷진흥원>지식플랫폼>법령·가이드라인>가이드라인>보안취약점 및 침해사고 대응
2. Guide to Web Application Penetration Testing — TechMagic

[관련글] 
1. 취약점 | Tech Hyeonker

댓글 남기기