작업 환경

  • VMware Workstation Pro (17.6.2 ver)
  • Server 
    • Web 서버 : Rocky_Linux(8.10 ver, VMnet 2, PHP로 구성)
    • DNS 서버 : Rocky_Linux(8.10 ver, VMnet 1)
  • Client
    • Kali Linux : Web 취약점 점검용 (VMnet 1)
  • GNS 구성

  • 해당 점검은 웹하드 페이지에 한해서 진행됨
FU (상) 22. 파일 업로드
취약점 개요
점검 내용 웹 사이트의 게시판, 자료실 등에 조작된 Server Side Script 파일 업로드 및 실행 가능 여부 점검
점검 목적 업로드되는 파일의 확장자에 대한 적절성 여부를 검증하는 로직을 통해 공격자가 조작된
Server Side Script 파일 업로드 방지 및 서버상에 저장된 경로를 유추하여 해당
Server Side Script 파일 실행을 불가능하게 하기 위함
 보안 위협 해당 취약점이 존재할 경우 공격자는 조작된 Server Side Script 파일을 서버에 업로드 및 실행하여
시스템 관리자 권한 획득 또는 인접 서버에 대한 침입을 시도할 수 있음
판단 기준

양호 : 업로드되는 파일에 대한 확장자 검증이 이루어지는 경우
취약 : 업로드되는 파일에 대한 확장자 검증이 이루어지지 않는 경우
참고 OWASP TOP 10 항목 중 
A01 : Broken Access Control
A04 : Insecure Design

A05 : Security Misconfiguration
에 해당한다고 판단

 

 

점검 방법

  • Step 1) 웹 사이트에 파일 업로드 기능이 존재하는 경우, 확장자가 jsp, php, asp, cgi 등 Server Side Script 파일들이 업로드 가능한지 확인
  • Step 2) 웹 사이트에 있는 디렉터리 정보를 이용하여 첨부한 Server Side Script 파일의 위치를 조사한 후 브라우저 주소창에 해당 경로를 입력하여 실행 가능한지 확인
  • Step 3) 페이지의 모든 기능을 수집하여 프로세스 상에 통제된 페이지 접근이 가능한지 확인

 

 


보안 설정 방법

※ 사용자가 파일을 업로드할 수 있는 모든 모듈에 적용 필요

  • 화이트 리스트 방식으로 허용된 확장자만 업로드 가능토록 서버 측 통제 적용
  • 업로드되는 파일을 디렉터리에 저장할 때 파일명과 확장자를 외부 사용자가 추측할 수 없는 문자열로 변경하여 저장(파일 이름은 DB에 저장)
  • 업로드 파일을 위한 전용 디렉터리를 별도로 생성하여 웹 서버 데몬 설정 파일(httpd.conf 등)에서 실행 설정을 제거함으로써, Server Side Script가 업로드되더라도 웹 엔진이 실행하지 않는 환경을 설정함
  • 파일 업로드 필드를 대상으로 특수문자 필터링하도록 웹 방화벽 룰셋 적용

 

PHP

  • Step 1) 수용 가능한 파일의 확장자만 업로드 허용(Positive 방식)
    • 이미지 파일의 경우 (JPG, GIF, BMP 등)
    • 문서 파일의 경우 (XLS, PDF, PPT, DOC 등)

 

설정 1) .doc, .hwp, .pdf, .jpg 파일만 업로드할 수 있게 설정

/var/www/html/proc/up_file.php <- 업로드 처리하는 파일 수정

$allowed_ext = ['doc', 'hwp', 'pdf', 'jpg'];
$ext = strtolower(pathinfo($original_name, PATHINFO_EXTENSION));

if (!in_array($ext, $allowed_ext)) {
    echo "<script>alert('허용되지 않은 파일 확장자입니다.'); history.back();</script>";
    exit;
}

  → 1차 보안 완성

 

설정 2) 업로드된 파일 이름을 랜덤으로 바꿔서 저장

/var/www/html/proc/up_file.php <- 업로드 처리하는 파일 수정

$server_name = uniqid('file_', true) . '.' . $ext;

  → index.php 같은 파일을 올리고 웹에서 실행하는 것 방지

 

