Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-48710 — CVE-2026-48710漏洞验证代码 | Kitploit
도구/GitHubGitHub/cuteecat/cve-2026-48710
Authentication & AuthorizationVulnerability AnalysisWeb Application ExploitationWeb Security
GitHubcuteecat/cve-2026-48710

CVE-2026-48710

CVE-2026-48710漏洞验证代码

저장소 보기
10일 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-48710

#원리:
Starlette는 오픈소스 경량 Python ASGI 프레임워크입니다.
이는 Starlette 프레임워크가 URL 데이터 구조 처리에서 클라이언트가 보낸 host를 신뢰하여 URL 변수에 직접 이어붙인 뒤 후속 인증 처리를 수행하기 때문입니다.

원본 URL은 uvicorn\protocols\http\httptools_impl.py에서 처리됩니다.
def on_message_begin(self) -> None: self.url = b"" self.expect_100_continue = False self.headers = [] self.scope = { "type": "http", "asgi": {"version": self.asgi_version, "spec_version": "2.3"}, "http_version": "1.1", "server": self.server, "client": self.client, "scheme": self.scheme,
"root_path": self.root_path, "headers": self.headers, "state": self.app_state.copy(), }

root@kitploit:~
# Parser callbacks
def on_url(self, url: bytes) -> None:
    self.url += url #self.url设置为原始url

def on_header(self, name: bytes, value: bytes) -> None:
    name = name.lower()
    if name == b"expect" and value.lower() == b"100-continue":
        self.expect_100_continue = True
    self.headers.append((name, value))

def on_headers_complete(self) -> None:
    http_version = self.parser.get_http_version()
    method = self.parser.get_method()
    self.scope["method"] = method.decode("ascii")
    if http_version != "1.1":
        self.scope["http_version"] = http_version
    if self.parser.should_upgrade() and self._should_upgrade():
        return
    parsed_url = httptools.parse_url(self.url)#使用httptools拆分原始url
    raw_path = parsed_url.path  #raw_path设置为原始url拆分出的path(访问的path)
    path = raw_path.decode("ascii")  #path设置为使用ascii解码以后的原始path值
    if "%" in path:  #处理url解码以后的中文从重编码
        path = urllib.parse.unquote(path)
    full_path = self.root_path + path
    full_raw_path = self.root_path.encode("ascii") + raw_path
    self.scope["path"] = full_path
    self.scope["raw_path"] = full_raw_path
    self.scope["query_string"] = parsed_url.query or b""

(제가 직접 입력한 주석)

이 코드는 class URL: 메서드 안에 있습니다.

코드: \starlette\datastructures.py

host_header = None for key, value in scope["headers"]: if key == b"host": host_header = value.decode("latin-1") break if host_header is not None: url = f"{scheme}://{host_header}{path}" #基于用户传入的请求头二次定义url

starlette\routing.py에서:

root@kitploit:~
    route_path = get_route_path(scope)
    if scope["type"] == "http" and self.redirect_slashes and route_path != "/":
        redirect_scope = dict(scope)
        if route_path.endswith("/"):
            redirect_scope["path"] = redirect_scope["path"].rstrip("/")
        else:
            redirect_scope["path"] = redirect_scope["path"] + "/"

        for route in self.routes:
            match, child_scope = route.matches(redirect_scope)
            if match != Match.NONE:
                redirect_url = URL(scope=redirect_scope)   #调用URL方法
                response = RedirectResponse(url=str(redirect_url))
                await response(scope, receive, send)
                return

이로 인해 사용자가 host 요청 헤더가 포함된 비정상적인 요청을 인증이 필요한 엔드포인트로 전송하면, 라우팅 계층에서 URL이 인증이 필요 없는 엔드포인트로 재정의됩니다.
예를 들어 http://127.0.0.1:9999/admin에서
이 URL에서 admin은 인증이 필요한 엔드포인트입니다.
다음 데이터 패킷을 전송합니다.
url = http://127.0.0.1:9999/admin
header{
host = 123?
}
URL이 http://123?/admin으로 재정의됩니다.
이때 urlsplit 함수를 사용하여 URL을 파싱합니다.
결과: SplitResult(scheme='http', netloc='123', path='', query='/admin', fragment='')
path=''이므로 이후 인증은 사용자가 웹사이트 루트 디렉터리에 접근하는 것으로 간주하여 바로 통과시키고, 실제로는 admin 디렉터리의 내용을 반환합니다.

도구 다운로드