背景介绍:
今天的故事来自一位Zhenwar Hawlery白帽子,他和他的好基友是来自库尔德斯坦的白帽子和漏洞赏金猎人,他们喜欢在 Web 应用程序和移动应用程序中挖掘漏洞。废话不多说,开始我们今天的分享。
漏洞发现过程:
目标网站提供了一个由 Flutter 创建的移动应用程序和网站,要知道捕获 Flutter 创建的 APP 请求是很困难的,所以他们没有在移动应用上浪费太多的时间,而是决定把注意力集中在网站上,因为它也是移动应用的后端。
通常,他们会试图找到管理面板,因为主域网站只是一个用于下载应用程序的页面。在暴力破解子域后,他们发现该网站有一个类似的子域 ([admin.project.com]—本篇文章中使用 project.com 作为项目的域名进行替代),与往常一样,他们首先访问了一些敏感的子域。
通过Amass Tool查找子域
当访问某个子域时,他们看到了一处登录页面:
第一个输入字段为手机号码(因此管理员可以通过他的电话号码登录),第二个字段是密码,看起来很不错,但真的是这样吗?
经过尝试发现:
1- 无法暴力破解密码(301 Too Many request)
2- 目录扫描无任何结果
3- 没有任何可以尝试绕过的方式
4- 该网站是个新网站,因此没有任何相关的URL/信息
那么此时如果换做是你,你会怎么做?放弃还是继续?
白帽哥俩发现阅读源代码有时是发现漏洞很不错的一种办法,当他们阅读页面源代码时,只有一行代码值得关注,那是一个 Javascript 文件:
页面源代码
这通常是漏洞的开始,也是最困难的部分,当然也是最令人愉快的部分,因为你应该逐行阅读 JS 文件以了解代码并了解网站的工作方式,这很难,但哥俩却感到非常愉快!:)
打开 JS 文件后,他们首先通常会搜索一下敏感词,如(admin、config、password、token、email、.conf等),当尝试到token时,他们发现了这段‘有料’的代码:
源代码中的一段代码
([“TOKEN”,”hxcdjskhck643782bcdshcdsjk231cbdns”,”fullname”,a,”phone”,b,”city”,c,”superadmin”,d,”permisions”,e,”password”,f],t.N,p))
s=3
return A.U(A.ck(null).cc(“https://project.app/RedactedAppBackend/dashboard/addAdmin.php",c,n),$async$uH)
很明显这是一个 POST 请求:
TOKEN=hxcdjskhck643782bcdshcdsjk231cbdns
fullname
phone
superadmin
permissions
password
那么我们能用它们来做什么呢?首先我们应该知道如果发送一个这样的 POST 请求数据会发生什么?在结合最后的 addAdmin.php URL 部分,我们可以大胆推测它将创建另一个管理员帐户:
RedactedAppBackend/dashboard/addAdmin.php
于是,他们果断从JS文件获得的数据伪造了一个POST请求:
POST请求
喜闻乐见,响应为OK,这意味着他们成功地创建了另一个管理员帐户,于是尝试使用电话号码和密码再次登录:
成功登录控制面板,小哥俩也因此获得了漏洞赏金$奖励。
建议:
对于漏洞赏金猎人来说,重要的是:
1-关注JS文件
2-始终认为你是第一个找到该页面/站点的人
3-没有什么是不可能的
对于开发者来说,重要的是:
请勿将敏感数据放入 Token! 等客户端源代码中。