第四十四课认识逻辑漏洞 与常见类型

1简介

逻辑漏洞是指由于程序逻辑不严导致一些逻辑分支处理错误造成的漏洞。 在实际开发中,因为开发者水平不一没有安全意识,而且业务发展迅速内部测试没有及时到位,所以常常会出现类似的漏洞。

  1.账户

  1.1注册账户

1.1.1 注册覆盖

  注册重复用户名对用户数据进行覆盖

  对于注册页面覆盖注册是指原来用一个手机号已经注册了账号,但是由于漏洞,导致可以再利用该手机号进行注册,并且会将之前注册的记录覆盖!

  当我们用已经注册了的账号准备再注册时,发现会提示该手机号码已经存在!

我们抓包,发现后端检测该手机号已经注册了的话,会返回 true。如果检测该手机号没注册的话,会返回false。如图1-1

图1-1

  修改回传参数,达到重复注册目的。

  修复建议:对注册的用户数据进行审核,禁止覆盖数据库已经存在的用户名

  2注册遍历

  进行注册的时候注册重复的用户名会提示用户名已被注册,我们可以利用该方法猜测用户名

1.2 登陆账户

1.2.1 登陆认证绕过

1. 直接访问登陆后的界面

  一般登陆界面登陆成功后会进行跳转到主页面,例如:main.php。但是如果没有对其进行校验的话,可以直接访问主页面绕过了登陆认证。

2. 前端认证

  登陆状态如果只以登陆状态码进行判断登陆成功标识,那么修改登陆状态码就能进行登录。

  对登陆状态抓包:

  如图1-2

图1-2

  修改这里的code值,修改成1,放行成功登入

修复建议 :对账户登陆添加认证机制,可以在用户在登陆成功时应该设置一个有时效性的登陆唯一标识中。如:session

1.2.2 验证码

1.2.2.1 图形验证码

1. 前端可以获取验证码

  验证码一般直接出现在html源码中或者隐藏在Cookie中如图1-3

图1-3

2. 图形验证码可识别

  这种验证码由于没有对其做模糊处理,导致可以利用脚本直接识别如图1-4

图1-4

3. 验证码重复利用

  有的网页只要不刷新,验证码就能重复被利用。通常情况下,系统会比对session和用户输入的验证码值,当服务器端受理请求后,没有将上一次保存的session及时清空,将会导致验证码可重复使用如图1-5

图1-5

修复建议:当服务器端处理完一次用户提交的请求之后,及时将 session域中的验证码清除,并生成新的验证码。

1.2.2.2 短信验证码

1. 短信验证码可重复利用

  如果服务端未对短信验证码的验证时间/次数进行限制,那么我们就可以利用其进行爆破

  如图1-6

图1-6

修复建议: 服务端要对验证码的验证时间和次数进行限制

2. 短信验证码与用户未绑定

  一般来说短信验证码仅能供自己使用一次,如果验证码和手机号未绑定,那么就可能出现如下张三的手机的验证码,李四可以拿来用的情况。

  修复建议:

  作为一个安全的短信验证码,他的设计要求应该满足如下几点:

  用户获取的短信验证码只能够供自己使用

  用户短时间内获取的多条短信只有最新的一条能使用

  短信验证码设置为6位数,有效期30分钟甚至更短,当验证码失败3次后失效

1.3 密码找回/修改

  找回密码的验证码为四位数字可爆破真实验证码;

  采用本地验证,可以先尝试修改自己的帐号密码,保存正确的返回包,然后修改他人密码的时候替换返回包;

  最终修改密码的数据包,以另外的ID作为身份判断(例如userid),而该ID在别处可以获取到;

  接受验证码的手机号修改为自己的号码,然后输入自己的号码接收到的验证码去进行密码重置;

  获取验证码的时候,会生成一个身份标识(例如cookie值),那么我们就替换他人账号的身份标识重置他人的密码;

  找回密码

1.3.1.1 短信找回密码

类似1.2.2.2 如短信验证码可以重复使用,攻击者就可以修改用户的密码。短信验证码未与用户绑定,攻击者可以利用其他用户的包来修改本用户的密码。

1.3.1.2 用户名找回密码

随便输入一个用户 他有一个包检验用户是否存在,这里回显了用户全部信息。

  这里的问题在于查询用户处,回显了多余的个人信息。如图1-7

图1-7

1.3.1.3 邮箱找回密码

1. 链接弱token可伪造

  这种一般都是找回密码链接处对用户标识比较明显,弱token能够轻易伪造和修改

  基于用户id标识

  例如:

  https://xxx.com/member/getbackpasswd.html?sendTime=MjAxOC0wNC0wNyAxMjozOQ==&userValue=bGlsZWlAdnNyYy5jb20=

  这里使用的是base64编码

sendTime = 2018-04-07 12:39

userValue为 = lilei@vsrc.com

知道构造方式了 我们就可以自己构造找回密码的链接了

  基于服务器时间

  例如

  https://xxx.com/member/reSetPwdCheck.action?email=666@qq.com&startClickTime=20180810105628

这里startClickTime = 20180810105628,我们不确定服务器时间时候,可以在同一时间同时重置账户甲和账户乙,根据账户甲收到的url中token值来推断乙对应的值

  修改密码

1.3.2.1 越权修改密码

  有时候开发再写代码时,会直接用到某一参数直接调取该参数对应的数据,而再调用时并不考虑当前登陆用户是否有权限调用。这就导致了,可以利用抓该包工具,将传递给后台的数据进行修改,修改后可以查看原本自己没有权限看到内容。

  这个后台我们本来是管理员权限,正常情况下用户管理的数据包id=5。而我们将数据包id改为1,修改以后发现调出了admin界面如图1-8

图1-8

  这样我们就可以越过权限去修改超管账户。

修复建议: 在每次调用用户数据时必须检验当前登陆用户是否有权限调用

(本章完)

相关推荐