메뉴 건너뛰기

app

XML 검색의 맹점: CWE-643, CWE-652 XML 삽입 방어

suritam92026.01.17 18:37조회 수 0댓글 0

    • 글자 크기

1. XML 삽입 공격의 위험성

CWE-643과 CWE-652는 사용자가 입력한 데이터가 XML 문서를 조회하는 XPath 또는 XQuery 식에 필터링 없이 포함될 때 발생합니다. 공격자는 쿼리 구조를 조작하는 특수문자(', [, ], * 등)를 주입하여 원래는 접근할 수 없는 데이터에 접근하거나, 인증 절차를 무력화할 수 있습니다. 이는 SQL 삽입과 원리가 유사하지만, 대상이 데이터베이스가 아닌 서버 내의 XML 파일이나 XML 기반 DB라는 점이 다릅니다.

2. 흔히 발생하는 취약한 패턴

가장 대표적인 사례는 사용자 아이디와 비밀번호를 XML에서 조회하여 인증할 때, 입력값을 직접 문자열 결합(+)으로 쿼리문에 넣는 경우입니다. 공격자가 admin' or '1'='1과 같은 값을 주입하면, 쿼리는 항상 참(True)이 되어 비밀번호 없이도 관리자 권한으로 로그인할 수 있게 됩니다. 또한, //*와 같은 구문을 주입하여 XML 문서 전체의 기밀 정보를 화면에 노출시킬 수도 있습니다.

3. 실무적 대응: 매개변수화된 쿼리와 입력값 검증

가장 확실한 방어법은 쿼리의 구조와 데이터를 분리하는 것입니다.

매개변수화된 쿼리 사용: XPath 식을 문자열로 조립하지 말고, XPathVariableResolver 등을 사용하여 입력값을 변수로 바인딩하십시오. 이렇게 하면 입력값이 명령어로 해석되지 않습니다.

특수문자 필터링: 사용자 입력에서 XML 예약어(', ", &, <, >, /, (, ), [, ], =, @) 등을 사전에 필터링하거나 이스케이프 처리해야 합니다.

CWE-112 준수: 입력값이 기대하는 형식(예: 숫자만, 영문자만)인지 정규식을 통해 엄격히 검증하십시오.

4. CWE-643/652 대응 및 안전한 XML 조회 자바 코드 예시

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.xml.xpath.*;
import org.w3c.dom.Document;
import javax.xml.namespace.QName;
import java.util.HashMap;
import java.util.Map;
 
public class XmlSearchProcessor {
    private static final Logger logger = LoggerFactory.getLogger(XmlSearchProcessor.class);
 
    // [CWE-643/652 조치] XPathVariableResolver를 사용한 안전한 조회
    public boolean authenticateUser(Document doc, String userId, String password) {
        try {
            XPathFactory factory = XPathFactory.newInstance();
            XPath xpath = factory.newXPath();
 
            // 1. 매개변수 바인딩을 위한 리졸버 설정
            MapVariableResolver resolver = new MapVariableResolver();
            resolver.addVariable("userId", userId);
            resolver.addVariable("password", password);
            xpath.setXPathVariableResolver(resolver);
 
            // 2. 입력값이 직접 들어가지 않은 안전한 XPath 식
            String expression = "/users/user[id=$userId and pw=$password]";
            
            logger.debug("Executing secure XPath query for user: {}", userId);
 
            XPathExpression expr = xpath.compile(expression);
            Object result = expr.evaluate(doc, XPathConstants.NODE);
 
            return result != null;
 
        } catch (Exception e) {
            // [CWE-754, CWE-390] 예외 처리 및 로그 기록
            logger.debug("XPath processing error: {}", e.getMessage());
            return false;
        }
    }
}
 
// 사용자 정의 변수 리졸버 클래스
class MapVariableResolver implements XPathVariableResolver {
    private final Map<QName, Object> variables = new HashMap<>();
 
    public void addVariable(String name, Object value) {
        variables.put(new QName(name), value);
    }
 
    @Override
    public Object resolveVariable(QName variableName) {
        return variables.get(variableName);
    }
}

코멘트: XML은 단순한 설정 파일 이상의 중요한 데이터를 담는 그릇인 경우가 많습니다. SQL 삽입을 막기 위해 Prepared Statement를 쓰듯, XML 조회 시에도 반드시 매개변수화된 방식을 사용하십시오. logger.debug()로 조회 시도를 투명하게 기록하되, 공격자가 쿼리 식을 비틀어 시스템의 인증 체계를 무너뜨리지 못하게 방어하는 것이 시큐어 코딩의 핵심입니다.

 
    • 글자 크기
기업 인증 체계를 무너뜨리는 CWE-90 LDAP 삽입 방지 전략 (by suritam9) 서버 장악의 시작점: CWE-434 위험한 형식 파일 업로드 (by suritam9)

댓글 달기

첨부 (0)
위로