오늘 마침 학과 전공수업에서 데이터베이스 강의를 들었는데 이 강의를 듣지 않았으면 이해하지 못할 내용이었다. 굿 타이밍~
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의 매개변수로서 전달되도록 하여 데이터가 절대 수행 가능한 컨텐츠로 해석되지 않도록 보장한다.
- 이 방법을 사용하여 사용자 입력을 직접 쿼리 문자열에 삽입하지 않고, 대신 매개변수로 전달하여 보안을 강화할 수 있다.
'Java > Secure Coding' 카테고리의 다른 글
[Secure Coding] 비신뢰-메서드의 매개변수를 clone() 메서드로 복제하지 말라 (0) | 2023.09.12 |
---|---|
[Secure Coding] LDAP 인젝션을 방지하라 (0) | 2023.09.09 |
[Secure Coding] 코드 인젝션을 방지하라 (0) | 2023.09.02 |
[Secure Coding] 출력을 적절하게 인코딩하거나 이스케이핑하라 (0) | 2023.08.11 |
[Secure Coding] 마구잡이 파일 업로드를 방지하라 (0) | 2023.08.07 |