🛡️ 보안기능 결정에 사용되는 부적절한 입력값 - 실습 시뮬레이터

CWE-807: Reliance on Untrusted Inputs in a Security Decision

✅ 학습 진행도
  • 진단 시작
  • 취약점 식별(파라미터 신뢰)
  • 세션 기반 검증 적용
✏️ Java 코드 에디터 취약한 코드
AdminController.java 💡 request.getParameter가 아닌 session에서 권한을 확인하세요.
public void deleteUser(HttpServletRequest request) {
    // [취약한 코드] 외부 입력값인 "role" 파라미터를 그대로 신뢰하여 보안 결정 수행
    // 공격자가 URL에 ?role=admin 을 추가하여 접근 시 권한 우회 가능
    String role = request.getParameter("role");
    
    if (role != null && role.equals("admin")) {
        // 관리자 기능 수행
        userService.deleteUser(request.getParameter("userId"));
    }
}
💡 수정 가이드 (KISA 가이드)
1. 세션 기반 검증

클라이언트가 보낸 파라미터 대신, 로그인 시 서버 세션에 저장된 권한 정보를 사용해야 합니다.

HttpSession session = request.getSession(); String role = (String) session.getAttribute("role"); if (role != null && role.equals("admin")) { // 기능 수행 }
📊 분석 결과 및 설명
🎯 목표

인증, 인가 등 보안 결정 로직에서 클라이언트가 조작 가능한 쿠키, 파라미터 값을 직접 사용하지 않고 서버 측 세션 정보를 신뢰해야 합니다.

⚠️ 현재 취약점

Improper Input for Security Decision

공격자가 파라미터를 변조하여 관리자 권한을 획득하거나 인증을 우회할 수 있습니다.

✅ 학습 진행도
  • 진단 시작
  • 요청 변조 가능성 식별
  • Session 사용 적용
🐍 Python 코드 에디터 취약한 코드
admin_view.py (Flask) 💡 request.args 대신 session 객체를 사용하세요.
from flask import request, session, abort

def delete_post():
    # [취약한 코드] URL 파라미터로 넘어온 is_admin 값을 신뢰함
    # 공격자가 /delete_post?is_admin=true 로 접근 가능
    if request.args.get('is_admin') == 'true':
        # 삭제 로직 실행
        return "Deleted"
    return abort(403)
💡 수정 가이드
1. 서버 세션 활용

로그인 시 서버에 저장된 세션 정보를 통해 권한을 확인합니다.

if session.get('is_admin') == True: # 삭제 로직 실행 return "Deleted"
📊 분석 결과 및 설명
🎯 목표

파이썬 웹 프레임워크에서도 권한 검사는 반드시 변조 불가능한 서버 측 저장소(Session 등)를 기반으로 수행해야 합니다.

⚠️ 현재 취약점

Insecure Direct Object Reference (IDOR) / Security Decision

클라이언트가 전송하는 데이터는 언제든 조작될 수 있으므로 보안 결정의 근거로 사용해서는 안 됩니다.