[시큐어코딩 가이드] XML 삽입

 

 

 

■ 입력데이터 검증 및 표현

 

프로그램 입력 값에 대한 검증 누락 또는 부적절한 검증, 데이터의 잘못된 형식지정, 일관되지 않은 언어셋 사용 등으로 인해 발생되는 보안약점으로 SQL 삽입, 크로스사이트 스크립트(XSS) 등의 공격을 유발할 수 있다.

 

 

XML 삽입

 

■ 개요

 

검증되지 않은 외부 입력값이 XQuery 또는 XPath 쿼리문을 생성하는 문자열로 사용되어 공격자가 쿼리문의 구조로 임의로 변경하고 임의의 쿼리를 실행하여 허가되지 않은 데이터를 열람하거나 인증절차를 우회할 수 있는 보안약점이다.

 

 

■ 안전한 코딩 기법

 

XQuery 또는 XPath 쿼리에 사용되는 외부 입력데이터에 대하여 특수문자 및 쿼리 예약어를 필터링 하고 파라미터화 (Parameterized)된 쿼리문을 지원하는 XQuery를 사용한다.

 

 

코드예제

 

다음 예제는 Python에서 XML 데이터를 처리하기 위한 기본 모듈인 xml.etree.ElementTree를 이용하여 사용자 정보를 가져오는 예제이다. xml.etree.ElementTree 모듈은 제한적인 Xpath 기능을 제공하고 Xpath표현식을 매개변수화 해서 사용하는 방법을 제공하지 않는다.

 

안전하지 않은 코드의 예
from lxml import etree

def parse_xml(request):
user_name = request.POST.get('user_name', '')

parser = etree.XMLParser(resolve_entities=False)
tree = etree.parse('user.xml', parser)
root = tree.getroot()

# 검증되지 않은 외부 입력값 user_name를 사용하여
# 안전하지 않은 질의문이 작성되에 query변수에 저장
path = "/collection/users/user[@name='" + user_name + "']/home/text()"
elmts = root.xpath(query)
return render(request, 'parse_xml.html', {'xml_element':elmts})

 

Python 3.3 이후 보안상의 이유로 금지된 xml.etree.ElementTree 모듈 대신 lxml 라이브러리를 사용하고, 외부 입력값은 매개변수화 해서 사용한다.

 

안전한 코드의 예
from lxml import etree

def parse_xml(request):
user_name = request.POST.get('user_name', '')

parser = etree.XMLParser(resolve_entities=False)
tree = etree.parse('user.xml', parser)
oot = tree.getroot()

query = '/collection/users/user[@name = $paramname]/home/text()'
#외부 입력값을 paramname으로 매개변수화 해서 사용
elmts = root.xpath(query, paramname=user_name)
return render(request, 'parse_xml.html', {'xml_element':elmts})

 

 

댓글

Designed by JB FACTORY