설정 3) .htaccess로 업로드 되었더라도 실행 자체를 차단

/var/www/html/uploads/.htaccess

php_flag engine off
RemoveHandler .php .phtml

.php , .phtml 형식의 파일은 실행 불가 (텍스트로만 보임)

 

테스트

  • 설정 1) 을 적용
  • index.php 파일 업로드
<? php
HELLO
?>

 

index.php 업로드 시

허용되지 않은 확장자 .php 를 업로드 하여 파일 업로드 실패

 

만약 확장자를 위조한다면?

  • 설정1, 2) 를 적용
  • index.phpindex.php.pdf 로 위장하여 파일을 업로드한다면 업로드가 될까?
<? php
HELLO
?>

파일형식을 위조하여 업로드
업로드 시

 

위 결과로부터 MIME TYPE 확인이 필요한 이유를 알 수 있음

설정2) 의 설정에 의해 파일명이 변경되지만, 업로드 폴더로 접근이 가능할 시 파일명은 바꿀 수 있음

만약 설정3) 이 적용 되어있다면 파일은 업로드 되어도, 실행 권한은 없으므로 방어 가능

 

 

 

  • Step 2) MIME TYPE 확인을 통한 실행 파일 업로드 차단 로직 추가
/var/www/html/proc/up_file.php <- 업로드 처리하는 파일 수정

// MIME 타입 허용 리스트
$allowed_mime = [
    'application/msword',
    'application/pdf',
    'image/jpeg',
    'application/x-hwp',
    'application/octet-stream'  // 일부 .hwp 용도
];


// 확장자 검사
$ext = strtolower(pathinfo($original_name, PATHINFO_EXTENSION));
if (!in_array($ext, $allowed_ext)) {
    echo "<script>alert('허용되지 않은 확장자입니다.'); history.back();</script>";
    exit;
}

// MIME 타입 검사
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $tmp);
finfo_close($finfo);

if (!in_array($mime, $allowed_mime)) {
    echo "<script>alert('MIME 타입이 일치하지 않습니다.'); history.back();</script>";
    exit;
}

 

 

테스트

  • 위에서 테스트한 동일한 파일(index.php.pdf) 업로드
<? php
HELLO
?>

 

업로드 시

 

Header 부분이 PDF 형식과 달라 필터링된 모습

 


참고

📌 MIME 타입이란 ?

파일의 “실제 내용”이 어떤 종류인지 설명하는 표준 식별자

  • MIME : Multipurpose Internet Mail Extensions
  • 파일의 헤더를 기준으로 판단

 

MIME 정리

파일 이름 확장자 MIME 타입
report.pdf .pdf application/pdf
photo.jpg .jpg image/jpeg
resume.hwp .hwp application/x-hwp
script.php .php application/x-httpd-php 또는 text/plain
virus.exe .exe application/x-msdownload

 

 

왜 중요한가?

사용자가 확장자를 위장할 수 있음

nice_picture.jpg.exe
evil.php.txt

 

OS나 브라우저는 가장 마지막 . 뒤의 문자열만 확장자로 인식하여 확장자를 속일 수 있음

→ 공격자가 업로드 디렉터리에서 .php로 리네임하거나 .htaccess 우회로 실행 시도 가능하여 취약점 존재

파일명 인식되는 확장자
evil.php.txt .txt 
invoice.pdf.exe .exe 
cat.jpg .jpg 

 

 

파일 내용을 직접 읽어서 판단하는 MIME 타입 검사가 필요

→ PHP에서 finfo_file( ) 로 검사하는 MIME 타입은 파일의 시작 바이트(Header) 를 기준으로 판단

→ PDF 파일은 %PDF- 로시작, JPG 는 ÿØÿà 로 시작

→ 파일 내용도 PDF 헤더와 비슷하게 조작된 경우 MIME 타입 검사도 우회할 수 있음

 

.htaccess 파일에서 확장자에 따른 실행 권한을 차단 (총 3단계 방어)

/var/www/html/uploads/.htaccess

php_flag engine off
RemoveHandler .php .phtml

 

 

 

