[시큐어코딩 가이드] 2-1-9. XML 삽입

XML 삽입

정의

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

 

안전한 코딩기법

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

 

코드예제

다음은 안전하지 않은 코드예제로, 파이썬에서 XML 데이터를 처리하기 위한 기본 모듈인 xml.etree.ElementTree를 이용하여 사용자 정보를 가져오는 예제입니다. 이 모듈은 제한적인 Xpath 기능을 제공하며, Xpath 표현식을 인자화해서 사용하는 방법을 제공하지 않습니다.

#XML 삽입(안전X)
def parse_xml_bad(request):
    user_name = request.POST.get('user_name', '')

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

    query = "/collection/users/user[@name='" + user_name + "']/home/text()"
    elmts = root.xpath(query)
    return render(request, 'success.html', {'data': elmts})

 

다음은 안전한 코드 예제로 외부 입력값을 paramname으로 인자화 해서 사용하는 코드입니다.

#XML 삽입(안전O)
def parse_xml_good(request):
    user_name = request.POST.get('user_name', '')

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

    query = '/collection/users/user[@name = $paramname]/home/text()'
    elmts = root.xpath(query, paramname=user_name)
    return render(request, 'success.html', {'data': elmts})

 

 

 

입력데이터 검증 및 표현/XML 삽입

[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)