记一下第31-32节课的内容。未授权访问漏洞;逻辑漏洞之任意用户密码重置的7种常用姿势
一、web未授权访问漏洞
1.跳转类型
我们这里演示两种跳转方式下,不进行登录,进行跳转的方式及其漏洞:
①Location跳转
②JS弹窗提示跳转

2.未授权访问漏洞的演示和修复
先看第一种方式:

这段代码存在的漏洞在于其使用Location跳转之后,并没有加die,也就是说代码依旧会往下运行。
打开靶场:

在这个登录界面,直接不输入用户名密码,直接点击登录,抓包并发送到repeater:


我们可以看到,实际上,这里虽然Location是cms_login.php,但是下面返回的内容里面,是把后台的HTML代码返回了的。
然后我们访问后台的地址,并抓包:

右键,Do intercept,Response to this request,然后forward,一个个筛选,找返回包,如果抓到的包有请求包,也要进行上述步骤,去抓他的返回包。

找到返回包之后,我们发现有location字段,对于这样的包,我们直接把这里删除掉,然后forward:

这个时候我们再看浏览器,直接进入了后台:

形成这个漏洞的原因是,由于源码header处没有加die,导致程序继续向下运行。
我们再来看第二种方式:

其中alert_href函数内容如下:

这里和上面一样,也是因为没有加die,导致可以进行未授权访问。
下面进行演示。
这里会提示一个"请重新登录"的弹窗,并跳转到登录界面:


与上面类似,我们访问后台,并进行抓包,抓到的第二个包,右键,Do intercept,Response to this request,并发送到repeater。

在点击go之后,我们发现虽然response里有网页源码,但是上面还有跳转的代码(红框框起来的)

我们重新访问后台,并开启拦截,抓取返回包:



找到这个返回包,然后直接把这里的JS代码删除掉,然后forward,这个时候我们就成功访问了后台:


这个漏洞寻找的难点在于,我们要首先找到网站后台功能性文件的名称,才能进行接下来的操作,所以我们可以使用dirsearch来进行扫描,找到我们想要的文件,再通过抓包来看是否返回了后台的HTML内容。
二、逻辑漏洞之任意用户密码重置的7种常用姿势
打开9002.zcbug靶场,到找回密码界面:

我们发现这里有一个洞,是非常明显的,他会直接展示出用户的邮箱和手机号:

我们回退到刚才的界面,开启抓包:


我们把数据包发送到repeater,然后drop掉。
接下来我们看一下源码:

通过查看源码,我们可以知道,这里只允许AJAX_POST才能进入到代码中,进入if语句后,接收post中的参数并转化成一位数组;然后判断username是否填写;紧接着查询会员是否存在,如果不存在的话提示"用户名不存在";然后查询手机号和邮箱是否都不存在,如果都不存在的话,提示"您未绑定手机或邮箱,无法自助找回密码,请联系管理员";然后判断验证码是否填写以及是否填写正确,若错误则给出相应的提示;
这样我们就有了如下的思路:由于代码是顺序运行,我们可以对用户名进行爆破,根据response返回值的不同,来判断用户名是否存在,由于网站存在会直接展示出手机号和邮箱的漏洞,我们就可以通过这样的方式获取到用户的手机号和邮箱。另外,我们可以直接在数据包中将IsVertify参数改为1以外的数字,这样就可以直接绕过880-888行的if判断。
第889行,这里的VerifyData里面存的内容可以查看873行中的代码内容,其实就是将用户的id,mobile和email存在一个一位数组中,我们可以var_dump然后抓包看一下:

890-891行实现的是如果验证成功,给出相应的提示,并跳转到第二步(也就是找回密码的第二步)。
进入到第二步之后,我们选择手机号并验证,同时开启抓包,将抓到的包发送到repeater并drop:


对于数据包中的参数,我们可以查看源码大致了解其含义:





然后我们在网页中点击发送验证码,抓包,发送到repeater,并drop掉:

在第二步中,如果验证码不会失效的话,我们可以通过爆破的方式,直到将其爆破出来:

所以如果没有下面的代码来检查验证码是否失效,就会导致验证码不失效的安全问题:

另外,还要验证一下验证码是否重复使用的问题,否则就可能造成一码多用的安全问题,我们可以使用同一个验证码多次对同一个账号进行密码重置:

下面进行一下总结:
逻辑漏洞之密码重置漏洞
类型:
①验证码不失效
②验证码一码多用
③修改接收的手机或邮箱:指的是在修改密码的验证手机号界面,抓包,并在burp中将他的手机号改为自己的手机号并获取相应的验证码,这样可以直接绕过第二步验证,直接修改密码。
④验证码返回在响应包中
⑤修改返回包绕过JS验证:
这时我们可以先做一次正确的操作,并通过抓包获取返回的正确信息:

然后,我们修改别人的密码时,就可以直接将数据包中报错的内容(下图红框中的部分)替换为正确的内容:

⑥跳过验证环节直接修改密码:
我们直接在浏览器中将step改成3,有可能直接绕过第二步直接进入第三步,但是这种可能性一般都比较小。

⑦未校验被修改的用户是否为找回用户:
如果未校验被修改的用户是否为找回用户,我们可以在第三步中通过修改userid来实现修改任何人的密码:
