`
zhengyun_ustc
  • 浏览: 79816 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

安全基础教育第二季第1集:屡战屡败的找回密码

阅读更多
郑昀 创建于2015/5/19 最后更新于2015/8/7
关键词: Web安全、系统安全、Web开发、找回密码、重置密码

本文档适用人员:广义的技术人员
提纲:
  1. 堡垒是从内部攻破的
  • 员工无知者无畏
  • 运维配置暴露细节
  • 后台不设防
  • 常犯常新,屡战屡败
  • 找回密码
  • 图形和短信验证码
  • 平行权限
  • MD5等于明文
  • 处处留心皆学问
  • 表单被篡改
  • App被篡改
  • 跨站请求伪造

0x00. 前言:

    第一季培训主要宣导两点,第一,白帽子或黑客都很有耐心,他手里可能捏着你多个漏洞,他一直在等机会,他也有很多工具在扫在寻找机会,第二,一次成功的入侵渗透,并不需要是多么高危的漏洞,几个普普通通的中等漏洞,加上一次社会工程学行动,就可以杀进来。
    第二季主要讲一下几乎所有的 Web 工程师都容易犯的安全错误。有些事情你必须知道,并且身体力行,成为你根深蒂固的开发习惯和思路,否则会重现这个地毯上刹车的悲剧。
 http://ww1.sinaimg.cn/bmiddle/62037b5ajw1ec0lxccvrbg20a305ve83.gif

0x01. 找回密码:

    Web 站点的安全重灾区就是找回密码功能。很多工作了多年的 Web 开发工程师仍然意识不到这些基本安全原则:
  1. 客户端提交的 HTTP Request 是不可信的,表单数据可能被篡改,验证信息可能被仿冒;
  2. 客户端展现的一切,服务器端发给客户端的一切,一切信息,GET/POST参数,HTML/JS/Cookies,都可以被白帽子看到,毫无秘密可言;
  • 靠 JavaScript 在客户端校验,第一白帽子可以在浏览器跟踪调试 JS,看懂你的算法,第二设置断点修改堆栈参数,所以靠服务器端校验才是硬道理。
  • 白帽子也是程序员,第一他可以把各种漏洞扫描规则写成程序定时扫描深度广度遍历,你的站点今天上了一个漏洞,明天他可能就知道了,第二他可以发起字典穷举式暴力攻击,换 IP 对他们来说是小菜一碟。所以,打一开始你就必须有防范措施,图形验证码,rate limiter,Form Token,签名……
  • 安全问题往往是多个不起眼的小问题叠加在一起导致的,所以不要觉得这个问题无所谓那个问题小意思,想不修复就不修复,最后千里之堤溃于蚁穴。
 
1.1.你看不见,你看不见:掩耳盗铃式的开发人员
你敢保证你不会做出下面这种事情吗?
 
案例一:PPS 
+网页版忘记密码功能:
++贴心地实现了“重新发送找回密码邮件”功能。不幸的是,在 URL 里,用来接收邮件的 email 参数是明文的,WTF?!
++从而可以将任意用户的密码重置邮件发给指定邮箱。
图1 找回密码篇-案例1
图2 找回密码篇-案例1-把email参数改一下,改成我的邮箱,uid不变
 
案例二:拉手网
+App 里的忘记密码功能:
++首先,通过抓包分析,发现密码重置接口也可以 Web 访问;其次,填入手机号码提交,服务器端的响应中,居然包含明文短信验证码,虽然是在 JavaScript 中的注释里,当我看不见啊?
图3 找回密码篇-案例2
++此事绝非个案。如第三方支付平台支付通也干过
 
案例三:走秀网
+走秀网团购的忘记密码功能
++点击忘记密码,选择输入手机号码重设,点击获取验证码,用 firebug 注意观察浏览器发出的 AJAX 请求,验证码即将出现,神啊
图4 找回密码篇-案例3
++直接输入此验证码即可重置密码了。
 
案例四:惊天大案,新网互联
+网页版忘记密码功能
++页面上虽然展示的是星号遮挡的邮箱地址,很贴心,但 HTML 文档构造的表单参数里却使用邮箱明文字符串,最终导致2013年5月12日土豆网域名被劫持,酿成国际知名大案:
图5 找回密码篇-案例4
图6 找回密码篇-案例4-白帽子有专用工具,找到关键词很容易
图7 找回密码篇-案例4-改表单参数从新提交
图7-1 找回密码篇-案例4-成功获得土豆网域名管理权限
 
案例五:搜狐网
+网页版找回密码功能
++找回密码时要回答“密码提示问题”;但是工程师把答案明文写在 textarea 控件的 JS 校验函数里了,晕倒,工程师真是单纯;
++从而可以重置任意搜狐用户密码;
图8 找回密码篇-案例5
 
案例六:中兴某站
+网页版找回密码功能
++发送到邮箱里的重置密码链接上,Token 一看就是时间戳,精确到秒,因此可以轻易构造;
图9 找回密码篇-案例6

1.2.你能看见,那我 MD5 一下你就看不见了:Too young too naive 的开发人员
有些工程师看的入门教材可能版本太老,内容过时,所以总以为 MD5() 是神器,殊不知在 MD5 爆破库面前等同于明文。
案例七:奇虎360
+网页版找回密码功能:
++360的找回密码邮件里,重设密码地址格式为:http://i.360.cn/findpwd/setpwdfromemail?vc=%一个MD5加密串%&u=blabla%40gmail.com;
++利用 MD5 爆破库逆向解密后发现,这个 MD5 加密串是一个类似于 1339744000 的数字,很像是UNIX时间戳;
++白帽子进一步验证后猜测,用户找回密码时,系统将此时的UNIX时间戳,与帐号绑定,记录在密码重置队列里,修改该用户的密码时会验证输入的 vc 参数;
++看似合理,但360工程师忽略了一个细节:假如这个时间戳是新生成的,攻击者就能在一定时间段内进行暴力破解,给定任意邮箱,很快就能算出一个有效的重置密码链接;
图10 找回密码篇-案例7-MD5(timestamp)
 
案例八:途牛网
+注册激活邮件功能: 
++注册某牛网后,系统发的注册邮件里,激活URL里,id参数实际上是用户的userid,可以遍历,str参数则是MD5(id)加密串,如下图所示;
图11 找回密码篇-案例8-整数userid,MD5(userid)
图12 找回密码篇-案例8-密文输入MD5爆破库立刻得到明文真值
++从而能注册任意邮箱并激活,或遍历所有整数id激活。
 
案例九:新浪二手房
+网页版找回密码功能:
++点击忘记密码,随意输入一个用户名后,通过 firebug 观察 AJAX 数据包,注意到服务器端返回了一个 JSON 串,很明显是一个手机号码,被 MD5 了一把:
图13 找回密码篇-案例9-ajax返回了用户名对应的手机号,MD5等同于明文
++在手机号码输入框里输入解密后的号码,焦点移开后,浏览器发起了一个 AJAX 请求去获取数字验证码(这是神马逻辑?WTF!)
图14 找回密码篇-案例9-好吧,数字验证码也是MD5了一把
++MD5 爆破库面前,统统都是明文,于是得到数字验证码为 234589,输入后成功重置密码。

1.3.眼里只有 Token:Too young too naive 的开发人员
有些工程师确实单纯,他们做各种业务场景都可能引入平行权限漏洞。在他们的眼里,在服务器端校验一下输入参数 checkcode 或 token 或 vi 参数,就已经很了不起了,校验过了,干啥都行,所以 Token 虽然是颁发给用户 A 的,但可以改用户 B 的数据。
 
什么是平行权限漏洞?
我举一个栗子。
2012年的时候,你注册一个网易邮箱,注册成功后会跳转到一个绑定手机的安全提示页面:
注意链接参数里的 uid,将它改为其他人的网易邮箱地址,在页面上输入你可控的手机号,提交。
目标网易邮箱成功被越权绑定了密保手机。
这就是平行权限漏洞,或者叫“越权”。
 
案例十:身份通
+邮箱找回密码功能
++重置密码的链接发送到了对应邮箱,链接如下:
http://www.idtag.cn/regionTempAction.do?method=resetPassword&idtagCard=用户ID值&authcode=Go8K7yp4TWy&rtEmail=邮箱地址
++抓包后,看到类似于的真值:
org.apache.struts.taglib.html.TOKEN=83accc27d5178f832d9f22a1d02bdacf&org.apache.struts.taglib.html.TOKEN=83accc27d5178f832d9f22a1d02bdacf&rtPassword=123456&passwordw=123456&rtEmail=邮箱&idtagCard=用户ID
++Token 不变,试着改一下用户ID,再次提交请求,哇,成功重置密码:
图15 找回密码篇-案例10
 
案例十一:OPPO
+使用绑定手机号码下发短验找回密码功能
++走正常流程,输入收到的短验和新密码提交,抓包,checkcode不变,将用户名改为任意账户,再次提交,成功重置密码;
图16 找回密码篇-案例11
 
案例十二:携程旅行网
+使用邮箱重置密码功能
++点击系统发送到邮箱的重置密码链接,重置密码并抓包:
图17 找回密码篇-案例12
图18 找回密码篇-案例12-发现Uid一枚
++是的,在 POST 数据中发现标识用户身份的 Uid 参数,而这个 Uid 在密码重置的第二步时,系统会“主动”提供给我们(注意看图17);
++我们用 firefox 的插件 LiveHTTPHeaders,利用它的修改 POST 表单参数并重放功能,修改 Uid,提交表单;
++成功重置另一个用户的密码。

1.4.信任客户端校验的小朋友,你危险了
白帽子有很方便的工具可以调试,可以拦截 Response,可以重放,这个客户端不仅仅指浏览器,还包括手机 App。
案例十三:乐蜂网
+使用手机号找回密码功能;
++进入乐峰网供应商管理系统,点击忘记密码,输入用户名 admin,选择手机找回密码,随意填写一个短验,然后点击下一步,此时抓包:
图19 找回密码篇-案例13-随便写一个验证码填进去
图20 找回密码篇-案例13-截断返回的数据包
++经过反复测试,将下图中的返回码,改成 102 即可绕过,服务器端响应后,直接跳转到重置密码页面:
图21 找回密码篇-案例13-修改 Body 值
++成功重置。
 
1.5.玩 Cookie 玩砸了的小朋友
白帽子都身经百战,跟各种互联网公司的各种层次攻城狮斗智斗勇,所以他们都总结了很多种突破模式。其中一种就是会话覆盖,专门盯着那些喜欢把乱七八糟东西存储在 Cookie 里的小朋友。
案例十四:聚美优品
+使用邮箱找回密码功能;
++1,用浏览器找回你自己的聚美优品帐号的密码,选择验证身份方式为邮箱;
++2,你的邮箱会收到一封邮件,但不要点击那个重置密码链接,但你可以注意到这个链接上没有帐号信息参数;
++3,同一个浏览器继续使用找回密码功能,这次找回目标用户的密码,但到了下面这个步骤后就停住:
图21 找回密码篇-案例14
++4,仍在同一个浏览器里,(否则就不灵了),打开第二步里我们收到的那个重置密码链接:
图22 找回密码篇-案例14
++5,填写新密码,提交,okay,成功重置了目标用户的聚美优品密码:
图23 找回密码篇-案例14
图24 找回密码篇-案例14-搞定
 
1.6.不做 Rate Limiting 就是愚蠢
关键业务不做提交频次阈值防范,就是愚蠢,就等着被别人爆破吧。

参考案例,WooYun: 当当网任意用户密码修改漏洞,还有的做了频次限制但是被绕过的经典案例,WooYun: 微信任意用户密码修改漏洞,它限制了提交次数,但是存在逻辑问题,在手机号字符串后放一些字符就可以绕过。


 
好了,大致就是这么多案例,我们复习一下:
  • 客户端提交的信息,客户端存储的信息,都可能是经过篡改的;
  • 白帽子是程序员,他们有很多工具,可以很方便地找到漏洞、篡改数据并重放;
  • 整数ID是可以遍历的;
  • MD5加密串是可以反向爆破的;
  • JS 校验是不大靠得住的,可以绕过;
  • 每一个互联网站点都有的找回密码功能,看似简单,但对于 Web 开发工程师来说,没那么容易,它能考察出你是一个什么样的工程师,你未来能走多远。
 
最后借用乌云知识库的 BMa 整理的找回密码常见弱点:
  1. 密码找回凭证太弱,如四位数字验证码,容易被爆破 
  2. 密码找回凭证可以从客户端、URL中直接获取 
  3. 密码找回凭证可以在网页源代码中直接获取 
  4. 密码找回的邮箱链接易猜解,如时间的md5 
  5. 跳过验证步骤和找回方式,直接到设置新密码页面
  6. 密码找回凭证存并非只是与单个用户并绑定的问题
  7. 重置密码时返回的 token 没有与账号以及验证码绑定
  8. 密码找回的手机或邮箱可以从页面获取到,所以可以通过 firebug 修改 
  9. 提交新密码时修改用户ID为其他用户ID
  10. 找回密码时没有在服务器上验证用户名与邮箱是否匹配便发送了验证码
  11. 在本地验证服务器的返回信息,确定是否执行重置密码,但是其返回信息是可控的内容,或者可以得到的内容
  12. 发送短信等验证信息的动作在本地进行,可以通过修改返回包进行控制
  13. 在找回密码处存在注入漏洞
他的建议是:找回密码凭证要足够复杂并且不可猜测,任何校验动作都放在服务器端进行,
传输的验证参数要做好加密,同时对参数做好过滤。
就到这里。
 
参考文献:
1,2015,乌云知识库,密码找回逻辑漏洞总结
 
-EOF-
1
2
分享到:
评论
1 楼 yangsong158 2015-09-09  
难得的好文,必需支持。

相关推荐

    2024职工群体户外交友拓展“躺进春天 趣野人生”活动策划方案ss.pptx

    2024职工群体户外交友拓展“躺进春天 趣野人生”活动策划方案ss.pptx

    pypy3.7-v7.3.4-osx64.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    腾讯&阿里&携程面试题汇总(精华版).pdf

    腾讯&阿里&携程面试题汇总(精华版)

    pypy2-v6.0.0-s390x.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于C语言实现列车车厢重排问题(源码)

    列车车厢重排问题是经典的组合优化问题,也称为车厢调度问题或车厢排序问题。它的问题描述如下:有一列火车,列车由多节车厢组成,每个车厢上都有一个唯一的标识号。现在需要将这些车厢按照指定的顺序重新排列,使得满足一定的条件,例如车厢编号的升序或降序排列,或者满足某些车厢之间的关系等。

    报告-《新范式 新时代 新机会》dr.pptx

    报告-《新范式 新时代 新机会》dr.pptx

    xx集团数字化转型方案ss.pptx

    xx集团数字化转型方案ss.pptx

    pypy3.7-v7.3.3rc2-osx64.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    Qlik Sense Desktop 2024

    Qlik Sense Desktop 是一个 Windows 应用程序,让个人用户有机会使用 Qlik Sense 并通过多个数据源以简便的拖放操作创建个性化、交互式数据可视化、报告和仪表板。个人和内部业务使用时免费。 您可以创建自己可以重复使用的 Qlik Sense 应用程序,并且可以修改和与他人共享,而不需要部署和管理大量的商业应用程序。 Qlik Sense是一个强大的可视化BI报表开发平台,Qlik Sense Desktop是Windows桌面版的客户端,通常还有Enterprise HUB云端版。

    Java项目源码_ssm_高校学生选课系统项目源码.rar

    **Java项目源码_ssm_高校学生选课系统项目源码.rar** 本资源为一个基于Java技术栈的高校学生选课系统项目源码,采用了SSM(Spring、SpringMVC、MyBatis)框架进行开发。项目涵盖了学生选课、课程管理、教师管理、学生管理等功能模块,可以为高校教务管理提供有力支持。 项目结构清晰,模块化设计,便于二次开发和定制。主要包括以下几个模块: 1. 用户认证模块:包括用户登录、注册、权限验证等功能,支持多角色(学生、教师、管理员)登录和权限控制。 2. 学生选课模块:学生可以查看课程信息、选课、退课等操作,支持选课时间、人数限制等规则。 3. 课程管理模块:教师可以发布课程、编辑课程信息、上传课程资源等操作,支持课程分类、标签等功能。 4. 教师管理模块:管理员可以添加、编辑、删除教师信息,支持教师角色权限分配。 5. 学生管理模块:管理员可以添加、编辑、删除学生信息,支持学生角色权限分配。 6. 成绩管理模块:教师可以录入、编辑、查看学生成绩,支持成绩统计和导出功能。 7. 通知公告模块:管理员可以发布通知公告,支持公告分类、置顶等功能。 8. 系统设置模块:管理员可以配置系统参数、数据备份、日志查看等操作,保障系统稳定运行。 本项目源码可以为高校教务管理提供有力支持,同时也适用于企业内部培训、教育培训等场景。如有需要,可以根据实际需求进行二次开发和定制,以满足不同场景的需求。

    asp代码ASP.NET+SQLBS模式的计算机等级考试管理系统的设计与实现(论文+源代码+开题报告)

    asp代码ASP.NET+SQLBS模式的计算机等级考试管理系统的设计与实现(论文+源代码+开题报告)本资源系百度网盘分享地址

    pypy2.7-v7.3.6-s390x.tar.bz2

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    星闪技术介绍.pptx

    星闪技术介绍

    《情绪管理指南》培训课件ld.pptx

    《情绪管理指南》培训课件ld.pptx

    毕业设计,前端,前端毕业设计

    毕业设计,前端,前端毕业设计

    课件-咨询IT规划方法dr.pptx

    课件-咨询IT规划方法dr.pptx

    非暴力沟通生命的语言lg.pptx

    非暴力沟通生命的语言lg.pptx

    nacos2.3.1改造适配postgresql配置文件

    nacos2.3.1改造适配postgresql配置文件,无需自己再去做数据库适配,导入数据库即可;

    高级网络人才培训专家-X00070003 第30章 配置PPP

    高级网络人才培训专家_X00070003 第30章 配置PPP

    C#的基础知识文档.doc

    C#的基础知识文档.doc

Global site tag (gtag.js) - Google Analytics