✏️ 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)로 실행하고 있어 안전하지 않습니다.