• 登入验证安全 上(验证码、忘记密码、客户端验证)


    目录

    1.未进行登陆凭证验证

    2.图形验证码

    2.1验证码可爆破

    2.2 验证码复用

    2.3 验证码绕过

    2.4 客户端验证

    参考 pikachu -bf client . php

    2.5 验证码前端验证漏洞

    2.6 无效验证

    2.7短信轰炸

    2.8 忘记密码﹣给邮箱/手机发验证码

    3.前端验证绕过

    4.设置新密码时改他人密码

    5.忘记密码﹣某网站密码找回功能


    1.未进行登陆凭证验证

            有些业务的接口,因为缺少了对用户的登陆凭证的较验或者是验证存在缺陷,导致黑客可以未经授权访问这些敏感信息甚至是越权操作。

    • 案列一:后台页面访问

    某电商后台主页面,直接在管理员 web 路径后面输入 main . php 之类的即可进入。

    图1

    • 案列二:某航天公司订单 ID 枚举

             仔细看,就可以找到规律,他就是固定0031003+数字+003+数字+003+数字,其实需要穷举的就是13位左右,如果能够访问,会泄露大量的用户个人资料

    •  案例三:某一个电子认证敏感文件下载

    2.图形验证码

    2.1验证码可爆破

            验证码可爆破,即验证码过于简单,例如验证码中字符数量过少,比如只有四位组成,且只包含0-9的数字还没有干扰点,亦或者验证码可以被猜测到(这种情况很少见)。
            可以使用 PKAV 来进行带验证码的爆破,先用 burpsuite 来抓包,再将抓取的数据包放在 pkav 里。

    2.2 验证码复用

            验证码复用,即登录失败后验证码不刷新,仍然可以使用上一次登录时的验证码且有效,存在爆破风险漏洞,如织梦后台的验证码,测试方法如下:

            抓包后输入对的验证码后,反复发送査看回包,可以看到,没有出现验证码错误,出现的是用户名不存在,那么这里还出现一个点,用户名爆破,只要输入账号错误和密码错误回显不一样,就可以算成用户名可爆破漏洞。

    2.3 验证码绕过

    验证码绕过,即验证码可以通过逻辑漏洞被绕过,通常分为以下情况

    • 案列一:验证码验证返回状态值

               可用BP 修改状态值来绕过前端的验证(发送与响应报文可控),修改密码页面中存在验证码绕过漏洞

    • 案列二:点击获取验证码时,直接在返回包中返回验证码,通过抓包的来观察 reponse 包

     在发送的时候拦截回包,然后发送

    2.4 客户端验证

            简单来说,验证信息没有进入服务器,直接在前端进行效验,可以通过查看源代码发现验证码是前端验证码,可以通过直接抓包的方式在 bp 里边爆破,

    参考 pikachu -bf client . php

    查看源码

    1. <script language="javascript" type="text/javascript">
    2. var code; //在全局 定义验证码
    3. function createCode() {
    4. code = "";
    5. var codeLength = 5;//验证码的长度
    6. var checkCode = document.getElementById("checkCode");
    7. 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');//所有候选组成验证码的字符,当然也可以用中文的
    8. for (var i = 0; i < codeLength; i++) {
    9. var charIndex = Math.floor(Math.random() * 36);
    10. code += selectChar[charIndex];
    11. }
    12. //alert(code);
    13. if (checkCode) {
    14. checkCode.className = "code";
    15. checkCode.value = code;
    16. }
    17. }
    18. function validate() {
    19. var inputCode = document.querySelector('#bf_client .vcode').value;
    20. if (inputCode.length <= 0) {
    21. alert("请输入验证码!");
    22. return false;
    23. } else if (inputCode != code) {
    24. alert("验证码输入错误!");
    25. createCode();//刷新验证码
    26. return false;
    27. }
    28. else {
    29. return true;
    30. }
    31. }
    32. createCode();
    33. script>

            我们可以试试用BP抓包,发现如果验证码错误时,根本抓不到包,如果前端验证码正确,抓包发到repeater模块分析,在这里随意改动vode值,Response中验证码都是正确的。

    即后端也不会再检查vode函数,我们可以大胆尝试把前端js验证码的部分直接删除,这样就可以在后端进行爆破。

    2.5 验证码前端验证漏洞
     

            如下,某网站存在一个链接http://1XX.XX.XX.XX:9080/setup访问这个重置链接,点击修改管理员密码,可以重置密码,但是我们不知道旧密码是多少,只能输入新密码

     随便输入后看回包

    修改回包,把验证码错误标识改为true

    2.6 无效验证

            有验证码模块,但验证模块与业务功能没有关联性,此为无效验证,一般在新上线的系统中比较常见。最好在做测试的时候先试一下,有很小的概率可以成功。
            下面用一个案例进行举例说明:获取短信验证码后,随意输入验证码,直接输入两次密码,可成功更改用户密码,没有对短信验证码进行验证。

    2.7短信轰炸

            短信轰炸是手机验证码漏洞中最常见的一种漏洞类型。在测试的过程中,对短信验证码接口进行重放,导致大量发送恶意短信
            有两种情况,一种是完全没限制发短信的频率,另外一种是每60秒发一条短信。

    • 情况一:没有限制时,任意下发短信时。直接放到 Intruder 中即可

    •  情况二:有一定时间间隔,无限下发。

            每隔60秒可下发一条短信,无限下发,短信轰炸。
            在测试过程中,可通过编写 Python 脚本来计算短信下发时间间隔,实现短信轰炸。 python 脚本的编写可以参考上文

    2.8 忘记密码﹣给邮箱/手机发验证码

            当在“忘记密码”页面,输入邮箱或者手机号后,网站会给手机或者邮箱发送验证码。用户输入验证码后,服务器会将其与正确的验证码进行对比,若相同则验证成功并进行下一步操作。网站还贴心的考虑到了:万一用户手抖输错怎么办?有两个选择:

    • 第一个:客户重新填验证码。        网站本来想着用户这次能输对了吧,没想到用户不停的手抖输错,短信不断的发到手机上(这是短信炸弹漏洞)。一条短信一毛钱啊,网站掏不起啊,那就试试方法2吧。
    • 第二个:验证码再输一遍。           在这种情况下,极易产生验证码爆破漏洞。你可能会觉得输入一万条数据简直太漫长了,但是要知道我们发到网站服务器的都是数据包,验证码就在数据包中。我们只要不断的修改数据包中验证码的参数即可完整验证尝试

    攻击方法和图片验证码相似,如果是4位,没有多余的防御措施,直接爆破即可,案列如下

    3.前端验证绕过

            客户端验证是不安全的,可能导致任意账号注册、登录及重置任意用户密码等一系列问题

    • 直接返回明文验证码输入手机号后,点击获取验证码。按F12调出开发者工具,然后在网络中,监听到两条 json 数据


            可以发现本应该发送给用户的手机短信验证码就藏在 ticket 里面。用这个尝试登陆,输入9360即可登陆成功

    •  返回加密后的密码验证加密后,加密报文在应答数据包中,返回客户端,用户解密后即可获取验证码。

    4.设置新密码时改他人密码

            修改密码时可否修改参数(用户名/邮箱/手机)达到修改其他用户密码的目的。
    首先在一个网站注册一个用户,然后修改这个用户的密码,通过抓取数据包中的参数判断哪里是校验用户,通过修改关键参数,达到任意修改其他用户密码的目的。

    • 下面对一个网站进行模拟攻击,以便于在攻击中讲解能够更深刻的理解。

    1.先注册一个网站的账号,注销后在登录界面点击忘记密码。然后填写相应的信息,这里填写了刚才注册的用户名和密码。然后开启浏览器的代理和 Burp 的截断,如下图所示

     
    2.点击下一步后,分析报文,看到请求的报文中传递了用户名和邮箱,因此判断此数据包是用来判断是否存在此用户、用户名和邮箱是否匹配的。点击 Forward 放过次数据包

     3、攻击者收到网站给的验证码( (到这里都是正常的网站找回的逻辑)

    4、继续填写验证码,发现还是没有什么可以用的数据,放包过去

     5、到了修改密码的界面,填好密码后点击下一步。抓包后,观察发现这里写入了用户名和密码。
            可以先右键报文,然后 Send to Intruder 之后可以爆破用户名,并将其修改为同一个密码。不过这里只是测试一个叫 zhagnwei 用户名,这是我们之前爆破出的一个其他的用户,如下图所示

     6、发送之后,发现修改成功(这里漏洞点:原因是没有对校正的账号和修改的账号进行匹配,导致可以先通过用户验证后,去修改别人的密码)

    5.忘记密码﹣某网站密码找回功能

            因为这种方式较为常见,因此再举一个例子,如下:

            在用户更改密码和找回密码时,会发送一个验证码到手机。填写正确验证码后,后台会在返回的报文中通过状态码来进行正确的判断。这个时候可以通过修改发回报文中的参数,使页面跳转到写一部认证的页面。

    • 1.在找回密码的界面,发现是通过填写手机号和返回的验证码进行身份认证

    •  2.先填写一个想要修改的手机号,验证码随意填写一个。再打开浏览器代理和 Burp 的截断,这时候点击提交后,会抓取一个请求的数据包。

    •  3.这个时候可以拦截到回包,观察图数据包中的 status 字段,这里的0可能是验证码错误的返回代码

            因此我们尝试把他改为“1”

    • 结果发现可以输入新的密码

  • 相关阅读:
    SCS RC翠鸟回收成分认证是什么?如何申请?需要什么
    正点原子开拓者FPGA,程序固化下载到板子里面
    去中心化应用的终极是应用链?
    Java面试题-Redis-第三天(缓存更新策略-由旁路缓存策略衍生出的一系列问题)
    Cron(Crontab)--使用/教程/实例
    量化交易延迟会发生在哪些环节?
    spring boot集成pg
    C++面试八股文:C++中,设计一个类要注意哪些东西?
    kubernetes (k8s) list-watch机制、调度约束
    归并排序~
  • 原文地址:https://blog.csdn.net/m0_61506558/article/details/126315162