🔐 OWASP TOP 10(2021)과의 연관

OWASP Top 10 공식 문서 일부

A01:2021 – Broken Access Control
"Uploaded files represent a significant risk to applications. The first step in many attacks is to get some code to the system to be attacked. Then the attack only needs to find a way to get the code executed."

A04:2021 – Insecure Design
"Insecure design is a broad category representing different weaknesses, expressed as ‘missing or ineffective control design.’ It is different from insecure implementation. One is a design flaw, the other is a failure to implement the design. There is a need for more threat modeling, secure design patterns and principles, and reference architectures."

A05:2021 - Security Misconfiguration
"Security misconfiguration is the most commonly seen issue. This is commonly a result of insecure default configurations, incomplete or ad hoc configurations, open cloud storage, misconfigured HTTP headers, and verbose error messages containing sensitive information. Not only must all operating systems, frameworks, libraries, and applications be securely configured, but they must be patched and upgraded in a timely fashion."

 

1. A01 : Broken Access Control

  • 파일 업로드 기능에서 사용자 인증 없이 접근이 가능하거나, 업로드된 파일에 대한 접근 제어가 부족한 경우
  • 즉, 권한이 없는 사용자가 시스템 자원에 접근하거나 조작

2. A04 : Insecure Design

  • 파일 업로드 기능에서 확장자나 MIME 타입 검증이 부족하여, 악성 파일이 업로드될 수 있는 구조적인 문제

3. A05 : Security Misconfiguration

  • 업로드 디렉토리에 .htaccess 파일이 없거나, 실행 권한이 제대로 설정되지 않아 악성 스크립트가 실행될 수 있는 경우

작업 환경

  • VMware Workstation Pro (17.6.2 ver)
  • Server 
    • Web 서버 : Rocky_Linux(8.10 ver, VMnet 2, PHP로 구성)
    • DNS 서버 : Rocky_Linux(8.10 ver, VMnet 1)
  • Client
    • Kali Linux : Web 취약점 점검용 (VMnet 1)
  • GNS 구성

  • 해당 점검은 비밀번호 수정 페이지, 게시글 페이지에 한해서 진행됨
SE (상) 16. 세션 예측
취약점 개요
점검 내용 인증이 필요한 웹 사이트의 중요(관리자 페이지, 회원변경 페이지 등) 페이지에 대한 접근제어 설정 여부 확인
점검 목적 인증이 필요한 모든 페이지에 대해 유효 세션임을 확인하는 프로세스 및 주요 정보 페이지에
접근 요청자의 권한 검증 로직을 적용하여, 비인가자가 하위 URL 직접 접근, 스크립트 조작 등의 방법으로
중요한 페이지에 접근을 시도하는 것을 차단하기 위함
 보안 위협 인증이 필요한 웹 사이트의 중요(관리자 페이지, 회원변경 페이지 등) 페이지에 대한 접근 제어가 미흡할 경우
하위 URL 직접 접근, 스크립트 조작 등의 방법으로 중요한 페이지에 대한 접근이 가능함
판단 기준

양호 : 인증 후에 접근해야 하는 웹 사이트의 하위 URL을 로그인하지 않고 직접 접근할 때 접근이 불가능한 경우
취약 : 웹 사이트의 하위 URL을 로그인하지 않고 직접 접근할 때 접근이 가능한 경우
참고 OWASP TOP 10 항목 중 
A04 : Insecure Design
에 해당한다고 판단

 

 

점검 방법

  • Step 1) 업무프로세스 파악
  • Step 2) 권한의 종류 및 범위 파악
  • Step 3) 페이지의 모든 기능을 수집하여 프로세스 상에 통제된 페이지 접근이 가능한지 확인

 

1. 로그인 없이 게시글 작성하는 경우

 

2. 로그인 없이 댓글을 작성하는 경우

 

3. 로그인 없이 비밀번호 변경하는 경우

 

 


