URL 매개변수와 같이 사용자가 제공한 데이터는 항상 신뢰할 수 없고 오염된 것으로 간주해야 합니다. 공격자는 오염된 데이터에서 직접 XPath 표현식을 만들면 표현식 자체의 초기 의미를 변경하는 특수하게 조작된 값을 삽입할 수 있습니다. XPath 인젝션 공격에 성공하면 XML 문서에서 민감한 정보를 읽을 수 있습니다.
규칙을 어긴 코드
표준 xml 모듈(xml.etree.ElementTree)은 권장되지 않습니다:
- xpath 표현식을 제한적으로 지원합니다.
- 다른 보안상의 이유로 신뢰할 수 없는 XML을 구문 분석하는 경우
- 매개변수화된 xpath 표현식을 사용할 수 있는 방법이 없습니다.
from flask import request
import xml.etree.ElementTree as ET
tree = ET.parse('users.xml')
root = tree.getroot()
@app.route('/user')
def user_location():
username = request.args['username']
query = "./users/user/[@name='"+username+"']/location"
elmts = root.findall(query) # 규칙을 어긴 코드
return 'Location %s' % list(elmts)
규칙을 준수한 해결책
lxml module:
from flask import request
from lxml import etree
parser = etree.XMLParser(resolve_entities=False)
tree = etree.parse('users.xml', parser)
root = tree.getroot()
@app.route('/user')
def user_location():
username = request.args['username']
query = "/collection/users/user[@name = $paramname]/location/text()"
elmts = root.xpath(query, paramname = username)
return 'Location %s' % list(elmts)
같이보면 좋은 자료
- OWASP Top 10 2021 Category A3 - 인젝션
- OWASP Top 10 2017 Category A1 - 인젝션
- MITRE, CWE-20 - 부적절한 입력 검증
-
MITRE, CWE-643 - XPath 표현식 내 데이터의 부적절한 중립화
If you like SONARKUBE, don’t forget to give me a star.