본문 바로가기 ← 메인

💉 코드 삽입 (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()로 실행하고 있어 공격자가 시스템 명령어를 실행하거나 라이브러리를 로드할 수 있습니다.

📰 실제 사고사례 & 표준 매핑
2017년 Equifax 사고 — Apache Struts의 OGNL 코드 인젝션(CVE-2017-5638)으로 약 1.4억 명의 개인정보가 유출됐습니다.
🏷️ CWE-94 OWASP A03 Injection
※ 공개적으로 알려진 사례 기반 교육용 요약 · CWE/OWASP는 공개 표준 분류