ARTICLE · 1147692
我把一个目标丢给 AI 找洞,它给了我一个 RCE——也给了 27 个幻觉
实战笔记 · PENTEST × AI 安全
我把一个目标丢给 AI 找洞,它给了我一个 RCE——也给了 27 个幻觉
去年跟一个甲方做授权测试,我把域名一次性丢给几个大模型,让它们各自独立找脆弱点。三小时,四份报告,汇总去重后有 28 个可疑点。其中一个是真 RCE。剩下 27 个,全是幻觉。
这篇不聊怎么"打进去"——那部分在授权报告里,脱敏后也跟各位没啥关系。我想复盘的是另一件事:AI 在渗透里到底帮得上忙,还是只会给你一堆看起来很对的废话;以及,一个 RCE 从"能利用"到"被拦下",边界到底画在哪。
一句话先立住:AI 是放大器,不是替代者。你底子越厚,它放得越大;你啥也不懂,它就把你往坑里带得越深。
01开局:让 AI 做侦察,它比人快,但会乱报
信息收集是 AI 最舒服的活。子域名、端口、指纹、暴露面,这类"体力活"它干得比人快。我习惯把自动化工具跑出来的原始结果喂给它,让它先归个类、标个优先级。
# 先用工具把暴露面拉出来,别让 AI 瞎编
subfinder -d example.com | httpx -silent | nuclei -t tech-detect
# 把结果喂给模型,让它按"高危/中危/待确认"标
# 它会回一堆"疑似命令注入""疑似反序列化"
问题立刻来了:它标出来的"高危",一半连漏洞类型都说不准。一个返回 500 的接口,它能给你写成"疑似 SQL 注入",实际上只是后端没接住空参数。这就是幻觉的第一种——把"异常"当成"漏洞"。
02卡点:它给的 payload,十个里九个跑不通
真正卡住我的,不是找点,是验证。AI 给的利用载荷,十个里九个跑不通。不是它不会写语法,是它不知道目标的真实环境。
举个真事:一个搜索框,后端用模板渲染。我让模型给 SSTI 的测试串,它甩给我一串 Jinja2 的 `{{7*7}}`。可目标跑的是另一套引擎,那串东西原样回显,啥也没算出来。我改用对应引擎的语法,才看到运算结果被解析——漏洞确认。
那一刻我特别清醒:AI 给的是"方向上对的猜测",不是"针对你目标的答案"。它能把你可能忘掉的那几种变形列出来,但到底要不要信、信哪一条,得你自己上手验。这就是为什么我说,不会手工的人,用了 AI 反而更危险——他连"AI 错了"都看不出来。
幻觉的第二种:语法没问题,上下文不对。模型没见过你这套堆栈,它只能赌。赌错了,就给你一个"看起来特别专业、其实根本打不通"的 payload。
03破局:那个真 RCE,藏在"命令被拼进去了"的地方
28 个可疑点里,唯一落地成 RCE 的,是一个网络诊断功能。它收一个主机地址,后端拿去拼进系统命令做连通性检查。用户输入没做隔离,命令就被接上了。
这类问题的本质从来不是"AI 多厉害",而是老问题:不可信的用户输入,进了可执行上下文。命令注入是拼进 shell,反序列化是拼进反序列化器,模板注入是拼进模板引擎。换汤不换药。
// 危险写法:输入直接拼进命令(仅作检测特征说明)
String cmd = "ping -c 1 " + userInput;
Runtime.getRuntime().exec(cmd);
// 正确写法:参数拆开,绝不拼字符串
ProcessBuilder pb = new ProcessBuilder(
"ping", "-c", "1", userInput);
pb.start();
AI 在这里的价值,是帮我把"哪个参数是命令入口"圈出来,省了半小时翻代码。但确认它能 RCE、写出稳定验证方式,还是靠人。模型给不出"这段拼接种会在哪些 WAF 下被拦"的判断——那得你自己去试。
04检测侧:RCE 在被利用之前,其实全是痕迹
站在防守方看,一个命令注入从发生到 RCE,路上全是特征。WAF 能拦拼接特征,EDR 能看进程树,日志能抓异常外连。问题是大多数单位这三层都没接上。
# 在网关日志里捞命令注入的高频特征(给蓝队用)
grep -E ";|\||\`|\$\(|\$\{|&|\n" access.log
# 看进程是不是从 web 服务fork出了 shell
ps -eo pid,ppid,cmd | grep -E "sh|-c|bash"
现在越来越多团队上 RASP——它在运行时拦"web 进程突然要去执行系统命令"这种反常行为,比 WAF 靠字符串匹配稳得多。AI 辅助攻击跑得越快,防守侧靠"行为"而不是"特征"的必要性就越强。
05修复侧:别禁用函数,要从结构上断开
很多开发第一反应是"把 exec 禁了"。禁了命令执行,反序列化又成了入口;禁了反序列化,模板注入又顶上。堵函数堵不完,得从结构上断开"输入"和"执行"。
错误思路 靠黑名单禁用危险函数;靠 WAF 正则挡一切;信任内部接口不校验。 | 正确思路 参数化/参数拆分,不拼字符串;输入白名单;最小权限跑服务;危险操作走审批。 |
说到底就一句话:用户输入永远不可信,能不拼进执行上下文就别拼。这条原则二十年前写进安全规范,今天被 AI 放大了十倍威力,因为它正好卡在"AI 最容易幻觉"的那个环节。
06边界声明:点到为止,也别神化 AI
以上全过程在授权范围内完成,漏洞已提交甲方修复,文中代码与特征均作脱敏,不涉及任何在运营目标。点到为止。
回到开头那 28 个点:1 个真 RCE,27 个幻觉。AI 没让我变强,它把我的强项放大了、把我的盲区也放大了。会用的人,拿它当侦察兵;不会用的人,拿它当答案书——后者迟早栽在"AI 说能通"的那一行上。
AI 给你的是方向,不是答案。能验真假的那双手,才是你在这行立足的本钱。
参考来源:船山信安实战案例库(授权测试脱敏)、OWASP Top 10(2021)命令注入与失效控制章节、OWASP SSTI 专题文档。本文为技术复盘,不含任何未修复系统的完整利用链。