继上次登陆框引起的血案这个文章之后,时隔一个月笔者又写了续集,呃……升华版。

0×00 文章内容结构图

image

0×01 信息泄露

利用泄露的信息可以大大增加我们的可测试点,从而增加我们的成功率。

1. HTML源代码

必看的肯定要属HTML源代码了,源代码里包含了下面所说的JS文件。HTML源代码会泄露很多信息,像程序员未删除的注释、敏感路径等都可能在HTML源代码中找的到,从来增加发现漏洞的成功率。

2. JS文件

很多JS文件中会泄露其他路径,或者敏感函数等。泄露其他路径可以增加我们可以测试的点,泄露一些敏感函数可以实现未授权访问等恶意操作。

3. 其他敏感文件

还可以利用其他途径获得到的文件,如爆破、爬虫等其他方式得到的敏感文件,可能会发现日志文件、配置文件、网站的其他业务页面等。

0×02 点我链接登陆你的账号

这个问题多出现在第三方登陆功能中

1. 主站账号登陆

2. 微信登陆

3. QQ登陆

4. 微博登陆

5. ….

1. 一个二维码引领风骚

呃,小石师傅是真男神,把我带进了米斯特,从此不知归路..……

子业务选择使用主站账号扫码登陆时:

一个登陆框再次引起的血案

