攻防演练之接口敏感信息泄露
思路:信息收集-真实IP-前后端分离-接口FUZZ-接口敏感信息泄露
工具:Burp/Yakit+FOFA + reverse-sourcemap+FindSomething
1.信息收集
某次攻防演练,给定目标域名资产:xxxtest.xxx.com,要求拿分。先着手进行信息收集,访问该url,页面跳转到登录界面,大概长这个样子:
登录界面
Wappalyzer显示前端VUE框架:
FindSomething发现不少VUE文件及接口信息:
查IP发现存在CDN:
查JS文件发现webpack打包:(webpack打包之后的访问js文件很慢,应该是没有做优化加上JS太多的缘故)
信息收集结果如下:
前后端分离:前端为webpack打包的VUE、后端Springboot
IP:存在CDN—需绕过CDN查找真实IP
icon:icon_hash=xxxxxx
2.真实IP
由于目标站点存在CDN以及某waf,需查找真实IP才可进行漏洞挖掘,查找真实IP的方法很多,这里不再赘述,根据信息收集到的icon的hash值尝试绕过CDN查找真实IP。
将目标域名丢进FOFA,查看搜索结果,出现目标icon
FOFA-icon
直接点击icon即可搜索对应的目标站点:
真实IP
CDN也在搜索结果中:
CDN
3.前后端分离
用这种方式查找出来的IP有待验证,需进一步信息收集确定是测试环境还是真实环境。
找到了真实IP之后,将真实IP继续丢进FOFA,目的就是看系统开放了哪些服务以及端口开放情况(FOFA搜索不全,探测更多信息需另用工具)。
搜索结果
访问该域名,发现一模一样的系统,着手进行漏洞挖掘
F12打开浏览器检查出现了接口信息,并且接口地址为api.xxx.com,猜测为前后端分离的系统。
针对前后端分离的系统,尤其是接口特别多的时候,可以着重针对于接口未授权进行深入挖掘,有的开发安全意识不足,可能有些接口就未做鉴权,往往未作鉴权的接口就可作为突破点……
言归正传,前后端分离的系统,专门查接口以及接口参数就对了,先用FindSomething的结果将接口参数提取出来。
接口示例
接口参数可直接用FindSomething提取出来,剩下的就是找接口了。之前获取接口信息找到了一个接口地址:xxx-xxx-service
直接查找JS文件,找关键API,关键API找出来之后,拼接参数即可尝试获取敏感信息。(VUE框架,重点找xxx.app.js即可)
前期根据信息收集得到的webpack打包的JS,直接搜索api、secret、username、token、service等关键字,发现xxx-xxx-service接口,该接口在一个键值对中,示例:
{
url: ‘xxx/xxx/xxx/xxx’,
}
接口-01
继续查找接口,发现众多接口均存在一个JS对象的键值对中,键是url,值就是接口地址:
接口-02
全局搜索url,将JS文件中的url键值对全部提取出来,写正则匹配脚本也可以全部提取出来。共提取出一百多个接口。
这里简单介绍一下接口规范,所有的接口都会按照这个规范进行涉及,统称restful架构的接口规范,举个例子:
http://api.xxx.com/api/system/userLists
接口api、system表示服务名称、userLists表示资源名称,看接口意思大概就能猜到获取用户列表接口,如果是GET型,后边肯定会加参数,比如:
http://api.xxx.com/api/system/userLists?pageSzie=10&pageNum=1,意思很明确,就是调用了用户列表的接口,提取出来第一页的十条数据。
如果是POST型,POST请求包中添加json格式的数据:
POST /api/system/userLists HTTP/1.1
Host: api.xxx.com
Content-Type: application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
Content-Length: 0 {“pageSize”10,”pageNum”:1}
此次目标中,接口很多,拿其中一个接口举例子,接口地址为: http://api.xxx.com/xxx-xxx-service/xxx/xxx/get,看接口命名猜测为服务接口,除此之外还有xxx-xxx-auth鉴权接口、xxx-xxx-token获取token信息接口……
4.接口FUZZ
一百多个接口地址提取出来之后,尝试拼接在API接口访问路径下进行fuzz,API接口访问路径为:api.xxx.com,使用Burp进行fuzz,记得取消url编码。
Burp跑的结果均为401,接口也都做了鉴权,访问接口应该携带token进行鉴权才能获取到接口内容。
将FindSometing提取出来的参数拼接到api路径后边,同样也是401。
继续查找JS文件,在JS文件中最后一行发现了xxx.js.map……随即想到了用工具还原webpack打包的JS文件。
直接在JS路径下拼接js.map文件下载下来,文件很大
使用reverse-sourcemap将该文件还原,会在src目录下(可自定义目录)生成还原后的JS文件,有api目录、config目录、路由目录、css的样式目录……
工具还原命令:reverse-sourcemap –output-dir src xxx.js.map
生成的目录以及JS文件太多了,直接找关键的api目录、config目录、utils目录等
直接进入api文件夹中,查找接口JS文件,发现众多接口:
5. 敏感信息泄露
继续利用获取到的众多接口文件以及接口信息不断fuzz,根据JS的文件名查找关键接口均无收获。响应基本都为401,很正常,因为需要携带正确合法的token才行。继续尝试fuzz
终于,在users.js文件中发现了这样一条接口:api/ token/auth?username=,根据提示发现该接口是获取token的接口,将接口进行拼接,尝试访问,提示需要传入用户名参数,尝试admin用户进行接口访问:api/ token/auth?username=admin,成功获取到token值。
管理员的token值获取到了,可以对平台所有接口进行操作利用,任意增删改查,需要注意的是接口fuzz的过程中需要添加或修改参数,根据还原出来的JS文件中的接口参数进行利用,尝试获取敏感信息。
此次还原出来的API文件夹下JS文件有700个左右,如何快速在700个文件中快速查找关键信息接口?
第一:在JS文件中,会有接口参数提示以及接口功能提示:
第二:还原出来的JS文件的命名也可以帮助我们快速找到关键接口信息:
接口获取百万+个人敏感信息:
PageNum和pageSize参数均为JS文件中提示的接口参数,也可以fuzz出来,除此之外,还有众多参数。
在另外一个JS文件中获取到了个人购买信息接口,直接构造参数获取挺多的个人敏感信息: