目录
有些业务的接口,因为缺少了对用户的登陆凭证的较验或者是验证存在缺陷,导致黑客可以未经授权访问这些敏感信息甚至是越权操作。
- 案列一:后台页面访问
某电商后台主页面,直接在管理员 web 路径后面输入 main . php 之类的即可进入。
![]()
图1
- 案列二:某航天公司订单 ID 枚举
仔细看,就可以找到规律,他就是固定0031003+数字+003+数字+003+数字,其实需要穷举的就是13位左右,如果能够访问,会泄露大量的用户个人资料
- 案例三:某一个电子认证敏感文件下载
验证码可爆破,即验证码过于简单,例如验证码中字符数量过少,比如只有四位组成,且只包含0-9的数字还没有干扰点,亦或者验证码可以被猜测到(这种情况很少见)。
可以使用 PKAV 来进行带验证码的爆破,先用 burpsuite 来抓包,再将抓取的数据包放在 pkav 里。
验证码复用,即登录失败后验证码不刷新,仍然可以使用上一次登录时的验证码且有效,存在爆破风险漏洞,如织梦后台的验证码,测试方法如下:
抓包后输入对的验证码后,反复发送査看回包,可以看到,没有出现验证码错误,出现的是用户名不存在,那么这里还出现一个点,用户名爆破,只要输入账号错误和密码错误回显不一样,就可以算成用户名可爆破漏洞。
验证码绕过,即验证码可以通过逻辑漏洞被绕过,通常分为以下情况
- 案列一:验证码验证返回状态值
可用BP 修改状态值来绕过前端的验证(发送与响应报文可控),修改密码页面中存在验证码绕过漏洞
- 案列二:点击获取验证码时,直接在返回包中返回验证码,通过抓包的来观察 reponse 包
在发送的时候拦截回包,然后发送
简单来说,验证信息没有进入服务器,直接在前端进行效验,可以通过查看源代码发现验证码是前端验证码,可以通过直接抓包的方式在 bp 里边爆破,
参考 pikachu -bf client . php
查看源码
<script language="javascript" type="text/javascript"> var code; //在全局 定义验证码 function createCode() { code = ""; var codeLength = 5;//验证码的长度 var checkCode = document.getElementById("checkCode"); var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候选组成验证码的字符,当然也可以用中文的 for (var i = 0; i < codeLength; i++) { var charIndex = Math.floor(Math.random() * 36); code += selectChar[charIndex]; } //alert(code); if (checkCode) { checkCode.className = "code"; checkCode.value = code; } } function validate() { var inputCode = document.querySelector('#bf_client .vcode').value; if (inputCode.length <= 0) { alert("请输入验证码!"); return false; } else if (inputCode != code) { alert("验证码输入错误!"); createCode();//刷新验证码 return false; } else { return true; } } createCode(); script>我们可以试试用BP抓包,发现如果验证码错误时,根本抓不到包,如果前端验证码正确,抓包发到repeater模块分析,在这里随意改动vode值,Response中验证码都是正确的。
即后端也不会再检查vode函数,我们可以大胆尝试把前端js验证码的部分直接删除,这样就可以在后端进行爆破。
如下,某网站存在一个链接http://1XX.XX.XX.XX:9080/setup访问这个重置链接,点击修改管理员密码,可以重置密码,但是我们不知道旧密码是多少,只能输入新密码
随便输入后看回包
修改回包,把验证码错误标识改为true
有验证码模块,但验证模块与业务功能没有关联性,此为无效验证,一般在新上线的系统中比较常见。最好在做测试的时候先试一下,有很小的概率可以成功。
下面用一个案例进行举例说明:获取短信验证码后,随意输入验证码,直接输入两次密码,可成功更改用户密码,没有对短信验证码进行验证。
短信轰炸是手机验证码漏洞中最常见的一种漏洞类型。在测试的过程中,对短信验证码接口进行重放,导致大量发送恶意短信
有两种情况,一种是完全没限制发短信的频率,另外一种是每60秒发一条短信。
- 情况一:没有限制时,任意下发短信时。直接放到 Intruder 中即可
- 情况二:有一定时间间隔,无限下发。
每隔60秒可下发一条短信,无限下发,短信轰炸。
在测试过程中,可通过编写 Python 脚本来计算短信下发时间间隔,实现短信轰炸。 python 脚本的编写可以参考上文
当在“忘记密码”页面,输入邮箱或者手机号后,网站会给手机或者邮箱发送验证码。用户输入验证码后,服务器会将其与正确的验证码进行对比,若相同则验证成功并进行下一步操作。网站还贴心的考虑到了:万一用户手抖输错怎么办?有两个选择:
- 第一个:客户重新填验证码。 网站本来想着用户这次能输对了吧,没想到用户不停的手抖输错,短信不断的发到手机上(这是短信炸弹漏洞)。一条短信一毛钱啊,网站掏不起啊,那就试试方法2吧。
- 第二个:验证码再输一遍。 在这种情况下,极易产生验证码爆破漏洞。你可能会觉得输入一万条数据简直太漫长了,但是要知道我们发到网站服务器的都是数据包,验证码就在数据包中。我们只要不断的修改数据包中验证码的参数即可完整验证尝试
攻击方法和图片验证码相似,如果是4位,没有多余的防御措施,直接爆破即可,案列如下
客户端验证是不安全的,可能导致任意账号注册、登录及重置任意用户密码等一系列问题
- 直接返回明文验证码输入手机号后,点击获取验证码。按F12调出开发者工具,然后在网络中,监听到两条 json 数据
可以发现本应该发送给用户的手机短信验证码就藏在 ticket 里面。用这个尝试登陆,输入9360即可登陆成功
- 返回加密后的密码验证加密后,加密报文在应答数据包中,返回客户端,用户解密后即可获取验证码。
修改密码时可否修改参数(用户名/邮箱/手机)达到修改其他用户密码的目的。
首先在一个网站注册一个用户,然后修改这个用户的密码,通过抓取数据包中的参数判断哪里是校验用户,通过修改关键参数,达到任意修改其他用户密码的目的。
- 下面对一个网站进行模拟攻击,以便于在攻击中讲解能够更深刻的理解。
1.先注册一个网站的账号,注销后在登录界面点击忘记密码。然后填写相应的信息,这里填写了刚才注册的用户名和密码。然后开启浏览器的代理和 Burp 的截断,如下图所示
2.点击下一步后,分析报文,看到请求的报文中传递了用户名和邮箱,因此判断此数据包是用来判断是否存在此用户、用户名和邮箱是否匹配的。点击 Forward 放过次数据包
3、攻击者收到网站给的验证码( (到这里都是正常的网站找回的逻辑)
4、继续填写验证码,发现还是没有什么可以用的数据,放包过去
5、到了修改密码的界面,填好密码后点击下一步。抓包后,观察发现这里写入了用户名和密码。
可以先右键报文,然后 Send to Intruder 之后可以爆破用户名,并将其修改为同一个密码。不过这里只是测试一个叫 zhagnwei 用户名,这是我们之前爆破出的一个其他的用户,如下图所示
6、发送之后,发现修改成功(这里漏洞点:原因是没有对校正的账号和修改的账号进行匹配,导致可以先通过用户验证后,去修改别人的密码)
因为这种方式较为常见,因此再举一个例子,如下:
在用户更改密码和找回密码时,会发送一个验证码到手机。填写正确验证码后,后台会在返回的报文中通过状态码来进行正确的判断。这个时候可以通过修改发回报文中的参数,使页面跳转到写一部认证的页面。
- 1.在找回密码的界面,发现是通过填写手机号和返回的验证码进行身份认证
- 2.先填写一个想要修改的手机号,验证码随意填写一个。再打开浏览器代理和 Burp 的截断,这时候点击提交后,会抓取一个请求的数据包。
- 3.这个时候可以拦截到回包,观察图数据包中的 status 字段,这里的0可能是验证码错误的返回代码
因此我们尝试把他改为“1”
- 结果发现可以输入新的密码