💉 코드 삽입 (Code Injection) - 실습 시뮬레이터

CWE-94: Improper Control of Generation of Code ('Code Injection')

✅ 학습 진행도
  • 진단 시작
  • 취약한 eval 인지
  • 정규식(matches) 검증 적용
✏️ Java 코드 에디터 취약한 코드
CodeInjectionController.java 💡 정규식을 이용해 특수문자 입력 시 예외를 발생시키세요
import javax.script.*;
import org.springframework.web.bind.annotation.*;

public class CodeInjectionController {
    @RequestMapping(value = "/execute", method = RequestMethod.GET)
    public String execute(@RequestParam("src") String src) throws ScriptException {
        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
        
        // [취약점] 외부 입력값인 src를 javascript eval 함수로 실행하고 있어 안전하지 않다.
        String retValue = (String)scriptEngine.eval(src);
        return retValue;
    }
}
💡 수정 가이드 (정규식 필터링)
1. 정규식을 이용한 특수문자 검증

입력 값의 형태에 따라 정규 표현식을 적용하여 검증합니다.

// 정규식을 이용하여 특수문자 입력시 예외를 발생시킨다. if (src.matches("[\\w]*") == false) { throw new IllegalArgumentException(); }
💡 수정 가이드 (화이트리스트)
2. 유효한 문자만 허용 (WhiteList)

화이트리스트 방식을 적용하여 유효한 문자인 경우에만 실행합니다.

// 유효한 문자 "_" 일 경우 실행할 메소드 호출한다. if (src.matches("UNDER_BAR") == true) { // ... // 유효한 문자 "$" 일 경우 실행할 메소드 호출한다. } else if (src.matches("DOLLAR") == true) { // ... // 유효하지 않은 특수문자 입력시 예외를 발생시킨다. } else { throw new IllegalArgumentException(); }
📊 분석 결과 및 설명
🎯 목표

사용자의 입력을 ScriptEngineManager로 실행하고 있습니다. 공격자는 조작된 인수를 이용해 시스템 명령어를 실행하거나 파일을 조작할 수 있습니다. 입력 값을 필터링하여 사전에 검증하는 코드를 추가하세요.

⚠️ 현재 취약점

Dynamic Code Execution

외부 입력값인 src를 검증 없이 scriptEngine.eval(src)로 실행하고 있어 안전하지 않습니다.

✅ 학습 진행도
  • 진단 시작
  • eval() 위험성 파악
  • isalnum() 검증 추가
🐍 Python 코드 에디터 취약한 코드
views.py 💡 입력값이 영문/숫자인지 확인하는 isalnum()을 사용하세요
from django.shortcuts import render

def route(request):
    # 외부에서 입력받은 값을 검증 없이 사용하면 안전하지 않다
    message = request.POST.get('message', '')
    
    # 외부 입력값을 검증 없이 eval 함수에 전달할 경우 의도하지 않은 코드가
    # 실행될 수 있어 위험하다
    ret = eval(message)
    
    return render(request, '/success.html', {'data':ret})
💡 수정 가이드
1. 입력값 검증 (isalnum)

사용자 입력을 영문, 숫자로 제한하여 특수문자가 포함된 경우 에러를 반환합니다.

if message.isalnum(): ret = eval(message) return render(request, '/success.html', {'data':ret}) return render(request, '/error.html')
📊 분석 결과 및 설명
🎯 목표

외부 입력값을 검증 없이 eval()에 사용하면 파이썬 코드를 통한 악성 기능 실행이 가능합니다. 예: compile('import time; time.sleep(20)', ...) 등을 통한 서비스 거부 공격.

⚠️ 현재 취약점

Code Injection (CWE-94)

입력값 message를 검증 없이 eval()로 실행하고 있어 공격자가 시스템 명령어를 실행하거나 라이브러리를 로드할 수 있습니다.