信息收集与侦察:API端点发现、Swagger/OpenAPI文档分析、子域名枚举与指纹识别
各位同学,欢迎来到第二章。
说实话,很多人做渗透测试,上来就拿着Burp Suite乱点一通。我见过太多这样的案例了——花了三小时,结果连目标API有几个端点都没搞清楚。这就像打仗不看地图,直接冲进雷区。
信息收集,说白了就是画地图。你画得越细,后面踩雷的概率就越低。我个人习惯,花在信息收集上的时间,至少要占到整个渗透测试的40%。别嫌多,这很值。
2.1 API端点发现:从哪下手?
API端点是什么?就是你和后端服务对话的「门牌号」。比如 /api/v1/users、/graphql 这些。找不到门,你连攻击面都摸不着。
我常用的方法分三类:
- 爬虫与目录爆破:用工具硬扫。
- 流量分析:抓包看真实请求。
- 源码泄露:从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 实战整合:一个完整的侦察流程
说了这么多,我给大家串一个完整的流程。这是我个人习惯的套路:
- 先被动收集:用Subfinder跑子域名,用Google dork找Swagger文档。
- 再主动探测:用ffuf爆破端点,用curl看响应头。
- 然后分析文档:找到OpenAPI文档后,导出所有端点列表。
- 最后整理成表:把发现的端点、方法、参数、认证要求都记下来。
我一般会用Excel或者Notion整理成这样的表格:
| 端点 | 方法 | 认证 | 备注 |
|---|---|---|---|
| /api/v1/users | GET | JWT | 返回用户列表 |
| /api/v1/users/{id} | DELETE | Admin Only | 可能存在IDOR |
| /swagger.json | GET | 无 | 泄露全部接口 |
有了这张表,后面的渗透测试就是按图索骥了。你想想看,比起漫无目的地乱扫,是不是高效得多?
最后提醒一句:信息收集不是一次性工作。渗透过程中发现新线索,随时回头补充。我经常在测试到一半时,因为某个错误信息又发现了一个新端点。
好了,这一章的内容就到这里。下一章我们会讲「认证机制绕过」,到时候我会分享一些绕过JWT和OAuth的实战技巧。各位先把信息收集练扎实了,后面才能事半功倍。