📡 HTTP 응답분할 - 실습 시뮬레이터

CWE-113: Improper Neutralization of CRLF Sequences in HTTP Headers

✅ 학습 진행도
  • 진단 시작
  • CRLF 취약점 식별
  • 개행문자 제거 적용
✏️ Java 코드 에디터 취약한 코드
HeaderController.java 💡 replaceAll을 사용하여 \r, \n을 빈 문자열로 치환하세요.
public void setCookie(HttpServletRequest req, HttpServletResponse res) {
    String author = req.getParameter("author");
    
    // [취약한 코드] 입력값을 검증 없이 헤더에 포함
    // 공격자가 "user\r\nSet-Cookie: session=hacked" 입력 가능
    res.setHeader("Author", author);
}
💡 수정 가이드 (KISA 가이드)
1. 개행 문자(CRLF) 제거

헤더에 포함될 입력값에서 \r, \n 문자를 제거하여 응답 분할을 방지합니다.

if (author != null) { author = author.replaceAll("\\r", "").replaceAll("\\n", ""); res.setHeader("Author", author); }
📊 분석 결과 및 설명
🎯 목표

HTTP 응답 헤더에 사용자 입력값을 포함할 때, 개행 문자를 이용해 악의적인 헤더나 본문을 주입하지 못하도록 해야 합니다.

⚠️ 현재 취약점

HTTP Response Splitting

공격자가 헤더를 조작하여 캐시를 오염시키거나 XSS 공격 코드를 삽입할 수 있습니다.

✅ 학습 진행도
  • 진단 시작
  • 헤더 조작 위험 식별
  • CRLF 필터링 적용
🐍 Python 코드 에디터 취약한 코드
server.py (WSGI) 💡 replace() 함수로 \r과 \n을 제거하세요.
def application(environ, start_response):
    # [취약한 코드] 외부 입력값을 그대로 헤더에 사용
    custom_header = environ.get('QUERY_STRING', '')
    
    headers = [('Content-type', 'text/plain'), ('Custom', custom_header)]
    start_response('200 OK', headers)
    return [b"Hello World"]
💡 수정 가이드 (파이썬 가이드)
1. 개행 문자 제거

헤더 값으로 사용하기 전에 replace 함수를 통해 개행 문자를 제거합니다.

custom_header = custom_header.replace('\r', '').replace('\n', '') headers = [('Content-type', 'text/plain'), ('Custom', custom_header)]
📊 분석 결과 및 설명
🎯 목표

파이썬 웹 애플리케이션에서도 헤더 주입을 방지하기 위해 입력값 정제(Sanitization)가 필요합니다.

⚠️ 현재 취약점

CRLF Injection

개행 문자를 포함한 입력값으로 HTTP 응답 헤더를 분리하여 가짜 응답을 전달할 수 있습니다.