📋 전자금융기반시설 보안 취약점 평가기준 WEB-SER-015

평가항목: XML 외부객체 공격 (XXE - XML External Entity)
위험도: 5 (최고위험)
통제구분: 5.8.4 (일반공통) 서비스 보호
진단내용: XML 구문 분석기의 입력값 검증 누락으로 시스템 자원 접근 가능 여부 점검

XX은행

기업뱅킹 API 시스템

취약점: XML Parser 설정 미흡

계좌이체 XML API

B2B 기업고객 대량이체 서비스

모의해킹 시나리오

취약한 Java 코드
위험
// ❌ 취약한 XML Parser
DocumentBuilderFactory factory = 
    DocumentBuilderFactory.newInstance();

// External Entity 활성화 (기본)
DocumentBuilder builder = 
    factory.newDocumentBuilder();
    
Document doc = builder.parse(
    new InputSource(
        new StringReader(xmlInput)
    )
);

// 문제: XXE 공격 취약!

XML Parser 처리 과정

대기 중...

Server Response
대기중
Waiting for XML request...
안전한 Java 코드
권장
// ✅ 안전한 XML Parser 설정
DocumentBuilderFactory factory = 
    DocumentBuilderFactory.newInstance();

// 1. DOCTYPE 선언 차단
factory.setFeature(
    "http://apache.org/xml/features/" +
    "disallow-doctype-decl", true);

// 2. External Entities 비활성화
factory.setFeature(
    "http://xml.org/sax/features/" +
    "external-general-entities", false);

factory.setFeature(
    "http://xml.org/sax/features/" +
    "external-parameter-entities", false);

// 3. XInclude 비활성화
factory.setXIncludeAware(false);

// 4. Expand Entity 비활성화
factory.setExpandEntityReferences(false);

// 입력값 검증
if (xmlInput.contains("<!DOCTYPE") || 
    xmlInput.contains("<!ENTITY")) {
    throw new SecurityException(
        "DOCTYPE/ENTITY not allowed");
}

DocumentBuilder builder = 
    factory.newDocumentBuilder();
Document doc = builder.parse(
    new InputSource(
        new StringReader(xmlInput)
    )
);