JSON格式的胜利:一次未授权接口的曲折发现之旅
字数 1126 2025-09-01 11:26:11
JSON格式的胜利:未授权接口发现技术详解
1. 渗透测试背景与初始评估
1.1 目标系统
- 目标URL:http://www.xxxx.com/#/login
- 系统类型:业务系统登录页面
1.2 初始攻击尝试与结果
-
弱口令爆破
- 尝试组合:admin/admin123、test/123456等
- 系统响应:"账号或密码错误"
- 防御机制:触发5分钟锁定策略
-
登录绕过尝试
- 修改Cookie:
authenticated=false改为true→ 服务端校验失效 - 删除身份校验参数 → 302重定向至登录页
- 添加X-Forwarded-For头伪造IP → 无权限响应
- 修改Cookie:
-
目录扫描
- 有效发现:/robots.txt、/static/等非敏感路径
- 结果:大量404响应
2. 关键突破点:前端代码分析
2.1 前端资源分析
- 开发者工具(F12)发现两个核心JS文件:
vendor.js:第三方库文件index.js:业务核心代码
2.2 API接口发现
在index.js中发现多个API接口路径,包括:
/api/user/login/api/user/info/api/data/list/api/config/get
3. 自动化接口探测技术
3.1 手工测试局限性
- 单个接口测试效率低下
- 需要系统化的探测方法
3.2 Python自动化脚本实现
import re
import sys
import json
def extract_paths(js_content):
"""
从JavaScript代码中提取所有以/开头或./开头的路径
包括带变量的路径处理
"""
# 模式1: 匹配"/..."形式的路径(带变量处理)
pattern1 = r'["\'](/[^"\'\s]+)["\']'
# 模式2: 匹配"./..."形式的相对路径
pattern2 = r'["\'](\.[^"\'\s]+)["\']'
paths = re.findall(pattern1, js_content) + re.findall(pattern2, js_content)
return list(set(paths)) # 去重
def main():
if len(sys.argv) < 2:
print("Usage: python extract_api.py <js_file>")
return
with open(sys.argv[1], 'r', encoding='utf-8') as f:
content = f.read()
api_paths = [path for path in extract_paths(content) if '/api/' in path]
with open('api_list.txt', 'w') as f:
for path in api_paths:
f.write(path + '\n')
print(f"Found {len(api_paths)} API paths. Saved to api_list.txt.")
if __name__ == '__main__':
main()
3.3 脚本功能说明
- 使用正则表达式匹配两种路径模式:
- 绝对路径:以
/开头 - 相对路径:以
./开头
- 绝对路径:以
- 特别筛选包含
/api/的路径 - 结果去重后保存到
api_list.txt
4. 未授权访问漏洞利用
4.1 测试策略
- 对发现的API接口进行逐个测试
- 重点关注:
- 无需认证的接口
- 返回敏感数据的接口
- 允许修改操作的接口
4.2 典型漏洞场景
- 开发环境残留:测试/开发环境接口未移除
- 权限校验遗漏:部分接口忘记添加权限控制
- 接口协议认知差:开发人员对接口安全理解不足
5. 防御建议
5.1 开发阶段
- 实施统一的API网关进行权限控制
- 自动化API文档生成与安全检查
- 开发/测试环境与生产环境严格隔离
5.2 运维阶段
- 定期API接口审计
- 实施严格的访问控制策略
- 敏感接口监控与告警
5.3 安全测试
- 将API接口扫描纳入常规安全测试
- 特别关注前端暴露的接口路径
- 自动化API安全测试工具集成
6. 总结与经验
- 关键发现:前端代码常暴露后端API结构
- 突破思路:从表面防御转向协议层分析
- 核心原则:漏洞常生于逻辑边界的模糊地带
- 方法论:自动化工具可大幅提高测试效率
通过这种系统化的方法,安全测试人员可以有效地发现和验证未授权访问漏洞,帮助组织提高系统安全性。