OWASP API TOP 10

本文搬运自:https://apisecurity.io/encyclopedia/content/owasp/owasp-api-security-top-10.htm

TOP1:2019 —破碎的对象级别授权

没有对请求的id进行适当的检查,导致遍历id即可越权访问其他用户可访问的数据,这种攻击也称为IDOR(不安全的直接对象引用)。

用例

  • API调用参数使用通过API访问的资源的ID /api/shop1/financial_info
  • 攻击者用他们猜测出的另一种ID替换其资源的ID /api/shop2/financial_info
  • 该API不检查权限,而是允许请求通过。
  • 如果ID可以枚举,则会加剧问题/api/123/financial_info

如何预防

  • 使用用户策略和层次结构实施授权检查。
  • 不要依赖客户端发送的ID。请改用存储在会话对象中的ID。
  • 检查每个客户端访问数据库请求的授权。
  • 使用无法猜测的随机ID(UUID)。

TOP2:2019 —身份验证失败

API的身份验证可以伪造,token或sign本地生成可以伪造等都可以使得攻击者可以以其他用户的身份。

用例

  • 被视为“内部”的不受保护的API
  • 不遵循行业最佳实践的弱认证
  • 不会旋转的弱API密钥 (对称加密)
  • 弱密码,纯文本密码,加密密码,散列错误密码,共享密码或默认密码
  • 身份验证容易受到蛮力攻击和凭证填充
  • URL中包含的凭证和密钥
  • 缺少访问令牌验证(包括JWT验证)
  • 未签名或签名较弱的未到期JWT

如何预防

  • 检查所有可能的方式以对所有API进行身份验证。
  • 密码重置和一次性链接的API还允许用户进行身份验证,并且应同样严格地加以保护。
  • 使用标准身份验证,令牌生成,密码存储和多因素身份验证(MFA)。
  • 使用短期访问令牌。
  • 对您的应用进行身份验证(以便您知道谁在与您聊天)。
  • 使用更严格的速率限制进行身份验证,并实施锁定策略和弱密码检查。

TOP3:2019 —数据暴露过多

将过多的数据返回给用户,比如请求用户名的API接口返回了 这个用户在数据库中的所有信息,这将使得你了解所有,这取决于客户端进行筛选。如果攻击者直接使用该API,他们将拥有全部。

用例

  • 该API返回完整的数据对象,因为它们存储在后端数据库中。
  • 客户端应用程序过滤响应,仅显示用户真正需要查看的数据。
  • 攻击者直接调用API,并获取UI会过滤掉的敏感数据。

如何预防

  • 永远不要依赖客户端来过滤数据!
  • 查看所有API响应,并使其适应API使用者的实际需求。
  • 仔细定义所有API响应的架构。
  • 不要忘记错误响应,也要定义正确的架构。
  • 识别所有敏感数据或个人身份信息(PII),并证明其使用合理性。
  • 强制执行响应检查以防止数据意外泄漏或异常。

TOP4:2019 —缺乏资源和速率限制

没有针对过多的调用或有效载荷大小保护API。攻击者可以将其用于拒绝服务(DoS)和诸如蛮力攻击之类的身份验证缺陷。

用例

  • 攻击者通过发送超出其处理能力的请求使API过载。
  • 攻击者以超过API处理速度的速度发送请求,从而阻塞了请求。
  • 请求的大小或其中的某些字段超出了API可以处理的大小。
  • “ Zip炸弹”是指经过设计的存档文件,因此,解压缩这些文件会占用大量资源,并使API过载。

如何预防

  • 定义适当的速率限制。
  • 限制有效负载大小。
  • 调整速率限制以匹配需要或应允许获得的API方法,客户端或地址。
  • 添加压缩率检查。
  • 定义容器资源的限制。

Top5:2019 —功能级别授权已损坏

该API依赖于客户端以适当地使用用户级别或管理员级别的API。攻击者找出“隐藏的”管理API方法并直接调用它们。(可以在app反编译后寻找)

用例

  • 一些管理功能公开为API。
  • 普通用户如果知道如何可以未经授权访问这些功能。
  • 可以是知道URL的问题,或使用其他动词或参数的问题:
    • /api/users/v1/user/myinfo
    • /api/admins/v1/users/all

如何预防

  • 不要依赖客户端来强制管理员访问。
  • 默认情况下拒绝所有访问。
  • 仅允许对属于适当组或角色的用户进行操作。
  • 正确设计和测试授权。

TOP6:2019 —批量分配

该API会获取客户端提供的数据并将其存储,而不会对列入白名单的属性进行适当的过滤。攻击者可以尝试猜测对象属性或在其请求中提供其他对象属性,阅读文档,或查看API端点以获取在何处找到开口以修改其不应在后端存储的数据对象上使用的属性的线索。(对请求的数据未进行检测就保存)

用例

  • 该API无需正确过滤即可与数据结构一起使用。
  • 接收到的有效负载被盲目转换为对象并存储。
    • NodeJS:
      var user = new User(req.body);
      user.save();
    • 滑轨:
      @user = User.new(params[:user])
  • 攻击者可以通过查看GET请求数据来猜测字段。

如何预防

  • 不要自动绑定传入的数据和内部对象。
  • 明确定义您期望的所有参数和有效负载。
  • 在对象架构中使用可以将readOnly属性集设置为true可通过API检索但绝不能修改的所有属性。
  • 准确定义在设计时将在请求中接受的模式,类型和模式,并在运行时强制执行它们。

TOP7:2019 —安全配置错误

