맞는데 왜 틀릴까..?

Java/Secure Coding

[Secure Coding] XPath 인젝션을 방지하라

안도일 2023. 9. 7. 00:26

오늘 마침 학과 전공수업에서 데이터베이스 강의를 들었는데 이 강의를 듣지 않았으면 이해하지 못할 내용이었다. 굿 타이밍~

 

XML(Extensible Markup Language)은 관계형 데이터베이스와 유사한 방법으로 데이터를 저장하는 데 사용된다.

XPath를 이용하여 이런 XML 문서로부터 데이터를 가져온다.

이러한 XPath 검색 루틴에게 제공하는 데이터를 적절하게 정제하지 않으면 XPath 인젝션이 발생할 수 있다.

 

공격자는 쿼리에 유효한 SQL이나 XML 구조를 입력할 수 있다.

전형적으로, 쿼리의 조건 필드가 항진명제로 해석되도록 하거나 그렇지 않으면 공격자로 하여금 권한이 필요한 정보를 엑세스할 수 있도록 한다.

 

부적절한 코드 - XML 패스 인젝션

 

아주 간단한 예제를 살펴보자

 

공격자의 입력이 정제되지 않고 쿼리에 입력될 수 있는 코드

 

 

코드를 한번 살펴보자!

 

코드는 사용자가 유저이름과 비밀번호를 입력하면 해당 데이터를 이용한 XPath 쿼리를 생성한다.

 

그런데 만약 공격자가 admin이라는 유효한 사용자 이름이 존재한다는것을 안다면 입력 값에 다음과 같은 입력을 줄 수 있다.

유저이름 : admin' or '1'='1

비밀번호 : xxx

 

이런 입력값은 어떤 의미가 있을까?

 

공격자에 의해 생성된 쿼리 문자열은 다음과 같다.

//users/user[username/text()='admin' or '1'='1' and password/text()='xxx']

 

바로 쿼리의 조건 필드가 항진명제로 해석되게 하는것이다!

'1'='1'은 자동적으로 참이 되기 때문에 패스워드는 절대 검증되지 않는다.

결과적으로 공격자는 admin의 패스워드를 모르고도 admin을 인증된다.

 

아주 위험한 코드였다!!

 

솔루션 

 

XPath 인젝션은 SQL 인젝션에서와 유사한 방어책으로 방지할 수 있다.

 

  • 모든 사용자 입력을 신뢰하지 말고 적절한 정제 과정을 수행하라.
  • 사용자 입력을 정제할 때, 데이터 타입, 길이, 포맷 그리고 내용이 정확한지 검증하라 - 예를 들어, 사용자의 입력의 XML 태그와 특수 문자를 점검하기 위해서 정규표현식을 사용하라.
  • 클라이언트-서버 응용프로그램에서, 클라이언트와 서버 양측 모두에서 검증 과정을 수행하라.
  • 사용자 입력을 공급, 전파 혹은 수락하는 응용프로그램에 대해 광범위하게 테스트하라.

 

 

솔루션 1 - 이스케이핑

 

 

OWASP 2013에 따르면 XPath 인젝션 방지를 위해 다음과 같은 문자들은 제거되거나 적절하게 이스케이핑 되어야 한다고 규정한다.

  • 직접적 매개변수 인젝션 방지를 위해 < > / ' = "는 이스케이프되어야 한다.
  • XPath 쿼리는 어떠한 메타 문자들 (' = * ? // 등)을 포함해서는 안된다.

 

 

 

솔루션 2 - 매개변수화

 

 

  • SQL 인젝션과 관련된 문제를 방지하는 효과적인 방법은 매개변수화 하는 것이다.
  • 매개변수화는 사용자가 지정한 데이터가 API의 매개변수로서 전달되도록 하여 데이터가 절대 수행 가능한 컨텐츠로 해석되지 않도록 보장한다.
  • 이 방법을 사용하여 사용자 입력을 직접 쿼리 문자열에 삽입하지 않고, 대신 매개변수로 전달하여 보안을 강화할 수 있다.