API安全漏洞防范指南
torah 发表于 河南 WEB安全 2626浏览 · 2024-03-27 02:25

前言

2024年3月,安全公司 Fastly发布了一项调查报告,报告显示95%的企业在过去1年中遇到过 API 安全问题。本文参照OWASP API Security Top 10,结合金融行业业务特点和java开发技术栈,介绍API面临的安全漏洞问题,同时从开发设计层面提供API安全漏洞的防范指南。

1、防范敏感信息泄漏

信息安全三要素是机密性、完整性、可用性,机密性往往是最重要的。金融业务需要重点保护客户敏感隐私信息,因此需按照最小权限原则回显敏感信息,这就涉及到信息脱敏和信息加密。

1.1、信息脱敏

Api接口接收客户端请求,返回处理结果,可能会涉及到敏感信息在客户端展示,在可以脱敏的场景,需要将姓名、证件号、卡号、手机号、车牌号等敏感数据脱敏后再通过接口返回给客户端,不影响客户正常使用,同时避免了中间人攻击、越权攻击、不安全的客户端环境、客户端截录屏打印日志等造成客户信息泄漏。

脱敏一般使用掩码方式,示例如下:

原始返回报文:

{
    "name": "张三丰",
    "phonenumber": "13812345678",
    "cardnumber": "440102198001011230"
}

掩码后返回报文:

{
    "name": "张*丰",
    "phonenumber": "138****5678",
    "cardnumber": "440102********1230"
   }

1.2 、信息加密

在无法将敏感数据脱敏的场景,需要将敏感信息进行加密,加密手段包括字段级加密、全报文加密及传输通道SSL加密等。

对称密码算法包括:SM4、AES;非对称密码算法包括:SM2、RSA;杂凑算法包括:SM3、SHA256等。

避免使用DES、MD5、SHA1等不安全的密码算法。

加密后返回报文示例:

{
    "name": "U2FsdGVkX1+6xty45vaK0uJXOdsBf1F/FplVmzrK2Q0=",
    "phonenumber": "U2FsdGVkX1+YWbyzBRJTdNgLp/td+eQ5+OTCYl72vRM=",
    "cardnumber": "U2FsdGVkX18fGJUEzwHdqlqr6kq6BtxAebXX8gO3W4kTRRlOH9F07SSrlZkcx8Er"
}

2、防范API权限问题

API权限问题分为功能级越权和对象级越权,功能级越权是非法访问API接口,包括未授权访问和垂直越权;对象级越权即水平越权是有权限访问API接口,但是篡改了请求参数访问了其他对象的数据资源。

2.1 、防范未授权访问

防范API未授权访问需要做好客户端身份认证,身份认证机制包括AK/SK、Token、Cookie、数字签名等方法,身份认证凭据需要有超时失效机制,一般情况下互联网系统身份认证凭据时间不能超过15分钟。服务端不能依据客户端发送的userid、name、role等简易身份标识判断用户身份。

服务端可以针对API接口创建拦截器,对请求接口进行过滤拦截,对当前用户和当前请求做权限判断。访客用户只能访问不含敏感信息的公开接口,如涉及敏感信息功能接口需要跳转到登录页面。

Spring Security 、Shiro都可以提供api授权的管理功能,以使用范围较广的Shiro为例,要防止未授权访问需要用到Shiro的认证拦截器:anon、authcBasic、auchc、user、logout

示例如下:

//拦截器.
         Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
         // 允许匿名访问静态资源
         filterChainDefinitionMap.put("/static/**", "anon");
         //配置退出 过滤器
         filterChainDefinitionMap.put("/logout", "logout");
         //authc:所有url都必须认证通过才可以访问;
         filterChainDefinitionMap.put("/**", "authc");

         //访问未授权界面跳转到统一的错误页面
         shiroFilterFactoryBean.setUnauthorizedUrl("/403");
         shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

2.2 、防范垂直越权

防范垂直越权同样可以针对API接口创建拦截器,对请求接口进行过滤拦截,对当前用户和当前请求做权限判断。低权限用户不能访问高权限用户的功能接口,需要切换登录用户为高权限角色。

垂直越权需要用到shiro的授权拦截器:perms、roles、ssl、rest、port

示例如下:

