XPath 인젝션

XPath Injection

설명

XPath 인젝션은 사용자 입력을 그대로 문자열로 이어붙여 XPath 표현식을 만들 때 발생합니다. 공격자는 따옴표('), 괄호, 논리 연산자(or, and) 등 특수 토큰을 삽입해 의도한 조건을 깨뜨리거나, 더 많은 노드를 선택하도록 표현식을 변경할 수 있습니다. 예를 들어 사용자명이 ' or '1'='1 같은 값을 넣으면 인증 조건을 항상 참으로 만들어 로그인 우회가 가능합니다. 또 contains(), starts-with() 같은 함수와 와일드카드를 악용하여 민감한 노드를 광범위하게 추출하거나, 복잡한 쿼리로 자원을 소모시킬 수 있습니다.

잠재적 영향

  • Authentication Bypass (인증 우회): 로그인 검증 XPath를 조작해 비밀번호 없이 계정에 접근할 수 있습니다.

  • Data Exposure (데이터 노출): 의도하지 않은 노드(예: 전체 사용자 목록, 권한 정보, 토큰 등)를 조회해 민감정보를 획득할 수 있습니다.

  • Authorization Bypass (권한 검증 우회): 접근 제어용 XPath 필터를 무력화하여 비인가 리소스를 읽거나 내부 구조를 열람할 수 있습니다.

  • Denial of Service (서비스 거부): 매우 비용이 큰 XPath 함수/패턴을 주입하여 XML 처리기의 CPU/메모리를 과도하게 사용하게 만들 수 있습니다.

해결 방법

  • 변수 바인딩 사용: XPath 표현식은 상수로 두고 값은 변수($user, $pass 등)로 바인딩합니다. javax.xml.xpath의 XPath#setXPathVariableResolver 또는 dom4j의 VariableContext를 사용합니다.

  • 문자열 결합 금지: '...'+input+'...' 형태로 사용자 입력을 XPath 문자열에 직접 삽입하지 않습니다.

  • 입력 검증/정규화: 허용 목록 기반 검증(영문/숫자, 길이 제한 등)을 적용하고, 필요한 경우 특수문자 이스케이프를 적용합니다.

  • 사전 컴파일: 자주 쓰는 표현식은 미리 컴파일하고 런타임에는 변수 값만 바인딩합니다.

  • 최소 데이터 노출: XML 구조를 노출하지 말고, 쿼리 결과를 필요한 필드만 반환하도록 제한합니다.

  • 모니터링과 타임아웃: XML/XPath 처리에 타임아웃, 요청 크기 제한을 걸고 비정상 패턴을 로깅/차단합니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 사용자 입력(u, p)을 따옴표로 감싸 단순 문자열 결합으로 XPath를 만들었습니다. 공격자가 ' or '1'='1 같은 토큰을 주입하면 조건식이 변경되어 인증 우회나 과도한 결과 조회가 가능합니다.

  • 안전한 코드: 표현식은 상수로 고정하고 XPathVariableResolver로 값을 변수($user, $pass)에 바인딩하여, 입력이 항상 리터럴 값으로 처리되도록 했습니다. 추가로 허용 목록 기반 검증으로 입력 범위를 제한해 악성 토큰 주입 가능성을 더 줄였습니다.

참조

Last updated