https://www.kisa.or.kr/public/laws/laws3.jsp
구현 단계 시큐어코딩 가이드 - 입력 데이터 검증 및 표현 - XPath 삽입
가. 개요
- 외부 입력값을 적절한 검사과정 없이 XPath 쿼리문 생성을 위한 문자열로 사용하면, 공격자는 프로 그래머가 의도하지 않았던 문자열을 전달하여 쿼리 문의 의미를 왜곡시키거나 그 구조를 변경하고 임의의 쿼리를 실행하여 인가되지 않은 데이터를 열람할 수 있다.
나. 보안대책
- XPath 쿼리에 사용되는 외부 입력데이터에 대하여 특수문자(", [, ], /, =, @ 등) 및 쿼리 예약어 필터링을 수행하고 파라미터화 된 쿼리문을 지원하는 XQuery를 사용한다.
다. 코드예제
JAVA
아래 예제에서는 nm과 pw에 대한 입력값 검증을 수행하지 않으므로 nm의 값으로 "tester", pw의 값으로 "x' or 'x'='x"을 전달하면 아래와 같은 질의문이 생성되어 인증과정을 거치지 않고 로그인할 수 있다.
"//users/user[login/text()='tester' and password/text()='x' or //'x'='x']/home_dir/text()"
다음의 예제는 XQuery를 사용하여 미리 쿼리 골격을 생성함으로써 외부 입력으로 인해 쿼리 구조가 바뀌는 것을 막을 수 있다.
파라미터화 된 쿼리를 지원하는 XQuery 구문으로 대체할 수 없는 경우에는 XPath 삽입을 유발할 수 있는 문자들을 입력값에서 제거하고 XPath 구문을 생성, 실행하도록 한다.
아래 코드는 입력값을 검증하지 않고 입력값을 XPath 구문 생성 및 실행에 사용하고 있다. 입력 값으로 any' or 'a' = 'a 와 같이 XPath 구문을 조작하는 문자열을 전달하는 경우 //food[name ='any' or 'a' = 'a']/price 같이 구문이 만들어지고 실행되어 모든 food의 가격(price)이 조회되게 된다.
외부 입력값을 XPath 구문 생성 및 실행에 사용하는 경우 XPath 구문을 조작할 수 있는 문자열을 제거하고 사용할 수 있도록 한다.
C#
다음의 예제는 외부 입력을 사용하여 XPath 식에 바로 사용합니다. 이는 공격자의 입력에 따라 XQuery의 구조를 바꾸어 예기치 않은 공격이 발생할 수 있다.
다음의 예제는 XPathExpression을 사용하여 미리 쿼리 골격을 생성함으로써 외부 입력으로 인해 쿼리 구조가 바뀌는 것을 막을 수 있다.
참고자료
- CWE-643 XPath Injection, MITRE,
http://cwe.mitre.org/data/definitions/643.html - Prevent XPath Injection, CERT,
http://www.securecoding.cert.org/confluence/display/java/IDS53-J.+Prevent+XPath+Injections - XPATH Injection, OWASP,
https://www.owasp.org/index.php/XPATH_Injection
'공부 > KISA' 카테고리의 다른 글
크로스사이트 요청 위조 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.20 |
---|---|
LDAP 삽입 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.20 |
XQuery 삽입 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.20 |
신뢰되지 않는 URL 주소로 자동접속 연결 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.20 |
위험한 형식 파일 업로드 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.19 |
댓글