AI 渗透 20 轮:5 条链打通,12 条链卡住

· 2026-11-09 06:06 · 0 阅读

原创 aerfa21 2026-11-09 06:06 北京

关于AI渗透测试的体验,通用agent + 模型就能干很多事儿,半夜躺在被窝里拿手机就能渗透,并且效果很好~

一、AI 在这套流程里怎么用

起点是 shadowscan 的扫描结果。这些结果不是「疑似」,是已经跑出来的问题。AI 接到的任务不是二次判断真假,而是直接把这些点打成可利用:读前端 bundle、还原接口和签名、按「最可能缺鉴权」给端点排序、拆gRPC/protobuf、把结果整理成报告初稿。

人负责的是给目标、补经验、补资源、纠偏、换视角,以及在关键节点判断「还不够」。授权是评估前提,不在提示词里逐条写。四天大约 8 万次请求,30 条提示词,执行大部分交给模型,方向由人定。

还有一件值得单独说:AI 会写很多脚本工具。资产枚举、签名客户端、gRPC 扫描、证据解析、HTML 转 DOCX,基本都是它按需求现写的。它不只是给建议,能把重复动作固化成可重跑的脚本;但会发请求、会写文件的脚本,边界要人复核。

AI 在评估流程里的位置
图 1 · AI 做执行,人定边界;扫描结果直接进入利用,不做二次真假判断

二、打通的链

链

入口

关键动作

结果

SQLi → 管理员

/nmapii/login1

 username

引号配额确认 + 位运算/溢出 oracle/FIELD 盲注 + 认证头

管理员权限、百余名用户;shell 卡在 FastDFS

gRPC-Web 未授权

