挖洞经验 | 利用密码重置功能实现账号劫持

最近,我参加了某平台邀请的漏洞测试项目,在其中发现了一个独特的账号劫持漏洞,整个漏洞发现过程非常意外也非常幸运,通过密码重置功能就能实现账号劫持,在此我就把它写成 writeup 分享出来。由于测试项目的保密和隐私原则,抱歉截图太少,且下文中涉及的网站域名部分我已作了编辑隐藏,敬请见谅。

从Blind XSS说起

在对一个域名进行前期踩点时,我偶然发现一个前端应用,它有一个是很旧的主界页,但登录表单没有使用HTTPS。我想,如果连登录页面的证书都没有,那应该还会存在什么脆弱性呢?于是我认真检查并发起测试请求,尝试在该页面网站注册一个新账号。可惜的是,必须需要一个后缀为@company.com的公司邮箱,或者注册帐号需要后台管理员验证批准,才能成功完成注册。

考虑到这一点,我想我应该测试一下该前端应用是否存在Blind XSS漏洞,于是我在登录的“名字”和“姓氏”字段中提交了有效的XSS测试载荷,当我单击“提交”按钮时,收到以下错误消息,这让我感到意外。我没把blind XSS测试载荷一起截屏,但整个过程返回了以下错误响应:

测试盲注漏洞(Blind SQLi)

好吧,既然这样,那我来试试盲注漏洞(Blind SQLi)吧。通常,出现这类错误响应信息后,我会第一时间想到用Sqlmap来测试一下注入漏洞。但遗憾的是,可能因为不能使用同一个邮箱两次注册账号,此处发起的账号注册式的SQL注入请求没能成功响应。另外,在Sqlmap中存在一个选项设置,可以在账号注册需要的邮箱地址中添加一个数字,形成特殊的注册请求,但是我发现手动来做速度会更快。就这样,我反反复复试来试去,最终也只能得到一些无效的语法响应。好在,在朋友Gerben Javado的帮助下,我成功构造了一条有效的账号注册式SQL请求,其响应提示,该注册账号已成功创建,但却需要等待后台激活。

既然能这样,那这肯定存在盲注漏洞(Blind SQLi),但由于我无法从测试页面中查看到请求响应结果,我就转而使用以下Payload来继续测试:

该Payload下,页面在10秒过后发生响应,其中MID(@@version,1,1) = 5来测试后端MySQL数据库版本是否为5以上。另外,我还在此发现了一个反射型XSS。

实现账号劫持

现在,可以构造有效的账号注册式SQL请求,也能形成有效的盲注漏洞(Blind XSS ),为此,我一直用XSSHunter来测试看看能否发现新的XSS点,几经测试已是深夜,困的不行,只能明天再战。第二天,我认真查看测试记录,意识到接下来可以从3个方面深入:

在第一张MySQL的错误响应截图中,在底中可以看到它提示“Please contact XXXXXX and let him know you’re having trouble.“,这至少能说明我给出的注册需要邮箱是有效的; 在第二张账号注册式的SQL请求截图中,其中提示,网站系统后台会向注册邮箱发送一封验证邮件; 另外,可以对网站系统的密码重置功能进行一些后续分析。

综合以上三方面情况,我决定测试一下其密码重置功能。由于我提交了上述发现的盲注漏洞,目标公司告知我,曾经按计划,这个网站应用本来是要被移除下线的,为此他们让我不用担心风险后果,放开手脚去测试。另外,征得目标公司同意,我获得了一个有效的公司名后缀邮箱valid_user_address@company.com,以便用于后续测试。

在密码重置功能中,唯一的要求是有一个有效的公司名后缀电子邮箱,它会向用户发送一封电子邮件,该邮件内容具体不详。我先来测试它是否易受HTTP参数污染攻击( HTTP Parameter Pollution),之后是SQL注入漏洞,但好像都不行。然后我想,如果系统后台正在向我提供的邮箱地址发送验证性邮件,那么我是否可以尝试,使用SMTP标头注入法( SMTP header injection)将我自己设置的邮箱地址,添加成抄送或密件抄送的另外一个邮箱地址,这样我就能收到与提供邮箱同样的验证邮件了。

