HTTP 요청 리디렉션은 위조 공격에 노출되어서는 안됩니다.

 

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")

같이보면 좋은 자료

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project