[ffffffff0x] 浅谈web安全之逻辑漏洞

2020-12-25 17:49:49 浏览数 (1)

简介

实战渗透测试中,web的攻防一直是重中之重,而无论是对于富有经验的老手黑客和新手脚本小子来说,相比 SQL 注入、XSS 漏洞等传统安全漏洞,逻辑漏洞都是最具价值的。这类漏洞往往危害巨大,可能造成企业的资产损失和名誉受损,并且传统的WAF设备和防护措施收效甚微。

下面,我们来总结一些安全测试过程中常见的逻辑漏洞类型。


常见逻辑漏洞类型

授权安全

授权问题是常见的逻辑漏洞类型之一。通常来讲,该问题分为垂直越权和水平越权。

垂直越权

指不同权限之间的用户互相越权,比如普通用户和管理员。举个例子,若服务端仅根据 user_id 参数来判断用户,普通用户在修改自己密码时,抓包将自己的 user_id 改成管理员的 user_id,将能够修改管理员密码,即造成垂直越权。

相应地,注册页面的 user_type、查看/修改用户资料时的 user_id、以及其他与用户交互页面的相关参数也是容易出现垂直越权漏洞的高危参数,同样存在利用的可能。

水平越权

在了解垂直越权后,水平越权就更容易理解了,即相同权限的用户之间互相越权。以在线购物平台为例,若用户A在查看已购买商品时,抓包修改订单 id,使其变成用户B购买的订单 id,即造成水平越权。

下面看一个例子,抓取订单提交的数据包,发现有一个 oid 很可疑:

尝试进行测试发现,可遍历订单号,查看他人待付款订单信息:

验证码突破

对于验证码安全,存在常见的暴力破解与绕过漏洞,若开发人员并没有对验证码做验证,则可以说验证码本身就是形同虚设。

验证码暴力破解

当用户使用找回密码,发送短信到手机时,若验证码字符过短,如4位数纯数字验证码更新时效过长,如单次验证码过期时间为10分钟或更长不做更新验证码处理。并且在验证码生效时间内未做验证次数限制,那么黑客就可以对验证码输入框进行爆破。

在验证码生效时间内进行验证码爆破从而进行后续破坏攻击。

实例如下:

验证码复用

在某些场景中,开发人员忘记注销 session 中存入的验证码,导致攻击者可重复利用同一个验证码对业务进行爆破,这相对于绕过了验证码的检测机制。

示例如下:

绕过验证

在客户进行用户的输入时,将校验结果作为参数发送至服务器,或利用起端语言限制用户的非法输入和操作,可以通过修改前端语言或者在传输过程中对参数进行篡改来绕过验证。

流程控制绕过

程序员在编写验证程序时有可能会验证结果返回到客户端,由客户端根据服务端提供的验证结果进行下一步操作,攻击者可以通过篡改验证结果或直接执行下一步操作实现绕过。

比如: 选择免费接收短信校验码修改。

通过抓包修改需要发送的手机号码,改成自己的手机号进行短信接收。

然后继续进行后续操作即可。

业务数据篡改

在客户端抓包修改金额,订单等字段数值为任意数额。如将金额修改为1元购买商品、将订单数额修改成负数。从而达到以极低的价格购买昂贵的商品或以达到让业务平台崩溃的结果。

金额数据篡改

程序未在后端对程序的传参进行二次验证,导致用户在传输过程中抓包进行修改后的数值直接被后端使用,最常见的是在电商平台的支付功能处,用户支付后抓包修改金额,服务器接收到金额后没有去进行二次验证,结果最终的金额就是用户篡改后的金额。

商品数量篡改

在发送购买请求时,抓包修改商品数量等字段,将请求中的商品数量修改成指定数额,如负数并提交,查看能否以修改后的数量完成业务流程。

重放攻击

重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。

邮箱/短信爆破

在手机短信,邮箱或其他类服务中,对其业务服务环节通过抓包来进行调用测试,并通过控制发送按钮多次发包的方式来发送大量恶意邮件。

批量注册

因目标对于在注册方面的相关流程不严谨,导致可以通过抓包工具来获得用户注册的请求包,并对其进行相关修改,并直接注册成功。


预防措施以及建议

那么对于开发人员来说,如何有效控制漏洞的产生呢?

我们不妨举个例子,假如提供给你一个登陆页面,看完上面的类型总结,你能想象出存在多少种攻击的可能?

  • 输入一个错误的账号,提示“该账号不存在”,存在爆破账号可能
  • 在找到一个确定存在的账号后,发现并没有爆破限制,存在爆破弱口令可能
  • 假如管理员在后台可以看到登陆失败的日志,那么存在存储型XSS的可能
  • 如果没有对传参进行过滤,那么存在SQL注入可能
  • 登陆数据包中存在类似type的参数,可以修改测试越权
  • 注册账号、忘记密码页面发送短信接口复用验证码,存在短信爆破可能
  • 注册账号时可指定账号类型,存在越权可能
  • 忘记密码重置链接由时间戳和用户名生成,可手动构造,存在任意密码重置可能
  • ......

单单从一个登陆页面来看就可以总结出这么多攻击的可能性,那么对于一整套的业务流程,存在漏洞的概率就大大提高,可以说功能越多,存在漏洞的可能性就越大。

安全措施最好能够做到防患于未然,同时,能够把权限控制的越细化,粒度越高,就越接近安全。

对于开发人员,需要定期的安全培训,同时,内部需要统一的安全编码规范。对于新上线的业务,需总结可能存在的问题点,适当模拟进行内部白盒测试,然后通过安全团队进行黑盒测试,确保在上线前能够有效发现问题。

再完美的程序也会有漏洞,而我们能做的,就是发现问题,解决问题,预防问题,让这个程序不断接近完美。


本文作者 r0fus0d、RyuZU、the-fog、xidaner、Alienware-OWO

0 人点赞