SMTP头注入漏洞是在未进行充分审查过滤的情况下,用户输入被放入电子邮件标头中,从而使攻击者能够注入具有任意值的其他标头。此行为可用于向第三方发送电子邮件副本、附加病毒、提供网络钓鱼攻击,并经常更改电子邮件的内容。典型应用就是,垃圾邮件发送者通常会以这种方式,利用存在漏洞的攻击公司名声,来增加其电子邮件合法性。如果电子邮件包含了一些攻击者不该看到的敏感信息(如密码重置令牌等),则此问题就非常严重。——-Portswigger

最终,我形成的抄送命令如下

URL解码之后是这样的:

valid_user_address@company.com BCC:me@me.com

其中,me@me.com是我自己提供的邮箱,即抄送副本的第二个邮箱地址。而valid_user_address@company.com是我征求公司获取的有效公司邮箱地址。

上述抄送命令提交之后,我立即查看了我的邮箱me@me.com,看看是否有某种密码重置令牌或其它可进行密码重置的东东,当然,我希望这种重置机制最好是没有其它类型的双重验证(2FA)。让我惊喜的是,我邮箱收到的电子邮件内容如下:

就这样,网站以明文形式向我发送了用户密码,我甚至可以通过登录确认该密码仍然有效。最终,我向项目组提交了我的测试报告,另外,结合之前发现的Blind XSS,我还发现了更多的SQL注入漏洞,之后,目标测试公司也下线停用了该网站。

*参考来源:jr0ch17,FreeBuf 小编 clouds 编译,转载请注明来自 FreeBuf.COM

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-04-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVA高级架构

程序猿的日常——SpringMVC系统架构与流程回顾

web开发经历了很漫长的时间,在国内也快有十几年的时间了。从最开始的进程级到现在的MVC经历了很多的改进和优化,本篇就主要复习了解下Spring MVC相关的知...

3475
来自专栏安恒信息

安全漏洞公告

1 Check_MK 任意文件上传漏洞 Check_MK 任意文件上传漏洞发布时间:2014-03-26漏洞编号:BUGTRAQ ID: 66394 CVE(...

2857
来自专栏Java技术栈

SpringCloud Eureka自我保护机制

自我保护背景 首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行。...

38310
来自专栏一英里广度一英寸深度的学习

Hello,Java女神

第一阶段:C++转行,开始学习Java 第二阶段:Java Web,jsp+servlet 第三阶段:Struct Spring 第四阶段:Spring ...

1255
来自专栏Java面试笔试题

什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?

893
来自专栏静下来

linux nginx安装HttpGuard防止CC攻击

image.png 之前说了安装verynginx来进行cc防御和防火墙,虽然功能强大,还有控制面板,但是个人就只是防御下cc,还是找个简单的好了。 Http...

78010
来自专栏MoeLove

Linux上源码编译MongoDB

MongoDB的官网上是有已经编译好的二进制包的,这里选择clone MongoDB在github上的仓库

1003
来自专栏农夫安全

【小技巧】获取到的cookie如何简便使用

首先假设我们通过XSS或者前端某骚姿势拿到某人的cookie【必须是完整cookie,因为cookie不完整也时候不能成功登录该用户的】

1002
来自专栏xiaoheike

嵌入式(Embedded)Neo4j数据库访问方法

应用中采用嵌入式Neo4j(Embedded Neo4j)数据库,插入数据后不知道如何访问。查询之后知道有Neoclipse这个可视化工具,最新版本是1.9.5...

1442
来自专栏散尽浮华

squid代理http和https方式上网的操作记录

背景: 公司IDC机房有一台服务器A,只有内网环境:192.168.1.150 现在需要让这台服务器能对外访问,能正常访问http和https请求(即80端口和...

3875

扫码关注云+社区