보안 설정 방법

  • 우회될 수 있는 플로우를 차단하여야 하며, 페이지별 권한 매트릭스를 작성하여 페이지에 부여된 권한의 타당성을 체크한 후 권한 매트릭스를 기준으로 전 페이지에서 권한 체크가 이뤄지도록 구현하여야 함
  • 인증이 필요한 모든 페이지에 대해 유효 세션임을 확인하는 프로세스 및 주요 정보 페이지에 접근 요청자의 권한 검증 로직을 적용함
  • 유효 세션의 검증 및 페이지에 대한 접근 권한을 Client Side Script에 의존할 경우 사용자가 임의로 수정할 수 있으므로 Server Side Script로 구현된 프로세스를 사용

참고

🔐 OWASP TOP 10(2021)과의 연관

OWASP Top 10 공식문서 일부
"Insecure design is a broad category representing different weaknesses, expressed as 'missing or ineffective control design.'"

1. A03: Insecure Design

  • 프로세스 검증 누락 : 애플리케이션의 보안 설계가 부족하거나 부적절하게 구현된 경우
  • 입력 값 검증 부족 : 사용자 입력에 대한 유효성 검사가 없거나 부적절하여, 악의적인 입력이 시스템에 전달
  • 비즈니스 로직 검증 누락 : 특정 프로세스나 기능에 대한 접근 제한이 없어, 권한이 없는 사용자가 이를 악용

 

🛡️ 방어 방법

  • 입력 값 검증 강화: 모든 사용자 입력에 대해 서버 측에서 유효성 검사를 수행하여, 예상치 못한 입력이 시스템에 영향을 미치지 않도록 함
  • 상태 관리 구현: 사용자 세션 및 애플리케이션 상태를 적절하게 관리하여, 예기치 않은 동작이나 보안 취약점을 방지

작업 환경

  • VMware Workstation Pro (17.6.2 ver)
  • Server 
    • Web 서버 : Rocky_Linux(8.10 ver, VMnet 2, PHP로 구성)
    • DNS 서버 : Rocky_Linux(8.10 ver, VMnet 1)
  • Client
    • Kali Linux : Web 취약점 점검용 (VMnet 1)
  • GNS 구성

  • 해당 점검은 비밀번호 수정 페이지에 한해서 진행됨
AU (상) 20. 자동화 공격
취약점 개요
점검 내용 웹 애플리케이션의 특정 프로세스(로그인 시도, 게시글 등록, SMS 발송 등)에 대한
반복적인 요청 시 통제 여부 확인
점검 목적 무차별 대입 공격 및 자동화 공격으로 웹 애플리케이션에 자원이 고갈되는 것을 방지하기 위함
 보안 위협 웹 애플리케이션의 특정 프로세스에 대한 반복적인 요청을 통제하지 않을 경우 무차별 대입 공격으로
인해 사용자 계정을 탈취할 수 있고, 자동화 공격으로 게시글 등록 또는 SMS 발송 요청을 반복하여
웹 애플리케이션 자원을 고갈시킬 수 있음
판단 기준

양호 : 웹 애플리케이션의 특정 프로세스에 대한 반복적인 요청 시 통제가 적절한 경우
취약 : 웹 애플리케이션의 특정 프로세스에 대한 반복적인 요청 시 통제가 미흡한 경우
참고 OWASP TOP 10 항목 중 
A07 : Identification and Authentication Failures
에 해당한다고 판단

 

 

점검 방법

  • Step 1) 로그인 시도, 게시글 등록, SMS 발송 등에 대한 정상적인 요청 정보를 식별하여 반복적으로 요청 시 통제가 이루어지는지 확인

 


보안 설정 방법

  • 로그인 시도, 게시글 등록, SMS 발송 등에 대한 사용자 요청이 일회성이 될 수 있도록, 캡차(이미지를 이용하여 확인 값을 표시하고 사용자가 값을 등록하여 인증함) 등 일회성 확인 로직을 구현하여야 함
  • 캡차(CAPTCHA): 자동화된 컴퓨터와 사람을 판별하기 위한 기술의 일종
  • 자동화 공격을 시도하면 짧은 시간에 다량의 패킷(양)이 전송되므로 이를 공격으로 감지하고 방어할 수 있는 IDS/IPS 시스템을 구축하여야 함
  • 서버에 요청되는 패킷(양)의 모니터링이 불가능한 경우 적시에 적절한 대응이 어려움

 


