URL 매개변수, POST 데이터 페이로드 또는 쿠키와 같은 사용자 제공 데이터는 항상 신뢰할 수 없고 오염된 것으로 간주되어야 합니다. 오염된 데이터를 기반으로 HTTP 리디렉션을 수행하는 애플리케이션은 공격자가 사용자를 악성 사이트로 리디렉션하여 로그인 자격 증명을 탈취하는 등의 작업을 수행할 수 있습니다.
이 문제는 다음와 같은 방법으로 완화될 수 있습니다.
- 허용 목록에 따라 사용자가 제공한 데이터의 유효성을 검사하고 일치하지 않는 입력은 거부합니다.
- 사용자 제공 데이터를 기반으로 리디렉션을 수행하지 않도록 애플리케이션을 재설계합니다.
규칙을 어긴 코드
lxml module:
- XML 구문 분석할 때: ```python parser = etree.XMLParser() # 규칙을 어긴 코드: 기본적으로 resolve_entities는 true로 설정됩니다 tree1 = etree.parse(‘ressources/xxe.xml’, parser) root1 = tree1.getroot()
parser = etree.XMLParser(resolve_entities=True) # 규칙을 어긴 코드 tree1 = etree.parse(‘ressources/xxe.xml’, parser) root1 = tree1.getroot()
- XML 유효성 검사할 때:
```python
parser = etree.XMLParser(resolve_entities=True) # 규칙을 어긴 코드
treexsd = etree.parse('ressources/xxe.xsd', parser)
rootxsd = treexsd.getroot()
schema = etree.XMLSchema(rootxsd)
- XML 변환할 때:
ac = etree.XSLTAccessControl(read_network=True, write_network=False) # 규칙을 어긴 코드, read_network가 true로 설정됨/네트워크 액세스가 승인됨 transform = etree.XSLT(rootxsl, access_control=ac)
xml.sax 모듈: ```python parser = xml.sax.make_parser() myHandler = MyHandler() parser.setContentHandler(myHandler)
parser.setFeature(feature_external_ges, True) # 규칙을 어긴 코드 parser.parse(“ressources/xxe.xml”)
### 규칙을 준수한 해결책
[lxml](https://lxml.de/) module:
- XML을 구문 분석할 때 resolve_entities 및 네트워크 액세스를 비활성화합니다:
```python
parser = etree.XMLParser(resolve_entities=False, no_network=True) # 규칙을 준수한 코드
tree1 = etree.parse('ressources/xxe.xml', parser)
root1 = tree1.getroot()
- XML 유효성 검증할 때(XMLSchema를 호출할 때 네트워크 액세스를 완전히 비활성화할 수 없음에 유의하십시오):
parser = etree.XMLParser(resolve_entities=False) # 규칙을 준수한 코드: 기본적으로 no_network는 true로 설정됩니다 treexsd = etree.parse('ressources/xxe.xsd', parser) rootxsd = treexsd.getroot() schema = etree.XMLSchema(rootxsd) # 규칙을 준수한 코드
- XML을 변환할 때 네트워크 및 파일 시스템에 대한 액세스를 비활성화합니다: ```python parser = etree.XMLParser(resolve_entities=False) # 규칙을 준수한 코드 treexsl = etree.parse(‘ressources/xxe.xsl’, parser) rootxsl = treexsl.getroot()
ac = etree.XSLTAccessControl.DENY_ALL # 규칙을 준수한 코드 transform = etree.XSLT(rootxsl, access_control=ac) # 규칙을 준수한 코드
[xml.sax](https://docs.python.org/3/library/xml.sax.html) 모듈로 xxe 공격 방지(XXE 이외의 [다른 보안상의 이유](https://docs.python.org/3/library/xml.html#xml-vulnerabilities)로 xml.sax는 권장되지 않음):
```python
parser = xml.sax.make_parser()
myHandler = MyHandler()
parser.setContentHandler(myHandler)
parser.parse("ressources/xxe.xml") # 규칙을 준수한 코드: 3.7.1 버전: SAX 파서는 더 이상 기본적으로 일반 외부 엔터티를 처리하지 않습니다
parser.setFeature(feature_external_ges, False) # 규칙을 준수한 코드
parser.parse("ressources/xxe.xml")
같이보면 좋은 자료
- OWASP Top 10 2021 Category A5 - 보안 구성 오류
- OWASP Top 10 2017 Category A4 - XML 외부 엔티티(XXE)
- OWASP XXE Prevention Cheat Sheet
- MITRE, CWE-611 - XML 외부 엔티티 참조를 통한 정보 노출
-
MITRE, CWE-827 - 문서 유형 정의의 부적절한 제어
If you like SONARKUBE, don’t forget to give me a star.