黑盒测试打到某个阶段会遇到一堵墙:认证前的攻击面全摸完了,能试的都试了,剩下的全要登录态。这时候答案往往在源码里——而国产二开系统的源码,经常就躺在 GitHub 上。
我最近靠这套流程挖到一个通用型 0day 并提交了漏洞平台,把完整工作流沉淀一下。目标信息脱敏,只讲方法。
什么时候该转白盒
我的判断信号:
- 黑盒测绘拿到了明确的产品指纹(某框架二开、某厂商的国产系统)
- 认证前合规面基本榨干,剩下的发现全是 L0/L1(只证明存在,拿不到东西)
- 目标是通用型产品——挖出来就是通杀,价值比单站洞高一个量级
三条都中,就别在黑盒上继续磨了。
Phase 0:指纹提取
转白盒的第一步不是搜,是先从本地证据里提取”独特串”。标准:这个串扔到 GitHub 搜,结果约等于零,才算独特。
按价值排序,我用这五级:
| 级别 | 类型 | 举例(脱敏) |
|---|---|---|
| 1 | 自研 API 路径 | /api/folder/fwh/ 这种拼音缩写路径,别家不会有 |
| 2 | 中英报错整句 | 框架的中文报错原句,注意弯引号原样保留 |
| 3 | 厂商/产品标识 | 厂商名、SaaS 域名、客户子域模式 |
| 4 | 技术栈组合 | 框架+存储+服务器+响应封装格式 |
| 5 | chunk/组件命名 | webpack chunk hash、Vue 组件路径 |
从哪提:前端 bundle 正则全量抠 /api/... 路径、报错堆栈里的包名、页面里的厂商标识。webpack bundle 一条正则就能把 API 路由全抠出来。
普通词(login、list、index)不要单独搜——只作为”星座组合”的成员,多条 AND 一起用。
Phase A:反搜与落地
反搜没什么好说的,把独特串扔进 GitHub code search(带 text_matches 上下文)、Gitee、Sourcegraph,三个平台交叉。命中后用”同源判定清单”核对:至少 3 条指纹命中(单串 + 自定义响应封装 + 模型字段),才算同源,避免抓到长得像的别家代码。
批量落地有个大坑要说:代理网络下 git clone 大仓库必断(fetch-pack early EOF),codeload 下 zip 也断。正解是走 API:
GET /repos/{owner}/{repo}/git/trees/{sha}?recursive=1列出全文件清单raw.githubusercontent.com/{owner}/{repo}/{sha}/{path}逐文件拉取
小文件走代理很稳,我实测 127/127 全部成功。ref 用 commit SHA 最稳,别用分支名。
版本锁定看部署配置:docker-compose 里的 jar 文件名直接告诉你基座版本(比如 xxx-module-system-2.4.5.jar)。再拿接口行为 diff 验证——仓库是 POST 而部署只认 GET,说明部署版比仓库新,审计以仓库为参考、判定以线上为准。
Phase B:五路并行审计
源码到手后,我把审计面拆成五路并行做(每路一份独立报告):
- 鉴权矩阵:全 Controller 端点 × 鉴权注解 × anon 白名单对照——未授权攻击面全图
- SQLi 污点追踪:全部 Mapper XML 的
${}逐枚,Source→Sink 画链 - 文件链:上传白名单→落盘路径→webroot 可达→解析执行,逐环判成立条件
- 业务逻辑:每个状态转移查三样东西(操作者身份/数据归属/状态前置)
- 基座与依赖:过滤链逐行读、pom 版本比对已知 CVE
拆路的意义不是快,是每路有明确的 checklist 和产出契约(证据必须 文件:行号、置信度分四级),防止审计发散。上一轮我就靠路 2 挖到了框架自带接口的 SQLi(见上一篇)。
Phase C:实例判定
白盒结论必须回线上实例做黑盒判定——低频、只读、单发。JeecgBoot/Shiro 系我沉淀了一张响应矩阵,判定 anon 边界不用猜:
| 响应 | 含义 |
|---|---|
参数校验错误 JSON(Required String parameter...) | 穿过过滤器到 Controller = anon 放行 |
500 + AuthenticationException: token为空 | 被过滤器拦 = 不在 anon 清单 |
405 不支持GET请求方法 | 到 handler = anon 放行(GET 打 POST 端点,零副作用判定法) |
| Tomcat 404 | 无 handler,模块不存在 |
| 超时 | 别急着判 WAF,拉长超时拿真实异常(可能是后端基建故障) |
红线
- 实例验证只读、低频(秒级间隔)、单次判定,禁真实上传、禁删改、禁批量
- 挖到的凭据只记录不验证,报告里打码
- 写操作需要明确授权才动
- 代码引用必须来自真实读过的文件(文件:行号),推演的部分标出来
小结
这套流程的核心就一句话:黑盒榨干之后,源码就是答案,而源码经常就在 GitHub 上。指纹提取得够独特,狩猎就是体力活;审计拆得够细,0day 就是概率事件。