攻防演练之接口敏感信息泄露

思路:信息收集-真实IP-前后端分离-接口FUZZ-接口敏感信息泄露

工具:Burp/Yakit+FOFA + reverse-sourcemap+FindSomething

1.信息收集

某次攻防演练,给定目标域名资产:xxxtest.xxx.com,要求拿分。先着手进行信息收集,访问该url,页面跳转到登录界面,大概长这个样子:

file

登录界面

Wappalyzer显示前端VUE框架:

file

FindSomething发现不少VUE文件及接口信息:

file

查IP发现存在CDN:

file

查JS文件发现webpack打包:(webpack打包之后的访问js文件很慢,应该是没有做优化加上JS太多的缘故)

file

信息收集结果如下:

前后端分离:前端为webpack打包的VUE、后端Springboot

IP:存在CDN—需绕过CDN查找真实IP

icon:icon_hash=xxxxxx

2.真实IP

由于目标站点存在CDN以及某waf,需查找真实IP才可进行漏洞挖掘,查找真实IP的方法很多,这里不再赘述,根据信息收集到的icon的hash值尝试绕过CDN查找真实IP。

将目标域名丢进FOFA,查看搜索结果,出现目标icon

file

FOFA-icon

直接点击icon即可搜索对应的目标站点:

file

真实IP

CDN也在搜索结果中:

file

CDN

3.前后端分离

用这种方式查找出来的IP有待验证,需进一步信息收集确定是测试环境还是真实环境。

找到了真实IP之后,将真实IP继续丢进FOFA,目的就是看系统开放了哪些服务以及端口开放情况(FOFA搜索不全,探测更多信息需另用工具)。

file

搜索结果

访问该域名,发现一模一样的系统,着手进行漏洞挖掘

F12打开浏览器检查出现了接口信息,并且接口地址为api.xxx.com,猜测为前后端分离的系统。

file

针对前后端分离的系统,尤其是接口特别多的时候,可以着重针对于接口未授权进行深入挖掘,有的开发安全意识不足,可能有些接口就未做鉴权,往往未作鉴权的接口就可作为突破点……

言归正传,前后端分离的系统,专门查接口以及接口参数就对了,先用FindSomething的结果将接口参数提取出来。

file

接口示例

接口参数可直接用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’,

}

file

接口-01

继续查找接口,发现众多接口均存在一个JS对象的键值对中,键是url,值就是接口地址:

file

接口-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编码。

file

Burp跑的结果均为401,接口也都做了鉴权,访问接口应该携带token进行鉴权才能获取到接口内容。

file

将FindSometing提取出来的参数拼接到api路径后边,同样也是401。

继续查找JS文件,在JS文件中最后一行发现了xxx.js.map……随即想到了用工具还原webpack打包的JS文件。

file

直接在JS路径下拼接js.map文件下载下来,文件很大

file

使用reverse-sourcemap将该文件还原,会在src目录下(可自定义目录)生成还原后的JS文件,有api目录、config目录、路由目录、css的样式目录……

工具还原命令:reverse-sourcemap –output-dir src xxx.js.map

file

file

生成的目录以及JS文件太多了,直接找关键的api目录、config目录、utils目录等

直接进入api文件夹中,查找接口JS文件,发现众多接口:

file

5. 敏感信息泄露

继续利用获取到的众多接口文件以及接口信息不断fuzz,根据JS的文件名查找关键接口均无收获。响应基本都为401,很正常,因为需要携带正确合法的token才行。继续尝试fuzz

终于,在users.js文件中发现了这样一条接口:api/ token/auth?username=,根据提示发现该接口是获取token的接口,将接口进行拼接,尝试访问,提示需要传入用户名参数,尝试admin用户进行接口访问:api/ token/auth?username=admin,成功获取到token值。

file

管理员的token值获取到了,可以对平台所有接口进行操作利用,任意增删改查,需要注意的是接口fuzz的过程中需要添加或修改参数,根据还原出来的JS文件中的接口参数进行利用,尝试获取敏感信息。

此次还原出来的API文件夹下JS文件有700个左右,如何快速在700个文件中快速查找关键信息接口?

第一:在JS文件中,会有接口参数提示以及接口功能提示:

file

第二:还原出来的JS文件的命名也可以帮助我们快速找到关键接口信息:

file

接口获取百万+个人敏感信息:

file

PageNum和pageSize参数均为JS文件中提示的接口参数,也可以fuzz出来,除此之外,还有众多参数。

在另外一个JS文件中获取到了个人购买信息接口,直接构造参数获取挺多的个人敏感信息:

file