API服务器的配置不当使攻击者可以利用它们。

用例

  • 未修补的系统
  • 未受保护的文件和目录
  • 未硬化的图像
  • 缺少,过时或配置错误的TLS
  • 公开的存储或服务器管理面板
  • 缺少CORS策略或安全标头
  • 带堆栈跟踪的错误消息
  • 启用了不必要的功能

如何预防

  • 建立可重复的强化和修补过程。
  • 自动发现配置缺陷。
  • 禁用不必要的功能。
  • 限制管理访问。
  • 定义并执行所有输出,包括错误。

TOP8:2019 —注射

攻击者构造的API调用包括SQL,NoSQL,LDAP,OS或该API或背后的后端盲目执行的其他命令。

用例

  • 攻击者发送恶意输入以转发给内部解释器:
    • 的SQL
    • NoSQL
    • LDAP
    • 操作系统命令
    • XML解析器
    • 对象关系映射(ORM)

如何预防

  • 切勿信任您的API使用者,即使他们是内部使用者也是如此。
  • 严格定义所有输入数据,例如模式,类型和字符串模式,并在运行时实施它们。
  • 验证,过滤和清理所有传入的数据。
  • 定义,限制和执行API输出,以防止数据泄漏。

TOP9:2019 —资产管理不当

攻击者发现未受到生产API良好保护的非生产API版本(例如,登台,测试,测试版或早期版本),然后使用这些版本来发起攻击。

用例

  • DevOps,云,容器和Kubernetes使多个部署变得容易(例如,开发,测试,分支,暂存,旧版本)。
  • 希望保持向后兼容性,以迫使旧的API继续运行。
  • 旧版本或非生产版本均未正确维护,但是这些端点仍可以访问生产数据。
  • 一旦通过一个端点进行了身份验证,攻击者就可以切换到另一个生产端点。

如何预防

  • 保持所有API主机的最新清单。
  • 限制访问任何不应该公开的内容。
  • 限制对生产数据的访问,并将对生产和非生产数据的访问分开。
  • 实施其他外部控件,例如API防火墙。
  • 正确淘汰旧版本的API或对其进行反向移植安全修复。
  • 实现严格的身份验证,重定向,CORS等。

TOP10:2019 —日志和监视不足

缺乏适当的日志记录,监视和警报功能,攻击者和攻击者都不会被察觉。

用例

  • 日志不受完整性保护。
  • 日志未集成到安全信息和事件管理(SIEM)系统中。
  • 日志和警报设计不当。
  • 公司依靠手动而不是自动化系统。

如何预防

  • 记录失败尝试,拒绝访问,输入验证失败或安全策略检查中的任何失败。
  • 确保日志已格式化,以便其他工具也可以使用它们。
  • 保护日志,例如高度敏感的信息。
  • 包括足够的详细信息以识别攻击者。
  • 避免在日志中包含敏感数据-如果您需要信息以进行调试,请对其进行部分编辑。
  • 与SIEM和其他仪表板,监视和警报工具集成。
相关文章
评论
分享
  • jni函数hook

    jni函数hook(计算 地址方式)12345678910111213141516171819202122232425262728293031323334353637function hookTest9() { Jav...

    jni函数hook
  • Hook jni 主动调用

    Hook jni 主动调用要对hellofromc 进行主动调用,修改返回值,但是这里不能直接通过replace去修改返回值,而是要通过newstringutf 去修改返回值。 1234567891011121314151617181...

    Hook jni 主动调用
  • Hook 计算非导出函数地址

    hook 读写内存数据对string字符串,可能是加密的,可以通过直接hook 加载的内存数据来读取解密状态的字符串 123456789读取内存字符串数据function hookTest7() { var soAdd...

    Hook 计算非导出函数地址
  • Hook 获取指针参数的返回值

    Hook 获取指针参数的返回值在c语言中,一般都会以指针传递返回的值 ,没有return 或者return为true hook sub_750 打印参数和输出 12345678910111213141516171819functio...

    Hook 获取指针参数的返回值
  • Hook 导出函数和修改函数参数返回值

    Hook 导出函数123456789101112131415161718192021222324252627282930// hook 导出函数function hookTest1() { var addAddr =...

    Hook 导出函数和修改函数参数返回值
  • Hook dlopen

    hook dlopen在刚开始hook 我们必须使得app加载so 才能hook, 我们可以hookdlopen 获取到so在那加载,在高版本中有一些so会走android_dlopen_ext 1234567891011121314...

    Hook dlopen
  • Hook Java层通杀

    Hook 通杀Hook 普通方法和修改函数参数返回值fradaserver 是手机端的, android低版本 frida 尽量低版本 fridaserver版本要与frida库版本一致 不同平台用不同fridaserver 不要和...

    Hook Java层通杀
  • Hook so 导入导出表

    hook so 导入导出表启动frida打开两个cmd 窗口 12345第一个cmd窗口adb shellsucd /data/local/tmp./fx // 这个是frida-server-12.8.14-android-x86...

    Hook so 导入导出表
  • 最右登录协议分析

    Hey, password is required here. 184ec4c94e65a4b619ea732bd39a29aaf452514072ddb6dff084e29ad47fa9af...

    最右登录协议分析
  • 攻防世界-RememberOther

    RememberOther附件下载https://adworld.xctf.org.cn/media/task/attachments/476d9022bb0449c09c0b1e24f0686b66.zip 分析先安装 然后看看逻辑...

    攻防世界-RememberOther
Please check the comment setting in config.yml of hexo-theme-Annie!