任意密码重置的一个场景

背景

做授权渗透的时候要求要写明文传输漏洞,这就导致很多没有上 HTTPS 的网站为了修这个明文传输的问题,用尽了各种奇葩的做法,其中见得比较多的就是使用 RSA 或是 AES 对传输的数据进行加密后传输(还见到用 base64 进行编码之后就算修了的)。

但是要知道,加密都是在客户端进行的,而且 AES 是对称加密算法(就算是 RSA 非对称加密,也只是不能解密加密的内容,但有了公钥之后,拿去加密自己提交的 payload 还是可以的),所以只要拦截到数据包,理论上加密的信息都是可以解密的。面对这些掩耳盗铃的修复方式也是很无奈,但是也还是有稍微提高一些攻击成本的。

场景

最近就碰到一个场景了。 修改用户密码的地方在收取手机验证码的时候注意到验证码只有4位,而且是纯数字,接口还没有对验证码的验证次数进行限制,这就意味着可以进行遍历对任意用户的密码进行重置。 但是还有一个问题就是它对提交的信息都进行了加密

这就意味着,如果需要继续进行下去,就需要绕过加密这道坎。然后我就进行了各种尝试。

第一次尝试

思路一:对它的加密过程进行逆向,拿到 key 和 vi 值,然后再写个脚本在本地进行加密后再post到目标地址,但是逆了一个多个小时,愣是没搞掂(留下了没技术的眼泪),然后就放弃了这条路。

思路二:把网页的关键内容扒下了,然后在本地调用它预留的加密和处理的接口,再post过去。但是又遇到问题了,一开始以为它的 key 和 vi 值是固定的,就下断点调试从网页上拿到 key 和 vi 值之后就放到本地去做加密处理,但是后来发现它的 key 和 vi 值过几秒就会刷新一次,网页每次请求之前都会获取一次新的。但是本地的网页和目标网站不是同一个源,而且网站的CORS设置也没有问题,所以根据浏览器的同源策略,AJAX 获取 key 和 vi 是不行的,通过 AJAX 去 POST 数据也是不行的。

然后到这里,第一次尝试就已失败告终了(当时项目很急,而且任务量还很大,如果一直死磕这个问题,那后面的就不用做了,所以当时就只能放弃了)

第二次尝试

过了几个星期,也就是这几天,那个项目要求再做一次测试,鉴于之前已经把问题挖得七七八八了,所以这次就有时间去继续研究下这个问题了。

分析了一下上次的失败,写代码是不可能的,这辈子都不可能,只有当脚本小子才能勉强维持现在的生活。那第二个思路关键点在于解决同源的问题。 想到这个关键点之后就好办了,最直接的方式就是在它的源上运行我的代码。那要怎么才能在它的源上运行我的代码呢?

首先想到的就是在浏览器上修改代码,但是浏览器并没有提供这个功能,那就要把服务器返回给浏览器的数据给修改了,欺骗浏览器去运行,这就要祭出我们强大的 burpsuite 了。

把这个页面的代码拦截下来修改(这个场景很欺骗,手机验证码在这个页面才验证,所以并不是到了这个页面就可以重置密码了):

拦截下来之后稍微加工一下:

这代码的意思是遍历1000到9999(因为验证码是4位),把对应的数值转换为文本后放到提交的数据的验证码字段,再交给它页面本身的加密算法加密后去提交(所以这里我根本不需要知道它加密算法的细节,只管去调用就行了)。

放行之后浏览器就收到这个修改之后的页面,里面已经包含我加入的代码了,剩下就交给浏览器去跑了,几分钟后跑了出来,自动跳转到登录页:

自此,成功修改13800138000用户的密码(之前还有一个任意号码注册的洞,所以当时注册了这个不存在的手机号)。

总结

很多时候一些代码其实不需要自己手工去一步一步逆,可以借助环境帮你跑出来(一开始我也钻了牛角尖),很多CTF的 writeup 也看到借助环境跑出加密的代码或变量的。 通过拦截和修改服务器的返回包可以欺骗浏览器在指定源上跑自己的代码从而绕过同源策略的限制。

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏静晴轩

Http和Https的区别

今天大家一起聚于会议室听一个同事的分享,中途需要联网的时候,网络状态良好竟不能访问该网址,那些年也是接触过网络的我看了下懵了,旁边一大牛瞬间即解决了(将地址前的...

38640
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识

本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作。

20420
来自专栏IT笔记

开发银联支付之前要做的那些事儿

28930
来自专栏FreeBuf

利用OAM加密缺陷漏洞构造任意用户身份测试

SEC Consult 团队发现了 Oracle Access Manager (OAM) 上的一种有意思的加密格式,本文中,我们将演示如何用这种加密方式的微小...

13840
来自专栏每周一脱topic

HTTP后台服务拥抱HTTPS方案

自学微信小程序时,看到小程序现在只支持https了。而且现在chrome中浏览http的网站,网址前都会直接显示“不安全”字样。http是明文传输,相当于所有信...

3.1K40
来自专栏程序员的碎碎念

php实现登录短信验证

今天benny要跟大家说这个其实很简单,就是借用某一个平台的短信api接口实现短信验证,说简单呢,那是因为他的官网:http://www.ucpaas....

99890
来自专栏lulianqi

TestTool Part_1

8320
来自专栏企鹅号快讯

Tomcat的设置HTTP页面自动跳转到HTTPS

HTTP转换到HTTPS常见的解决方案是部署SSL证书来升级。只有正确部署了SSL证书才能使用安全的HTTPS。但有时候,客户端使用HTTP进行访问时,HTTP...

41150
来自专栏编程坑太多

『高级篇』docker之kubernetes理解认证、授权(37)

为了解决上面说的问题,kubernetes并不需要自己想办法,毕竟是网络安全层面的问题,是每个服务都会遇到的问题,业内也有成熟的方案来解决。这里我们一起了解一下...

14020
来自专栏MelonTeam专栏

移动互联网IM之协议设计

导语:如果想自己动手实现一个移动互联网IM app,要怎么做?第一个要解决的问题就是IM协议的设计。本文将讲述如何从0到1设计一个私有的tcp协议。 虽...

51680

扫码关注云+社区

领取腾讯云代金券