참고

🔐 OWASP TOP 10(2021)과의 연관

OWASP Top 10 공식문서 중 일부
"Limit or increasingly delay failed login attempts, but be careful not to create a denial of service scenario. Log all failures and alert administrators when credential stuffing, brute force, or other attacks are detected."

1. A07 : Identification and Authentication Failures

  • 브루트 포스(Brute Force): 모든 가능한 비밀번호 조합을 시도하여 계정을 탈취
  • 크리덴셜 스터핑(Credential Stuffing): 유출된 사용자 자격 증명을 이용하여 대량의 계정에 로그인 시도

 

🛡️ 방어 방법

  1. 로그인 시도 제한 및 지연: 실패한 로그인 시도에 대해 점진적인 지연을 적용하거나 시도 횟수를 제한
  2. 다단계 인증(MFA): 추가적인 인증 수단을 도입하여 계정 보안을 강화
  3. 보안 로그 기록 및 분석: 모든 인증 관련 활동을 기록하고 정기적으로 분석하여 이상 징후를 탐지

 

작업 환경

  • VMware Workstation Pro (17.6.2 ver)
  • Server 
    • Web 서버 : Rocky_Linux(8.10 ver, VMnet 2, PHP로 구성)
    • DNS 서버 : Rocky_Linux(8.10 ver, VMnet 1)
  • Client
    • Kali Linux : Web 취약점 점검용 (VMnet 1)
  • GNS 구성

  • 해당 점검은 비밀번호 수정 페이지에 한해서 진행됨
SF (상) 19. 세션 고정
취약점 개요
점검 내용 사용자 로그인 시 항상 일정하게 고정된 세션 ID 값을 발행하는지 여부 확인
점검 목적 로그인할 때마다 예측 불가능한 새로운 세션 ID를 발행하여 세션 ID의 고정 사용을 방지하기 위함
 보안 위협 사용자 로그인 시 항상 일정하게 고정된 세션 ID가 발행되는 경우 세션 ID를 도용한
비인가자의 접근 및 권한 우회가 가능
판단 기준

양호 : 로그인할 때마다 예측 불가능한 새로운 세션 ID가 발행되고, 기존 세션 ID는 파기될 경우
취약 : 로그인 세션 ID가 고정 사용되거나 새로운 세션 ID가 발행되지만 예측 가능한 패턴으로 발행될 경우
참고 OWASP TOP 10 항목 중 
A07 : Identification and Authentication Failures
에 해당한다고 판단

 

 

점검 방법

  • Step 1) 로그인 시(1) 세션 ID가 발행되는지 확인하고 로그아웃 후 다시 로그인(2)할 때 예측 불가능한 새로운 세션 ID가 발급되는지 확인

 

아래 링크의 ②, ③ 참고

 

2025.05.13 - [주요정보통신기반시설가이드/Web 취약점 점검] - [SE (상)] 16. 세션 예측

 

[SE (상)] 16. 세션 예측

작업 환경VMware Workstation Pro (17.6.2 ver)Server Web 서버 : Rocky_Linux(8.10 ver, VMnet 2, PHP로 구성)DNS 서버 : Rocky_Linux(8.10 ver, VMnet 1)ClientKali Linux : Web 취약점 점검용 (VMnet 1)GNS 구성해당 실습은 비밀번호 수정

jijibae.tistory.com

 

 


보안 설정 방법

  • 로그인할 때마다 예측 불가능한 새로운 세션 ID를 발급받도록 해야 하고 기존 세션 ID는 파기해야 함

참고

🔐 OWASP TOP 10(2021)과의 연관

OWASP TOP 10 공식 문서중 일부
"Notable CWEs included are CWE-297: Improper Validation of Certificate with Host Mismatch, CWE-287: Improper Authentication, and CWE-384: Session Fixation."

 

1. A07:  Identification and Authentication Failures

  • 사용자가 로그인한 후에도 세션 ID가 변경되지 않으면, 공격자가 미리 설정한 세션 ID를 통해 사용자의 세션을 탈취할 수 있음