/api/{service}.TokenV1/*

5 字节帧 + protobuf,207 RPC 空 message 探针

34 个未授权;手机号→staffId;重置链卡邮件

沙箱签名

get-access-key

 / uploadFile

RSA(filename+browserId),X-Gtw-Token 短路签名

6 个样本入队;盲 SSRF;测绘 API 未授权

数据面四条通道

tasks / export / Hub / download

无 owner 校验、无鉴权、连续 ID

百万级任务、抽样导出全部成功、23 万余个包、上千文件

堡垒机协议

550 余个 API

{c:{},b:{}}

 信封 + 服务端时间回填

免会话枚举 1 个账号;会话层未破

2.1 SQL 注入到管理员:WAF 只挡了关键字,没挡语法

注入点在登录接口的 username,原样拼进 SQL。先用引号配额确认:admin 返回 3001,admin' 返回 1502,admin'' 又回到 3001。单引号报错、双引号正常,只可能是字符串拼接。

POST /nmapii/login {"username":"admin'","password":"x"}      → 1502 语法错误 {"username":"admin''","password":"x"}     → 3001 SQL 合法,仅无匹配 {"username":"admin'|1|'","password":"x"}  → 3001 位运算闭合,SQL 合法

WAF 是网络层,不是应用层。把同一个 payload 打到不存在的路径,同样被重置:

/nonexist                 → 401(应用正常响应) /nonexist?a=' or 1=1      → 000(连接重置)  ← 路径不存在也被拦

规则粒度是「引号 + 逻辑关键字 + 操作数」的子句结构。最后用四个盲区打进去:

盲区

payload

为什么能过

位运算符闭合

admin'|1|'

位运算不是关键字,能完成字符串闭合与类型转换

溢出报错 oracle

admin'|NULLIF(1,0)*length(u_password)*1e308|'

条件成立才溢出,把布尔值映射成 1502/3001

函数替代

FIELD

 + STRCMP + BINARY + MID

WAF 拦了 substring/ascii/if(,放过了这组

认证头与方法

authorization:

 裸值 + POST

不能带 Bearer;业务接口只收 POST

完整链:注入 → 提 3 个 bcrypt 哈希 → 两个账号 123456 → authorization 裸值 + POST 拿会话 → 员工 token 调管理员接口 → 百余名用户。上传也打通了,filename*=utf-8''x.jsp 绕过 RFC 5987 后缀过滤,但文件落 FastDFS,返回 application/octet-stream,JSP 不解析,shell 到此为止。

SQL 注入到管理员的链路与卡点
图 2 · 注入、绕过、提权、上传都通了,最后卡在 FastDFS 不解析 JSP

2.2 gRPC-Web:WAF 没有 protobuf 的判据

统一用户中心前端走 gRPC-Web,路径前缀是 /api/。请求体是 5 字节帧头加 protobuf,字段靠位置编号标识,没有参数名、没有引号、没有 SQL 关键字。WAF 的规则库围绕文本协议建,遇到字节流没有可匹配的语法;网关又只检查「前缀是否在 /api/ 下」,整个 207 个 RPC 的命名空间都放行了。

POST /api/{service}.TokenV1/CreatePassToken Content-Type: application/grpc-web+proto  00 00 00 00 12 0a 08 6a 6f 68 6e 2e 64 6f 65 ...

对 207 个 RPC 逐个发空 protobuf,34 个返回业务级错误而不是鉴权拒绝。CheckSubjectExist 用手机号直接返回内部 staffId,无验证码、无速率限制。密码重置链走到 CreateCode → CheckCode → UpdateStaffPwdWithCode,CheckCode 4–6 位、95/s、无限速;唯一阻塞是邮件通道 send code fail。

JSON 与 gRPC-Web 帧在 WAF 眼里的差别
图 3 · JSON 有参数名和引号,protobuf 只有 tag+length;WAF 在后者上没有判据

2.3 沙箱签名:不拿 Token,直接还原签名

沙箱 pub 前缀公网可达,get-access-key 匿名返回 2048-bit RSA 公钥(443 字节),签名在客户端算。从 90 个前端 chunk 里还原出两条规则:

uploadFile : sign = RSA_PKCS1v15( filename + browserId ) analysisUrl: sign = RSA_PKCS1v15( url + browserId ) uid = browserId(Fingerprint2 x64hash128,32 位 hex)

上一轮 51 组签名全错,原因很具体:sign 放 query 而服务端从 body 读;明文少拼了文件名;uid=1 不是 32 位 hex。换到 body 后,get-times 立刻返回 {"code":"0","data":"10"}。另一个逻辑缺陷是 X-Gtw-Token:不带 Token 走签名;带任意非空值跳过签名、改走会话;空值又回到签名。服务端写成 if - else if,不是「两者都要」。

签名还原后 6 个样本入队,43 种镜像可选;analysisUrl 接受回环地址、云元数据地址、内网 10 段和 file://,是盲 SSRF。同一时期测绘 API /geoggll/api/search 无鉴权,gov.cn 可查数十万条。

沙箱签名、样本入队、SSRF 与测绘 API
图 4 · 从公钥到签名、从上传到 SSRF,再到测绘 API 的四段链路

2.4 数据面:四条通道,同一个根因

根因是「只校验登录,不校验权限」。四个接口分布在不同的业务里,修一条不等于修另外三条。

通道

请求

结果

任务列表

GET /api/tasks/?page=N&page_size=100

,无 Cookie/Token,仅 Referer

平台自报百万级任务,抽样数百条含客户业务描述

报告导出

GET /api/reports/<tid>/export

,普通账号,无权限校验

抽样全部成功;正文含源码片段、云账号 ID、内部模型名

Hub 包

GET /api/hub/skills?page=1&page_size=20

 → /api/reports/<task_id>/package

23 万余个包;抽样全部一致,SHA1 与服务端登记值相符

应用分发站点

GET /file/download/{id}

,ID 从 1 开始连续,无鉴权

上千个文件、数十 GB;文件名是客户名+版本号

Hub 通道的机制错误很典型:用「报告包下载」接口做「Hub 分发」,/api/hub/skills/<id> 把内部 task_id 暴露出来,/api/reports/<task_id>/package 又只校验 task 是否存在、不校验调用者。应用分发站点则是把下载接口当静态资源,文件名直接带客户身份,解包后能看到客户内网域名。

一个根因带出四条数据通道
图 5 · 同一个「只校验登录,不校验权限」,带出四条互不重叠的通道

三、没打通的链

链

尝试

卡点

WAF 通用绕过

21 类:请求走私、gzip/deflate、chunked、缓冲耗尽、爬虫 UA 白名单

全部 RST;WAF 在网络层,规则按子句结构匹配

JSP webshell

/webjars/

 返回 Spring 404(705B),非全局 401

Spring Boot fat jar,内嵌 Tomcat 无 jasper,写 JSP 也不执行

zip slip / 上传逃逸

12 种变形、symlink、双层 zip

解压库剥离 ..,落盘名固定 /tmp/qkill_{rand}/skill.zip

交换上传

5 个接口无鉴权:init / chunk / clete / press / cancel

receiverSource

 校验分享码,16 种格式全返回「非法上传路径」

登录

3 位算术验证码(图写 98+2,服务端要 100)、单会话穷举

验证码一次性;累计百万次口令零命中;5 次锁定 30 分钟

令牌

3 万次数字枚举,数百 req/s 无限速

令牌服务端查表,不透明、不可枚举

人员系统参数

3 个白名单接口绕过滤器;86 次请求、40+ 组合

6 次 200 但 len=0,其余 401;接口存在,取不到数据

Nloud

20.0.7 / 23.0.0,7 组弱口令;OCS capabilities 未授权

版本 EOL,但无可用 RCE;弱口令失败,登录需 requesttoken

APISIX

2.11.0 Admin API 暴露;CVE-2022-24112

token 已改;batch-requests 转发到上游,不到 Admin

源码审计平台

全量 API、登录接口、11 种 token 绕过

全局 401,连 /cdessapi/login 都 401

备份 / 配置

15 站点 × 40 路径 = 600 次;77 站点 × 20 数据端点 = 1,540 次

仅 1 个 22 字节 robots.txt;数据端点真实未授权 0

沙箱 VM 逃逸

HTML img/link 投递、pcap 端口扫描、内网 SSRF

数据面全 DROP;JS 禁用;仅 DNS 通,能解析内网域名

四、可复用的技术点

  • 先判 WAF 层级。

    同一个 payload 打到不存在的路径,仍被重置,就是网络层;应用层校验不会拦不存在的路径。

  • 引号配额。admin

    /admin'/admin'' 三组响应,能在不触发注入的情况下确认字符串拼接。

  • 换语法,不换关键字。

    位运算闭合、1e308 溢出、FIELD/STRCMP/BINARY,都是 WAF 规则没覆盖的语法。

  • 换协议。

    看到 application/grpc、grpc-web+proto、x-protobuf、msgpack、cbor,先确认 WAF 认不认识,再谈 payload。

  • 找「或 / 与」逻辑。

    带一个非空头就能跳过另一层校验,通常是 if - else if 写错了。

  • 信封从真实请求里拿。

    扁平 JSON 全 400 时,用 CDP 抓浏览器请求,不要猜参数名。

  • oracle 必做对照。

    33/32 账号「存在」用 4 个随机名推翻;314/316 用 10 个随机号确认;堡垒机 10 组 0 误报。

  • 结论指回原始响应。

    指不出状态码、长度、关键字段的,标「未验证」,不写进报告。

五、本次渗透的路径全貌

把成功链、失败链、数据面、资产面放在一张脑图里。中间是结果,六条分支是这次实际走过的路:入口与注入、协议层、数据面、认证与会话、资产面、证伪与卡点。每条分支只放节点名,细节在前四节。本次渗透测试所有路径的脑图

图 6 · 本次评估的路径全貌:成功链、失败链、数据面、资产面

这张图不是攻击树,是评估路径图:哪些路走通了、哪些停在机制上、哪些只是资产或情报。下次遇到同类系统,可以先按分支定位,再决定从哪条链切。

关于AI渗透的思路,其实可以总结出来自己看看,不仅开阔视野更是丰富了思路,同样可以沉淀为知识库供后续渗透使用。

BTW,AI 绕过Waf很牛~

以上渗透基本都是半夜躺在床上,用手机做的。不得不说通用agent + 模型,在渗透测试方面就已经很强了。

跳转微信打开

本文转载自微信公众号「我的安全视界观」,查看原文。版权归原作者所有,如有侵权请联系删除。