Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-48710 — CVE-2026-48710漏洞验证代码 | Kitploit
Strumenti/GitHubGitHub/cuteecat/cve-2026-48710
Authentication & AuthorizationVulnerability AnalysisWeb Application ExploitationWeb Security
GitHubcuteecat/cve-2026-48710

CVE-2026-48710

CVE-2026-48710漏洞验证代码

Vedi Repository
10 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-48710

#Principio:
Starlette è un framework ASGI Python open-source e leggero
Il problema nasce dal fatto che, nella gestione della struttura dati dell'url, il framework Starlette si fida dell'host inviato dal client, concatenandolo direttamente alla variabile url per la successiva elaborazione dell'autenticazione

L'url originale viene elaborato in uvicorn\protocols\http\httptools_impl.py

root@kitploit:~
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(),
    }

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

(commenti che ho digitato a mano)

Questo codice si trova all'interno del metodo della classe URL:

Codice: \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

In 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

Ciò fa sì che una richiesta malformata, inviata dall'utente con un header host a un endpoint che richiede l'autenticazione, venga ridefinita a livello di routing come endpoint che non richiede autenticazione
Ad esempio, in http://127.0.0.1:9999/admin
in questo url, admin è un endpoint che richiede l'autenticazione
Invia il pacchetto dati
url = http://127.0.0.1:9999/admin
header{
host = 123?
}
L'url viene ridefinito come http://123?/admin
A questo punto l'url viene analizzato con la funzione urlsplit
Il risultato è SplitResult(scheme='http', netloc='123', path='', query='/admin', fragment='')
Poiché path='', l'autenticazione successiva ritiene che l'utente stia accedendo alla directory radice del sito, quindi l'accesso viene concesso direttamente; in realtà vengono restituiti i contenuti della directory admin

Scarica lo strumento