XPath Injection이란?
데이터베이스와 연동된 웹 애플리케이션에서 XPath(XML Path Language) 및 XQuery 질의문에 대한 필터링이 제대로 이루어지지 않을 경우 공격자가 입력이 가능한 폼(웹 브라우저 주소입력창 또는 로그인 폼 등)에 조작된 질의문을 삽입하여 인증 우회를 통해 XML 문서로부터 인가되지 않은 데이터를 열람 할 수 있는 취약점이다.
해당 취약점이 존재할 경우 프로그래머가 의도하지 않았던 문자열을 전달하여 쿼리문의 의미를 왜곡시키거나 그 구조를 변경하고 임의의 쿼리를 실행하여 인가되지 않은 데이터를 열람할 수 있으므로 적절한 필터링 로직 구현이 필요하다.
XPath Injection 점검
점검 내용 | 웹페이지 내 조작된 XPath 쿼리 공격 가능성 점검 |
점검 목적 | XPath 쿼리에 대한 적절한 필터링을 적용하여 웹 사이트의 로직 손상 및 특정 데이터 추출을 차단하기 위함 |
점검 대상 | 웹 애플리케이션 소스코드, 웹 방화벽 |
1. ['and'a'='a, 'and'a'='b], [and 1=1, and 1=2]의 셋트의 값을 각각 삽입하여 쿼리의 참, 거짓에 따라 반환되는 페이지가 다른지 확인
'and'a'='a와 'and'a'=b 세트를 입력해 보았다.
페이지가 반환되기 전에 아이디 검사에서 걸린 것을 확인할 수 있었다.
and 1=1, and 1=2 세트도 마찬가지였다.
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
로그인 창에서는 글자가 잘려서 admin으로 로그인해 게시판 관리에서 입력해 보았다.
에러가 발생하지 않았다.
나머지 명령어들도 결과는 같아서 따로 사진 첨부는 하지 않았다.
아마 특수문자 필터링이 있어서 명령어가 제대로 실행되지 않았을 것 같다.
보안 설정 방법
XPath 쿼리에 사용자가 값을 입력할 수 있는 경우, 엄격한 입력 값 검증을 통해 필요 문자만을 받아들이게 한다.
( ) = ‘ [ ] : , * / 등 XPath 쿼리를 파괴하는 특수문자는 입력하지 못하게 하여야 하며, 특정 특수문자만을 필터링하는 것이 아닌 허용된 문자 이외의 모든 입력을 허용하지 않아야 한다.