📤 위험한 형식 파일 업로드 - 실습 시뮬레이터

CWE-434: Unrestricted Upload of File with Dangerous Type

✅ 학습 진행도
  • 진단 시작
  • 웹쉘 업로드 위험 식별
  • 화이트리스트 검증 적용
✏️ Java 코드 에디터 취약한 코드
UploadController.java 💡 허용된 확장자(jpg, png 등)인지 확인하세요
public void upload(FileItem item) throws Exception {
    String fileName = item.getName();
    
    // [취약한 코드] 확장자 검증 없이 파일을 서버에 저장
    // 공격자가 'shell.jsp'를 업로드하면 실행 가능
    File file = new File("/uploads/" + fileName);
    item.write(file);
}
💡 수정 가이드 (KISA 가이드 기준)
1. 확장자 화이트리스트 검증

파일명에서 확장자를 추출하여 허용된 확장자(예: jpg, png) 목록에 있는지 확인합니다.

String ext = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); if (!"jpg".equals(ext) && !"png".equals(ext)) { throw new SecurityException("Not allowed extension"); }
📊 분석 결과 및 설명
🎯 목표

악성 스크립트 파일(.jsp, .php, .asp)이 업로드되어 서버에서 실행되는 것을 방지하기 위해 파일의 형식과 확장자를 엄격히 제한해야 합니다.

⚠️ 현재 취약점

Unrestricted File Upload

파일 형식에 대한 제한이 없어 웹쉘 업로드를 통한 시스템 장악이 가능합니다.

✅ 학습 진행도
  • 진단 시작
  • 파일명 검증 부재 확인
  • secure_filename 적용
🐍 Python 코드 에디터 취약한 코드
app.py 💡 허용 확장자 확인 및 secure_filename을 사용하세요
import os
from flask import request

def upload_file():
    file = request.files['file']
    if file:
        # [취약한 코드] 클라이언트가 보낸 파일명을 그대로 사용
        # ../hack.py 와 같은 파일명으로 경로 조작 가능
        file.save(os.path.join('/uploads', file.filename))
💡 수정 가이드 (Python 가이드 기준)
1. secure_filename 및 확장자 체크

Werkzeug의 secure_filename 함수와 확장자 화이트리스트를 사용합니다.

from werkzeug.utils import secure_filename if '.' in file.filename and file.filename.rsplit('.', 1)[1].lower() in {'png', 'jpg'}: filename = secure_filename(file.filename) file.save(os.path.join('/uploads', filename))
📊 분석 결과 및 설명
🎯 목표

업로드되는 파일의 이름과 확장자를 서버 측에서 엄격하게 통제하여 악성 파일 업로드를 차단해야 합니다.

⚠️ 현재 취약점

Path Traversal & Unrestricted Upload

파일명을 검증하지 않아 상위 경로에 파일을 저장하거나 악성 확장자를 가진 파일을 저장할 수 있습니다.