信息收集与侦察:API端点发现、Swagger/OpenAPI文档分析、子域名枚举与指纹识别

各位同学,欢迎来到第二章。

说实话,很多人做渗透测试,上来就拿着Burp Suite乱点一通。我见过太多这样的案例了——花了三小时,结果连目标API有几个端点都没搞清楚。这就像打仗不看地图,直接冲进雷区。

信息收集,说白了就是画地图。你画得越细,后面踩雷的概率就越低。我个人习惯,花在信息收集上的时间,至少要占到整个渗透测试的40%。别嫌多,这很值。

2.1 API端点发现:从哪下手?

API端点是什么?就是你和后端服务对话的「门牌号」。比如 /api/v1/users、/graphql 这些。找不到门,你连攻击面都摸不着。

我常用的方法分三类:

  1. 爬虫与目录爆破:用工具硬扫。
  2. 流量分析:抓包看真实请求。
  3. 源码泄露:从JS文件、Git仓库里翻。

先说说目录爆破。我最常用的工具是 ffuf,速度快,还支持递归扫描。举个例子:

ffuf -u https://target.com/api/FUZZ -w /usr/share/wordlists/api_endpoints.txt -mc 200,201,301,403

这里 -mc 参数我特别强调一下。很多人只关注200,但403(禁止访问)其实更有价值——说明端点存在,只是你没权限。我在一次项目中,就靠一个403的 /admin/users 端点,结合后续的越权漏洞,直接拿到了管理员权限。

重点:403 ≠ 没用。它告诉你「这里有东西,只是你进不去」。这是后续权限提升的绝佳线索。

另外,别忘了检查 robots.txt 和 sitemap.xml。有些开发人员会把API路径写在这里,以为搜索引擎爬不到就安全了。嗯,天真。

2.2 Swagger/OpenAPI文档分析:白给的宝藏

Swagger(现在叫OpenAPI)是API的说明书。它告诉你每个端点用什么参数、返回什么格式、甚至需要什么认证。你想想看,这相当于把攻击面直接摆在你面前。

常见的Swagger文档路径:

路径 说明
/swagger.json 标准JSON格式
/api/docs 常见于Django REST Framework
/v2/api-docs Spring Boot默认路径
/openapi.json 新版OpenAPI规范

拿到文档后,我一般会做三件事:

  • 找未授权端点:看哪些接口没有 Authorization 要求。
  • 分析参数类型:是JSON还是Form Data?有没有文件上传?
  • 看枚举值:比如 role: [admin, user, guest],这直接告诉你权限分级。

我曾经遇到一个项目,Swagger文档里暴露了一个 /api/v1/debug/reset-password 的接口,而且没有认证。你猜怎么着?这个接口可以直接重置任意用户的密码。嗯,这就是典型的「开发环境配置忘了删」。

小技巧:用 swagger-ui 本地加载文档,可以直接在UI里测试请求。比看JSON省力多了。

2.3 子域名枚举:别只盯着主站

很多公司把API部署在子域名上,比如 api.target.com、dev-api.target.com。主站防护做得固若金汤,子域名却可能漏洞百出。

我常用的枚举工具:

  • Subfinder:被动收集,速度快。
  • Amass:主动+被动,信息更全。
  • dnsx:验证解析是否存活。

一条典型的命令链:

subfinder -d target.com -o subs.txt
dnsx -l subs.txt -o alive.txt

拿到存活子域名后,我会重点关注带 api、dev、staging、test 这些关键词的。为什么?因为这些环境往往安全配置最薄弱。

我记得有一次,主站 api.target.com 做了WAF防护,怎么打都进不去。结果在子域名枚举时发现 staging-api.target.com,不仅没有WAF,连认证都只做了前端校验。我直接绕过去,拿到了生产数据库的备份文件。

注意:子域名枚举可能会触发告警。建议用代理或调整请求频率,别把自己IP封了。

2.4 指纹识别:知道对手是谁

指纹识别就是判断API背后是什么技术栈。是Nginx还是Apache?是Django还是Express?知道了这些,你才能针对性地找漏洞。

我常用的方法:

  • 响应头分析:Server、X-Powered-By 这些头直接暴露信息。
  • 错误页面:故意发个错误请求,看返回的堆栈信息。
  • 工具辅助:WhatWeb、Wappalyzer。

举个例子,如果响应头里有 X-Frame-Options: DENY,说明可能是Django。如果返回 {"error": "Not Found"} 而不是HTML,那大概率是纯API框架。

另外,我习惯用 curl -v 看完整响应头:

curl -v https://api.target.com/

输出里会包含 Set-Cookie、Content-Type 等关键信息。比如 sessionid 这个cookie名字,基本就是Django没跑了。

为什么会这么重视指纹识别?因为不同框架的漏洞库完全不同。你拿Spring的漏洞去打Express,那不是白费力气吗?

2.5 实战整合:一个完整的侦察流程

说了这么多,我给大家串一个完整的流程。这是我个人习惯的套路:

  1. 先被动收集:用Subfinder跑子域名,用Google dork找Swagger文档。
  2. 再主动探测:用ffuf爆破端点,用curl看响应头。
  3. 然后分析文档:找到OpenAPI文档后,导出所有端点列表。
  4. 最后整理成表:把发现的端点、方法、参数、认证要求都记下来。

我一般会用Excel或者Notion整理成这样的表格:

端点 方法 认证 备注
/api/v1/users GET JWT 返回用户列表
/api/v1/users/{id} DELETE Admin Only 可能存在IDOR
/swagger.json GET 无 泄露全部接口

有了这张表,后面的渗透测试就是按图索骥了。你想想看,比起漫无目的地乱扫,是不是高效得多?

最后提醒一句:信息收集不是一次性工作。渗透过程中发现新线索,随时回头补充。我经常在测试到一半时,因为某个错误信息又发现了一个新端点。

好了,这一章的内容就到这里。下一章我们会讲「认证机制绕过」,到时候我会分享一些绕过JWT和OAuth的实战技巧。各位先把信息收集练扎实了,后面才能事半功倍。