//增加拦截器,必须是管理员角色可以访问
filterChainDefinitionMap.put(“/admin/**”, “roles[100001]”);

2.3 、防范水平越权

对于水平越权问题本质上还是要对访问数据做权限控制或者对访问资源做用户隔离(sql语句带上userId进行操作),这样就可以保证操作不到其他人的数据了。

缓解措施包括对请求参数使用随机且不可预测的值作为请求参数,可以阻止攻击者遍历请求参数,批量操作其他用户敏感数据。

sql操作示例如下:

select * from orders where order_id = #{orderId} and user_id = #{userId}

3、防范高频恶意访问

3.1 防范资源浪费

应用系统运行依赖第三方服务,如运营商短信服务、宽带服务等,如果这些接口未限制调用频率,则可能导致攻击者批量请求该接口,导致资源浪费。如发送短信接口,需要请求运营商计费接口,每条短信消耗0.01元,如攻击者可能自定义超长短信内容拆分发送,或批量发送短信验证码,造成公司资金损失,或者批量发送验证码给正常用户,造成短信验证码频繁骚然客户,影响客户体验。

对一些可能产生资源浪费的接口(如发送短信,上传/下载大文件等)限制请求频率,超过一定次数(如3次)需要进行人机交互验证(图形验证码等)

如下批量请求短信发送接口造成资源浪费:

base_url="http://xxx/"
post_data="mobile=13812345678"
for i in range(10000):
    requests.post(url=base_url+"/sendsms",data=post_data)

3.2 、防范拒绝服务

应用系统稳定运行依赖CPU、内存、磁盘、JVM Buffer等基础资源,涉及到消耗CPU性能的运算接口,占用内存、磁盘和JVM Buffer的文件上传接口,对于消耗CPU资源的接口需要限制请求频率,超过一定次数需要进行人机交互验证(图形验证码等)。对于消耗内存、磁盘和JVM Buffer的接口,需要限制请求数据包大小和请求频率。

如下示例发送超大的数据包,有些web扫描器也会发送类似请求绕过WAF规则,API处理不当可能导致服务响应缓慢。

base_url="http://xxx/"
post_data="data="+"A"*1000000
for i in range(10000):
    requests.post(url=base_url+"/submit",data=post_data)

4、防范注入类安全漏洞

4.1对传入参数进行校验

对传入的参数进行实施合法性、有效性校验,校验内容包括且不限于:类型、长度、格式、取值范围、特殊字符检查。

同时服务端做好对SQL注入、代码注入、反序列化命令执行等注入类漏洞和SSRF、URL跳转漏洞做好防范。

4.2 对返回数据进行校验

对返回客户端的数据进行合法性、有效性校验,防范因页面渲染导致的XSS、点击劫持等前端安全漏洞,防范将敏感信息(如异常错误堆栈)返回给客户端。

5、防范重放攻击

5.1增加时间戳校验

一次正常的http请求, 响应时间般在1s内完成, 基本上不会超过10s, 服务端根据API接口的响应时间设置阀值,拒绝超过设个时间阈值的客户端请求。

5.2 增加随机因子或交易流水号校验

客户端每次发起请求,都需要携带随机数或交易流水号,服务端接收到请求后,先校验用户携带的随机数或交易流水号是否存在,如不存在,则将随机数或交易流水号存储到数据库或缓存服务器中,如存在则认为是重放攻击。

6、防范交易抵赖

6.1 通过数字签名实现原发性抗抵赖

高风险交易和操作应通过数字签名技术实现原发性抗抵赖功能,客户端可以通过数字证书、Ukey等方式对交易报文进行签名,服务端通过验签实现原发性抗抵赖。

6.2 保存原发性证据

资金类交易应保存的原发性证据还应至少包括:

  1. 交易流水号
  2. 相关账户号
  3. 交易终端标识
  4. 相关交易指令号;

应具有详细的交易流水查询功能,包括但不限于日期、时间、交易卡号、交易金额和资金余额等信息。

7、防范业务逻辑漏洞

7.1 确保交易流程完整性

应保证各交易流程的完整性,确保用户按预期流程操作,防止跳过预设环节或打乱环节次序,从而破坏交易流程的完整性。

应依照如下原则确保交易数据的完整性:

  1. 使用服务器端保存的、已经过合法性检查的数据完成交易
  2. 对客户端提交的交易数据实施合法性检查后,再进入后续处理环节
  3. 如交易过程中需与客户端多次交互,则每次从客户端获取交易数据后,均需重新实施数据合法性检查,避免中途提交非法数据破坏交易的完整性。

7.2 防范条件竞争漏洞

在签到、领取积分、使用优惠券等页面,通过短时间发送大量请求可能导致条件竞争漏洞。

Spring本身不是多线程安全的,使用spring框架开发应该尽量使用局部变量而不是共享变量,使用ThreadLocal来存储和传递上下文信息,基本就可以避免条件竞争漏洞了。

8、避免调试接口暴露

应用系统测试类、调试类接口只允许内网测试环境使用,严禁对互联网开放,例如:Swagger接口、api-docs接口禁止在互联网环境启用。

应用系统监控类接口只允许内网测试环境使用,严禁对互联网开放,例如:Spring Actuator接口页面禁止在互联网环境启用。

总结

本文所述漏洞和OWASP API TOP 10 2023版对应关系如下:

其中API3 对象属性级别授权失效对应Spring MVC自动绑定漏洞实际环境几乎没有遇到过,API 6不受限访问敏感业务涉及到业务安全,不再展开描述。

本文覆盖了OWASP API TOP10的8种漏洞类型,同时增加了金融业务关注的防重放和交易抗抵赖,希望对金融安全从业者有所帮助。

参考链接

http://www.owasp.org.cn/OWASP-CHINA/owasp-project/owasp-api-security-top-104e2d6587987976ee/

1 条评论
某人
表情
可输入 255