摘要:在数字化高速发展的金融行业,攻击面管理(ASM)已成为构建企业安全的核心策略之一。尽管ASM工具帮助企业从攻击者的视角识别和管理互联网资产,但作为金融服务互联互通基石的API接口,往往未在传统攻击面管理中得到足够重视和系统梳理。因此,基于主动安全防护策略,深入探讨如何有效发现、梳理和管理企业的API接口,以提升整体API安全性,确保企业资产与客户信息的安全,全面防范潜在的安全威胁,实现最佳安全实践。
关键字:API安全、主动防护、数字供应链安全、数据安全、安全运营开发安全
一、引言
近年来,随着国家对网络和数据安全的重视和实战演练、红蓝对抗演练的深入推进,黑客的攻击手法不断升级演变。数字供应链攻击频繁发生,大量0day漏洞被广泛利用。通过深入分析这些漏洞的利用方式后发现,无论是第三方采购系统还是自研系统,攻击的根源大多集中在API的安全问题上。
二、API安全
1、API漏洞导致引发的信息泄漏
某机构数据泄露案例:2020年,某平台因其终端APP的业务逻辑API被非法调用,导致约3.5亿用户数据泄露;2021年,某家大型电商平台遭遇了API接口被攻击的事件,结果导致超过11.8亿用户的敏感信息,包括用户ID、昵称、手机号和用户评价等被泄露。
国外各行业信息泄露案例:2018年,某国外邮政局修复了一个API安全漏洞,其中有6000万邮政用户受该安全漏洞影响;2018年,国外某交友平台遭遇了多起严重的数据安全漏洞事件,导致大量用户数据被泄露。其中最严重的一次是在9月份,一个安全漏洞导致黑客可能控制了约5000万用户账号。接着在10月,攻击者窃取了约2900万用户的详细个人资料;2021年,攻击者利用API漏洞获取了超过7亿某国外招聘平台用户的数据,并将这些数据在某网站上进行销售。
2、目前的防护手段
为应对这些安全挑战,在开发阶段,实施DevSecOps开发安全流程,结合SAST(静态应用安全测试)和IAST(交互式应用安全测试)等工具,对代码进行全面的安全性检测,提前发现并修复潜在漏洞。上线后,通过部署WAF(Web应用防火墙)和RASP(运行时应用自我保护)等安全设备,提供实时防护。此外,现有的API安全产品从API网关、流量镜像、日志分析等多个方面对API进行全面梳理和监测,实时识别异常流量和潜在攻击行为,及时拦截安全风险。
尽管防护手段和API安全产品能够有效抵御大部分API攻击,但每天仍有大量攻击得逞。因此,可以尝试从黑客的视角实施API攻击面管理,以进一步完善API安全实践。
3、API安全实践方法论
需要遵循以下五大核心原则,即全面性、层次性、适应性、动态性和预防性。
1、全面性原则要求从宏观角度考虑API接口涉及的所有主体,确保所有相关主体都得到识别和管理。
2、层次性原则要求对每个主体进行深入分析,深入到每个主体的多层目录,其中不同层目录可能关联不同的系统。
3、适应性原则要求适应各种不同的前端框架,确保无论在何种技术栈下,都能有效地进行接口管理。
4、动态性原则要求具备高度的灵活性,能够及时更新和调整各种规则策略。
5、预防性原则强调在安全问题发生前,通过持续监测及时发现潜在的安全漏洞,并迅速进行修复。
4、API攻击面管理架构
三、API安全实践架构方案
1、访问目标地址提取出自动加载的JS地址和静态地址
获取JS地址有如下三种方式——加载当前域JS、加载CDN JS、加载其它域JS。
(1)加载的当前域JS:访问的URL地址为https://xxx.domain.com,该URL加载了当前域的JS(https://xxx.domain.com/js/yyy.js)。
(2)加载的CDN JS:访问的URL地址为https://xxx.domain.com,该URL加载了CDN的JS(https://xxxcdn.com/js/yyy.js)。
(3)加载的其他域JS:访问的URL地址为https://xxx.domain.com,该URL加载了其它域的JS(https://xxx.domain.com:8080/js/yyy.js)。
(4)静态地址:访问的URL地址为https://xxx.domain.com,该URL地址加载了静态地址(https://xxx.domain.com/path/zzz.html)。提取静态地址的目的是在于全面获取目标网站的所有业务功能页面,确保不遗漏任何相关接口。
2、提取网页未自动加载的JS地址
请求上述步骤获取到的JS地址,通过正则匹配语法,提取出在网页源码里的JS地址。
请求上述步骤获取到的静态地址,通过正则匹配语法,提取出在网页源码里的JS地址。
3、从webpack(JavaScript 应用程序的模块打包工具)提取JS地址
下图就是通过webpack打包JS地址的效果,实际上其中一个JS地址为/static/js/chunk-60893c6c.6867bfa5.js,因此需要通过正则语法精确提取出红框里的内容,并拼接成完整的JS地址。
4、Base URL发现
Base URL 可以理解为每个微服务的服务名称。在许多微服务架构的系统中,每个微服务都包含着大量的 API 接口,因此寻找 API 接口的关键之一是确定正确的微服务名称。
微服务名称通常体现在 URL 地址的不同路径中,这个路径我称之为 Base URL。
寻找Base URL有两种方式——自动加载的URL地址里就有Base URL、自动加载的API接口里提取出Base URL。
(1)自动加载的URL地址里就有Base URL:访问的URL地址为https://xxx.domain.com,该URL地址自动加载了地址(https://xxx.domain.com/authControl),那么可以认为authControl就是Base URL。
(2)自动加载的API接口里提取出Base URL:访问的URL地址为https://xxx.domain.com,该URL地址自动加载了某API接口(https://xxx.domain.com/ophApi/checkCode/getCheckCode),在后续的API接口提取步骤中如果发现某API接口是/checkCode/getCheckCode,那么就会将ophApi当作Base URL。
5、API接口的提取和Fuzz
(1)请求上述所有的JS 地址,并通过全面的正则表达式规则提取出 API 接口。例如,下图所示的 API 接口“/service/getFile?filePath=”。
(2)使用常见的API接口字典进行Fuzz测试,内置了一些常见的API接口字符串,以补充和完善API接口的提取过程。
6、Swagger各版本解析
支持解析各种版本的 Swagger规范,能够精确提取所有API接口、请求方式、参数名称和参数类型。
7、过滤危险接口
有些API接口可能涉及删除或取消等业务操作,因此需要对这些接口进行过滤。内置了以下关键字来过滤危险接口。
8、无参三种形式请求所有API接口
上述步骤已提取出所有API接口,并通过 GET、POST DATA 和 POST JSON 三种请求方式逐一请求这些接口,保存每个接口的响应包内容。
9、智能提取参数
从无参三种请求形式保存的API 接口响应包中提取参数,具体包括以下三种情况:
(1)提取响应包内容中的key 作为参数:
如果响应包包含字段名,这些字段名将被提取为参数。例如,提取出id 和 branchCollegeName。{"code":0,"msg":"success","data":[{"id":"xxxxxx","branchCollegeName":"xxxxxxxx"}]}
(2)提取key 为 param 或 parameter时所对应的 value 作为参数:例如,提取出 imageId。
{"code":200,"data":{"param":"imageId"}}
(3)提取响应包内容报错时,错误信息中提示缺失的内容作为参数:例如,提取出types 或 accountId。
{"code":1,"msg":"Required List parameter 'types' is not present","data":null}
{"code":500,"msg":"accountId不能为空"}
如下是提取出的参数名列表
10、有参三种形式请求所有API接口
从上述步骤中整理出所有参数名称后,再次通过GET、POST DATA和POST JSON三种请求方式,携带这些参数逐一请求所有API接口,并保存每个接口的响应包内容。
11、Bypass测试API接口
对于返回状态码301、302、401、404 等或者响应包为空的 API 接口,内置了十多种绕过方法(Bypass 技术)进行再次测试。
四、数据整理
在整个方案架构设计中,设置了三种数据存储方式,分别为文本文件(txt)、电子表格(Excel)和数据库(MySQL)。
下图展示了数据库中存储的“自动加载的URL”表。其中,url字段表示被检测的URL地址,load_url字段表示自动加载的URL地址,load_url_type字段表示自动加载URL地址的类型。例如,js表示该URL地址是JS文件,而no_js则表示静态地址或非JS类型的API接口等。referer字段则说明自动加载的URL地址来源于哪个URL。
下图展示了数据库中存储的“存活的JS和静态URL”表。其中,js_static_url字段表示JS地址或静态URL,url_type字段表示其类型。例如,js_url表示该URL地址为JS文件,static_url表示静态地址。status_code字段表示响应的状态码,res_length字段表示响应包内容的长度。
下图展示了数据库中存储的“JS地址里提取出来的所有api接口”表。其中,api_path字段表示提取出来的API接口。
下图展示了数据库中存储的“Tree URL和BaseURL”表。其中,tree_url字段表示被检测的URL地址加载了其它的URL,例如前后端分离的架构情况。Base URL在上述解释过,可以理解为微服务的接口地址。
下图展示了数据库中存储的“参数”表。其中,parameter字段表示提取出来的参数名。
下图展示了数据库中存储的“无参和有参三种请求方式结果”表。其中,api_url字段表示API接口地址,method字段表示请求方式,包括GET、POST DATA和POST JSON三种方式。parameter字段表示请求API接口时携带的参数。res_type字段表示响应包的返回格式,code字段表示响应状态码,length字段表示响应包内容的长度。
这张表需要特别关注,因为在后续的运营过程中,通过分析这些数据可以发现大量Web漏洞。举例说明:
寻找RCE漏洞:在api_url和parameter字段模糊匹配ping、cmd、command等关键词。
寻找URL跳转或者SSRF漏洞:模糊匹配url、ip等关键词。
寻找任意文件上传或者读取漏洞:模糊匹配upload、download、read、file等关键词。
寻找未授权访问漏洞:模糊匹配get、config等关键词。
下图展示了数据库中存储的“响应包差异化”表。其中,content_hash字段表示响应包内容的哈希值,num字段表示该哈希值出现的次数,length字段表示对应响应包内容的长度,file_path字段表示响应包保存的文件路径。
添加响应包差异化功能的原因在于,当测试 API接口时未携带凭证,许多返回结果会是相同的提示缺少凭证的内容。通过此方法,可以快速过滤掉大量重复的响应包,从而降低运营成本。
下图展示了数据库中存储的“敏感信息泄漏”表,可以看到其中包含泄漏的敏感信息,如JDBC连接语句、账号密码、私钥、凭证,以及各种云平台的 AKSK等。
五、实战案例
未授权漏洞:从响应包中匹配出敏感内容,经进一步测试,确认该接口存在API接口未授权导致用户敏感信息泄漏漏洞。
任意用户登录漏洞:从API_URL中匹配出相关漏洞的关键词(login、sso等),经进一步测试,确认该接口存在任意用户登录漏洞。
RCE漏洞:从API_URL中匹配出相关漏洞的关键词(ping等),经进一步测试,确认该接口存在远程命令执行漏洞。
文件上传漏洞:从API_URL中匹配出相关漏洞的关键词(upload、file等),经进一步测试,确认该接口存在任意文件上传漏洞。
Bypass:该 API 接口的初始响应包长度为空,触发了 Bypass 绕过功能。通过发起 Bypass 请求,发现某个绕过方法使响应包长度不再为空。经进一步测试,确认该接口存在 API 认证绕过漏洞。
六、总结与展望
API攻击面管理的优势
1. 化被动为主动:通过主动探测技术,全面发现并梳理API接口,并智能分析出多层目录结构。
2. 高度适配当前主流前端技术:深入扫描并解析应用中的JS文件,兼容Vue、Webpack等主流前端框架,借助强大的正则表达式精准提取API接口,全面发现影子API和僵尸API。
3. 模拟真实攻击手段:智能提取API参数,结合多种探测方式和bypass技术,对所有接口进行深入的安全性测试。
4. 全面数据记录与管理:详细记录API接口的各类数据,支持深度分析和二次利用,实现高效的梳理和管理。
5. 漏洞检测:基于响应包差异分析过滤无效数据,快速发现未授权访问,敏感信息泄漏及RCE等漏洞。
在当前数字化时代,API领域仍然是一个关键的挑战,这些接口的安全漏洞成为了数据泄露和网络攻击的重要入口。企业需要投入更多资源来加强API的安全设计、实施以及监控管理。
展望未来,API安全将更多地依赖于智能化和自动化的解决方案。人工智能和机器学习等新兴技术也将被更广泛地应用于API安全,实现更为主动的安全防护。
原文始发于微信公众号(0x727开源安全团队):主动防护视角下的API安全实践
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论