주통기반 - XPath Injection

황인환·2024년 8월 13일

정의

  • 입력값을 통해 악의적인 XPath 쿼리를 주입하여 데이터베이스를 조작하거나 민감한 정보를 탈취하는 웹 보안 취약점입니다.

원인

  • 사용자 입력의 검증 부족: 사용자 입력값을 SQL 쿼리에 직접 포함하여 실행할 때, 입력값을 제대로 검증하지 않습니다.

  • 불완전한 쿼리 파라미터화: XPath 쿼리에서 placeholder를 사용하여 사용자 입력값을 바인딩하지 않고 직접 쿼리에 포함시키는 경우 취약점이 발생합니다.

위협

  • 해당 취약점이 존재하는 경우 비정상적인 XPath쿼리로 XML 데이터 유출, 데이터 변조, 인증 우회, 데이터 무결성 해칠 수 있습니다.

TEST방법

  • ' or '1' ='1(참)입력 ' or '1' ='2(거짓)입력으로 참 거짓 값의 결과가 다르게 나타나는지 확인

  • 입력해서 에러가 발생하는지 확인
    ' or count(parent::*[position()=1])=0 or 'a'='b
    ' or count(parent::*[position()=1])>0 or 'a'='b
    1 or count(parent::*[position()=1])=0
    1 or count(parent::*[position()=1])>0

  • count(parent::*[position()=1])=0해석

    구성요소설명
    parent::*현재 노드의 부모 노드를 선택합니다
    [position()=1]부모 노드의 첫 번째 위치를 선택합니다
    count(...)선택된 노드의 수를 계산합니다.
    count(parent::*[position()=1])=0부모 노드가 존재하지 않거나, 첫 번째 부모 노드의 수가 0인 경우 참으로 평가됩니다.
    • 노드는 HTML 태그와 유사한 기능을하는 XML 구성요소

공격시나리오

  1. XML데이터를 사용할 만한 곳에 TEST 합니다.

  2. 만약 참거짓 TEST의 결과가 다르게 나타나거나 에러가 발생하면 아래 쿼리를 사용합니다.
    2.1 민감한 데이터 유출
    사용자 목록 조회: input_username(입력값)' or '1'='1
    관리자 계정정보 추출: admin' or '1'='1
    2.2 인증 우회
    인증 우회: ' or '1'='1' and password/text() = '
    모든 사용자 인증 우회: input_username(입력값)' and password/text() = '' or '1'='1

대상 & 판단기준 & 조치방법

설명
대상웹어플리케이션 소스코드, 웹 방화벽
판단기준양호 쿼리 입력 값에 대한 검증이 이루어지는 경우
취약 쿼리 입력 값에 대한 검증이 이루어지지 않는 경우
조치방법쿼리 입력 값에 대한 검증 로직 추가 구현

0개의 댓글