将二维转换为HTTP请求(https://cli.im/deqr/)

可以发现只有一个TOKEN参数:

一个登陆框再次引起的血案

使用主站APP 扫码进行登录扫描之后,会弹出确认登录框以确认登录。在点击“登录”按钮的之后,发送如下POST数据包来进行登陆:

POST https://xxx.com/xxxx/confirm HTTP/1.1

….

token=xxxxx&source=passport&fingerprint=一大长串字符

删除finderprint参数,发现对请求无影响=>删除

删除referer参数,发现对请求无影响=>可以CSRF

将请求方法改为GET型,发现失败=>只能构造表单进行CSRF

此时受害者只要是主站登陆状态下,发送了我们构造好的这个表单,那么我这里就可以直接登陆他的账号。

2. 二维码又起风波

使用账号所绑定的微信登陆:

一个登陆框再次引起的血案

扫描之后发现不需要点击确认就登录了,和常规的微信二维码扫描登录完全不一样,这时候才发现原来这里是使用的微信公众号绑定的账户去登录的,解析的二维码地址为:

一个登陆框再次引起的血案

条件:

受害者微信公众号绑定了账号;

受害者微信内点击我们的链接,我这里就这可以直接登陆了

0×03 劫持用户身份凭证

1. XSS劫持

子站使用主站账号登陆时,来来回回N个数据包,经过我仔细观察,得出重要结论:

如果主站是登陆状态,那么访问如下链接,主站便会返回身份凭证

经过测试发现:这个client_id参数必须存在,但是没有什么影响,不会影响整个攻击。

一个登陆框再次引起的血案

然后,我们便可以使用返回的这个链接来登陆受害者这个子站。为了获得响应包里面Locatin的值,我们可以使用该域下面的XSS来获得。

2. JSON劫持

当然,如果发现此处返回的用户凭证如下格式,那么当然首先考虑到的便是json劫持了。

一个登陆框再次引起的血案

关于json劫持,大家可以移步key师傅博客

http://gh0st.cn/archives/2018-03-22/1

0×04 XSS

1.登陆时XSS

一个登陆框再次引起的血案

POST类型,尝试修改改为GET类型:

一个登陆框再次引起的血案

发现成功弹窗,呃,即使不能修改成功,那么还可以组合CSRF一起使用。

2. 登陆成功时XSS

一个登陆框再次引起的血案

所有参数测试一遍,发现link参数,存在xss,直接在script标签里面,并且还送URL跳转一个。

一个登陆框再次引起的血案

3. 登陆失败时XSS

一个登陆框再次引起的血案

逐个参数进行测试后,最后发现gourl参数存在xss,过滤了script关键字,使用tab键进行绕过。

一个登陆框再次引起的血案

4. 利用泄露的文件进行XSS

通过源代码发现了一个隐藏的链接:

一个登陆框再次引起的血案

打开之后发现提示缺少sid参数,此时手动构造:

一个登陆框再次引起的血案

点击确定之后,跳过去的是一个荒废的页面,此时我回过头来看了一下源代码,尝试手动添加action、method参数:

一个登陆框再次引起的血案

发现了method参数有效,此时构造xss payload,成功弹窗(= = 没想到method参数也可以)。

一个登陆框再次引起的血案

5. 接口JSON XSS

发现请求链接是:http://xxxx/swap/im?callback=jQuery18900926711223842687

而响应包内容是:

jQuery18900926711223842687({"errorCode":1,"errorMessage":xxxxxxx})

灵光一闪:可以测试JSON劫持嘛。但是由于响应包的内容并没有啥作用,所以此处的JSON劫持完全没有危害,但是这里却还可以测试XSS漏洞。

一个登陆框再次引起的血案

构造如下链接,成功弹窗:

http://xxxx/swap/im?callback=<script>alert(1)</script>

一个登陆框再次引起的血案

0×05 URL跳转

用户登陆这个功能这里,可以测试的点可以但不仅仅并且不一定是如下几个:

1.登陆成功后跳转到的页面

此处link1参数可以控制跳转到的页面:

一个登陆框再次引起的血案

一个登陆框再次引起的血案

2.登陆失败后跳转到的页面

此处的gourl参数可以控制返回的页面:

一个登陆框再次引起的血案

可以看到设置了自动跳转,(呃……我们让他跳转到mstsec)。

一个登陆框再次引起的血案

一个登陆框再次引起的血案

0×06 未授权访问

1. JS文件背后的秘密

在查看源代码时发现引入了该JS文件,跟踪……

一个登陆框再次引起的血案

发现了两处接口,逐个跟踪。

一个登陆框再次引起的血案

发现下面那个接口直接未授权访问… 泄露了该站,所有的用户名,此时便可以进行有针对性撞库了。

一个登陆框再次引起的血案

2.看JS如何不见泰山

通过JS来验证权限时,还可以通过删除JS来实现未授权访问,例如登陆失败时通过JS来实现跳回主页面。简言之便是绕过客户端校验类型,so easy~

0×07 不安全的对象直接引用 | 设计缺陷

1. JS文件GETSHELL

通过读取JS代码时发现这么一段,竟然可以文件上传。

一个登陆框再次引起的血案

构造如下表单:

一个登陆框再次引起的血案

成功GETSHELL:

一个登陆框再次引起的血案

2. 任意用户登陆之绕过客户端校验

一个登陆框再次引起的血案

登陆成功后相应包里返回一条链接 http://xxx.com/user/login.php?id=MTAw。发现是用户ID的base64编码,此时遍历用户ID,实现任意用户登陆。

一个登陆框再次引起的血案

3. 最风骚之参数的FUZZ

1)任意后台地址,手动添加参数admin=1之后,发现返回了cookie,成功登陆

2)普通用户时,手动添加debug=1之后,发现权限竟然多了一些。。

呃。。关于参数的fuzz,增删改都可以进行尝试

0×08 感言

笔者现在是米斯特安全团队的成员(外围 .. 并且实习),想对大家说的是:欢迎各位大佬加入我们的团队,一起进行孜孜不倦的学习

呃 … 猝死的那种 ==

最后真心感谢米斯特安全团队各位师傅的指导,他们的思路是真的骚 = =

万分感谢米斯特的各位师傅,协助我完成了这篇文章,包括但不限于:

key师傅,动不动就秋名山走一圈的男人!

小石师傅,我男神!带我走进了米斯特的男人,自此一去不复返 = =

狗哥师傅,dogboy,呃… 总感觉怪怪的,还是喊狗师傅吧。此时狗哥抿了抿嘴,满意的笑了 = =

Taskshi师傅,米斯特新秀,裤兜装满0day的男人!

*本文作者:丶楼兰