草庐IT

Web 攻防之业务安全:密码找回安全案例总结.

半个西瓜. 2023-09-09 原文

Web 攻防之业务安全:密码找回安全案例总结

业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台(操作系统、数据库,中间件等)、业务系统自身(软件或设备)、业务所提供的服务安全狭义的业务安全指业务系统自有的软件与服务的安全


目录:

密码找回安全案例总结:

密码找回凭证可暴力破解:

密码找回凭证直接返回给客户端:

密码重置凭证已用户账户关联不严:

重新绑定用户手机:

服务端验证码逻辑缺陷:

本地验证服务端的返回信息----修改返回包要过验证:

注册覆盖----已存在用户可被重复注册:

Session 覆盖方式重置其他账号密码:

防范密码找回漏洞的相关措施:


免责声明:

严禁利用本文章中所提到的技术进行非法攻击,否则后果自负,上传者不承担任何责任。


密码找回安全案例总结:

密码找回凭证可暴力破解:

密码找回凭证是指在密码找回过程中,服务器向用户的注册手机或者邮箱中发送验证码或特殊构造的URL等用于用户自证身份的信息,当用户凭证的验证次数未做限制或限制不严可被绕过时,攻击者可以通过暴力破解枚举用户凭证的方式冒充该用户重置密码


密码找回凭证直接返回给客户端:

有些信息系统在密码找回功能的设计上存在逻辑漏洞,可能会将用于用户自证身份的信息的密码找回凭证以各种各样的方式返回到客户端。这样攻击者只要通过在本地抓取数据包,并给其内容加以分析,就能获取到其他用户的密码找回凭证,从而冒充该用户重置密码.


密码找回凭证暴露在请求链接中

第一步:进入某网站登陆处,点击忘记密码,选择通过注册手机找回密码。

第二步:输入手机号码,点击获取验证码,使用 Burp Suite 抓包查看请求的链接中存在的验证码。

第三步:直接输入请求链接中暴露出来的验证码即可修改密码。


网页源代码中隐藏着密保答案

第一步:进入到某网站点击 " 找回密码 " 按钮,再点击 " 网上申诉 " 链接.

第二步:在网上。申诉页面直接查看源代码,发现源代码中不但有密码提示问题,还在 Hide 表里隐藏着问题答案。通过该方法,可获得任意用户修改密码问题答案,从来可以修改其他用户密码.


短信验证码返回给客户端:https://tianyuk.blog.csdn.net/article/details/130023416


密码重置凭证已用户账户关联不严:

有些信息系统在密码找回功能的校验逻辑上存在缺陷,只校验了密码重置凭证是否在数据库中存在,但未严格校验该重置凭证和用户账号之间绑定的关系,这种密码重置凭证与用户账户关联不严的逻辑漏洞,就让攻击者可以通过在数据包中修改用户账号达到重置其他账号密码的目的。


使用自己短信验证码找回别人密码.

第一步:进入到手机号码找回页面,填写自己的手机号码进行密码找回.

第二步:收到验证码后填入验证码和新密码提交,这个时候使用数据抓包工具 Burp Suite  进行抓包,将数据包中的 username 修改为其他账号,post 上交后可以使自己设置的密码登录其他账号。


重新绑定用户手机:

有些信息系统在绑定用户手机或者邮箱的功能上存在越权访问漏洞,攻击者可以利用该漏洞越权绑定其他用户的手机或者邮箱后,再通过正常的密码找回途径重新设置别密码。


重新绑定用户手机

第一步:首先注册一个某邮箱的测试账号,然后会跳转到一个手机绑定的页面上.

第二步:注意此时链接中有个参数为 uid,将 uid 修改为其别人邮箱账号,填入一个你可控的手机号码,获取到验证码,确定后这个目标邮箱已经被越权绑定了密保的手机.

第三步:走正常的密码取回流程,发现这个邮箱多了一个通过手机找回密码的方式,这个手机号码就是刚刚绑定的手机号码.

第四步:获取验证码并输入新的密码,最终成功重置了新目标账号的密码.


服务端验证码逻辑缺陷:

有些信息系统的服务端验证逻辑存在漏洞,攻击者可以通过删除数据包中的某些参数修改邮件发送地址或者跳过选择找回方式和身份验证的步骤,可以直接进入重置密码页面,成功重置其他人的密码。


删除参数绕过验证

第一步:某邮箱系统可以通过密码提示问题找回密码.

第二步:首先随机填写密码答案,然后进入下一步抓包后将问题答案的整个字段都删除再提交.

第三步:因服务端验证逻辑存在缺陷,无法获取到问题答案的情况下,直接通过了验证密码重置成功.


邮箱地址可被操控

第一步:有一些网站可以通过注册时填写的邮箱来找回密码,但防止网络不稳定等因素造成邮件发送失败,找回密码页面提供了重新发送邮件的功能。

第二步:点击重新发送邮件,然后抓包 Burp Suite 工具进行拦截请求,将数据包中的邮件地址改为自己测试的邮箱。

第三步:点击进入自己测试的邮箱,点击链接密码重置成功。


身份验证步骤可被绕过

第一步:进入某网站的密码找回功能,输入账号和验证码.

第二步:确定后,直接访问 http://**.***.com.cn/reset/pass.do 即可跳过选择找回方式和身份认证的过程直接,进入重置密码页面.


本地验证服务端的返回信息----修改返回包要过验证:

有些信息系统在密码找回功能的设计上存在逻辑漏洞,攻击者只需要抓取服务端的返回包,并修改其中的部分参数即可,跳过验证步骤直接进入密码重置页面。


修改返回包绕过验证https://tianyuk.blog.csdn.net/article/details/130057199


注册覆盖----已存在用户可被重复注册:

有些信息系统的用户注册功能没有严格校验已存在的用户账号,导致攻击者可以通过反复注册其他用户账号的方式重置其他账号的密码.


第一步:进入某网站,点击用户注册,输入用户名,在鼠标离开输入框后会提示该账号已被注册。

第二步:输入一个未注册的用户名并提交表单,同时用抓包 Burp Suite 工具拦截数据包,并将 username 参数值修改为 admin

第三步:此时 admin 用户的密码被重复注册的方式修改了,但原用户的所有信息却没有修改,也就是说这样攻击者获取了用户的所以信息,包括:姓名,身份证,手机号,等信息.


Session 覆盖方式重置其他账号密码:

有些服务器密码找回功能的服务端校验存在漏洞,攻击者使用密码找回链接重置密码时,通过 Session 覆盖的方式成功重置其他账号的密码。


第一步:使用自己的账号进行密码找回.

第二步:收到邮件后先不要点击链接.

第三步:在同一个浏览器内打开网站再次进入密码找回页面,输入其他人的账号。

第四步:点击找回密码邮件后,停止在该页面。

第五步:在同一个浏览器里打开第二步中自己邮件中收到的链接,然后设置一个新的密码。

第六步:使用新设置的密码成功登陆进了别人的账号.


防范密码找回漏洞的相关措施:

(1)在密码找回功能设计时对用户的凭证验证次数和频率进行限制,防止攻击者对用户凭证的暴力枚举攻击.

(2)对密码找回的各个环节进行梳理,记录分析所有交互数据,避免密码找回凭证等敏感信息直接返回给客户端.

(3)对服务端密码重置 Token 的生成算法进行审计,避免使用容易被攻击者破解的简单算法.

(4)密码重置凭证应与账户严格绑定,并设置有效的时间,避免攻击者通过修改账户 ID 的方式重置其他账号的密码.

(5)对客户端传入的数据要进行严格的校验,手机号,邮箱地址等重要信息应和后台数据中已存储的信息进行核对,不应从客户端传入的参数中直接取用,避免攻击者通过篡改传入的数据方式重置其他账号的密码.

(6)对用户注册,手机邮箱绑定等业务逻辑进行审计,避免攻击者通过用户重复注册和越权绑定等漏洞,间接重置其他账号密码.

    

    

学习的书籍:Web 攻防之业务安全实战指南.

有关Web 攻防之业务安全:密码找回安全案例总结.的更多相关文章

  1. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  2. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  3. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  4. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  5. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  6. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

  7. ruby-on-rails - 在 Rails 中自定义 "Password confirmation doesn' t 匹配密码 - 2

    有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword

  8. ruby-on-rails - 安全地显示使用回形针 gem 上传的图像 - 2

    默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同

  9. ruby-on-rails - 我如何比较 'Bcrypt' Gem解密的密码和加密的密码 - 2

    我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,

  10. ruby-on-rails - 如何在记录更新期间从验证中排除密码字段? ( rails 3.0.4, ruby 1.9.2) - 2

    我有一个允许更新用户记录的表单。它包含:password和:password_confirmation字段,但我不希望在数据库中已存储加密密码时对它们运行验证。View文件中的字段:'ConfirmPassword'%>在互联网上搜索时,我发现了这段代码,我认为它是针对以前版本的Ruby/Rails的。(我会把它放在我的用户模型中。)validates_presence_of:password,:on=>create由于我的用户模型中密码验证的语法不同(如下),我对我需要的语法感到困惑。validates:password,:presence=>true,:confirmation=>

随机推荐