发现Webpack中泄露的api
发现Webpack中泄露的api
已在先知社区发表,转载请注明出处
1 - 安装 reverse-sourcemap
需要配置好npm环境 (runoob教程)
使用命令(需要代理) npm install --global reverse-sourcemap
进行安装
2 - 寻找xxx.js.map
如果有sourcemap的话,在js最后会有注释:
//# sourceMappingURL=xxxxxxx.js.map
比如这里我要下载MarketSearch.js.map
(MarketSearch.js
是与站点同名的js,应该是主要的js文件)
- 在开发者工具中搜索
.js.map
(位置1) - 找到
MarketSearch.js.map
所在的js (位置2) - 找到对应的链
URL
(位置3)- 一般来说,静态文件会挂载在当前域名下,但不排除其他站点挂载的情况,所以需要找到对应的
URL
,比如这里就不同站 - 这里
MarketSearch.js
的URL
记为http://xxx.xxx/mulu/MarketSearch.js
- 一般来说,静态文件会挂载在当前域名下,但不排除其他站点挂载的情况,所以需要找到对应的
3 - 下载xxx.js.map并获取所有webpack打包文件
使用curl -O http://xxx.xxx/mulu/MarketSearch.js.map
或者直接访问http://xxx.xxx/mulu/MarketSearch.js.map
下载MarketSearch.js.map
使用命令reverse-sourcemap --output-dir ./MarketSearch MarketSearch.js.map
即可获取所有webpack打包文件
4 - 使用IDE/其他编辑器寻找接口
我这里使用的是vs code
直接使用全局搜索 左边侧边栏的搜索图标,或者ctrl+shift+f
4-1 搜索接口
搜索接口有两个方法:
一个是借鉴先验请求的url
,这种情况需要我们可以访问到某些接口,比如非SSO的登录
另一个是直接搜索,这种情况大多是我们没法访问到当前站点的接口
4-1-1 借鉴先验请求的url
比如我们访问的站点xxx.xxx
存在登录接口,通过尝试,发现会调用/MarketSearch/api/login
接口
那么我们可以通过不断删减来搜索接口/MarketSearch/api/login
,/api/login
,/login
可以看到,当我们删减到/api/login
的时候,就可以找到接口对应的代码
这个接口是可以调用的,但是发现其定义的接口与实际访问的接口不同(第五部分解释,这里使用了动态定义的接口)
4-1-2 直接搜索
直接搜索有两种方法,根据请求方法,或者猜测命名规则进行搜索
4-1-2-1 根据请求方法搜索接口
接口大多是通过get/post
方法进行访问的,所以这是一个很好的关键词
通过请求方法,可以搜索到动态定义的接口(第五部分),避免找不到接口的问题。
而且,如果存在请求方法重写的代码,通过请求方法搜索可以发现这些代码的定义。
post
get
4-1-2-1 根据猜测命名规则搜索接口
一般来说,admin
,superadmin
,manage
之类的关键词比较常见
此外,还可以根据站点名,可调用api命名规则,js命名规则进行搜索。这个站点没有这样的接口,就不举例了。
5 - 寻找动态定义的接口
刚好这个站点存在动态定义的接口(直接明文写在js代码中的静态接口相反):MarketSearch/api/login
,上面我们通过搜索,只发现了/MarketSearch/api/user/login
接口,这里介绍一下如何寻找该接口。
首先搜索login
,可以看到在index.ts
中对登录进行了定义
查看index.ts
,可以看到这里定义了用到的视图,继续跟踪Login
视图,命名为Login_1
,路径在./Login
打开Login.tsx
,可以看到根据vse_client_1.defaultMainView.Login
视图,创建了对应的元素,vse_client_1
定义为vse-client
打开vse-client
目录,寻找defaultMainView
视图的定义
跟踪Login
视图,可以看到api_1
路径在./api
,且Login
视图定义了游客登录
和用户登录
两个登录方式,这里跟踪用户登录
登录方法
用户登录
使用了LoginModal
模态框
跟踪LoginModal
模态框,可以看到登录的行为通过yield api_1.api.login(input)
来实现
api_1 = ./api
,input
则是ItemKey
生成的表单中用户填写的数据(username & password
)
跟踪api_1.api.login
大致说一下这里的逻辑:
key是键值,比如这里调用的是
api.login
,则key === login
对于每一个
vse_share_1.Api
定义的接口
如果传入的
key
与其中一个接口相同,且不为constructor
(通过prototype
原型读取,所以需要排除构造函数),则向下继续login
传入__awaiter_
通过
axios_1.default.post(`/${NAMESPACE}/${vse_share_1.ShareConfig.apiPrefix}/${key}`, args)
发起请求${NAMESPACE} === MarketSearch
查看命名空间的定义
跟踪
../share
${vse_share_1.ShareConfig.apiPrefix} === api
- 跟踪
vse-share
,寻找ShareConfig
- 跟踪
${key} === login
args === input
,即,由ItemKey
生成的json{username:"xxx",password:"xxx"}
这种情况下,通过拼接预定义参数和传入的api
名称,动态生成url
路径,避免了静态存储api
路径,使得寻找api
接口需要花费的精力大大提升。(web安全狗流泪)
发现Webpack中泄露的api的更多相关文章
- 记一次Hvv中遇到的API接口泄露而引起的一系列漏洞
引言 最近朋友跟我一起把之前废弃的公众号做起来了,更名为鹿鸣安全团队,后面陆续会更新个人笔记,有趣的渗透经历,内网渗透相关话题等,欢迎大家关注 前言 Hvv中的一个很有趣的漏洞挖掘过程,从一个简单的A ...
- 利用Instrument Leak来发现App中的内存泄露
XCode提供了一组用于检测内存,调试动画,布局等的工具.对于调试一些性能问题,内存问题非常方便.这里我们使用Leak来发现代码中的内存泄露. 在Leak中启动我们的应用开始监控: 注意,在监控的时候 ...
- webpack中插件 prerender-spa-plugin 来进行SEO优化(二十四)
vue.react对于开发单页应用来说带来了很好的用户的体验,但是同样有缺点,比如首页加载慢,白屏或SEO等问题的产生.为什么会出现这种情况呢?我们之前开发单页应用是这样开发的,比如首页 index. ...
- Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)
在前面的随笔<Entity Framework 实体框架的形成之旅--Code First的框架设计(5)>里介绍了基于Code First模式的实体框架的经验,这种方式自动处理出来的模式 ...
- ASP.NET MVC4中调用WEB API的四个方法
http://tech.it168.com/a2012/0606/1357/000001357231_all.shtml [IT168技术]当今的软件开发中,设计软件的服务并将其通过网络对外发布,让各 ...
- Native Application 开发详解(直接在程序中调用 ntdll.dll 中的 Native API,有内存小、速度快、安全、API丰富等8大优点)
文章目录: 1. 引子: 2. Native Application Demo 展示: 3. Native Application 简介: 4. Native Ap ...
- Mvc 6 中创建 Web Api
如何在Mvc 6 中创建 Web Api以及如何脱离IIS实现自我托管 微软推出的Asp.net vNext(asp.net 5.0)的其中的一个目标就是统一mvc 和web api 的框架.接下来我 ...
- C#中调用Outlook API 发起会议
原文:C#中调用Outlook API 发起会议 在我上一篇博文中曾提到了 SharePoint 中调用传出电子邮件中的邮件服务器及地址发送邮件 但是,里面的方法只能用于发送普通电子邮件.如果要发起会 ...
- webpack中利用require.ensure()实现按需加载
webpack中的require.ensure()可以实现按需加载资源包括js,css等,它会给里面require的文件单独打包,不和主文件打包在一起,webpack会自动配置名字,如0.js,1.j ...
随机推荐
- Jmeter 分布式架构和服务器性能监控解决方案
在对项目做大并发性能测试时,常会碰到并发数比较大(比如需要支持10000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能来搭建分布式并发环境 . 一. ...
- 【死磕JVM】一道面试题引发的“栈帧”!!!
前言 最近小农的朋友--小勇在找工作,开年来金三银四,都想跳一跳,找个踏(gao)实(xin)点的工作,这不小勇也去面试了,不得不说,现在面试,各种底层各种原理,层出不穷,小勇就遇上了这么一道面试题, ...
- js--如何实现继承?
前言 学习过 java 的同学应该都知道,常见的继承有接口继承和实现继承,接口继承只需要继承父类的方法签名,实现继承则继承父类的实际的方法,js 中主要依靠原型链来实现继承,无法做接口继承. 学习 j ...
- 简单了解Git
目录 Git命令 如何将一个新建的文件添加到Git仓库 版本控制 本地的项目丢到Gitee上 代码修改以及推送步骤 分支管理 Git命令 1.git init创建git本地仓库 2.ls 查看 ...
- 滴水逆向初级-C语言(二)
2.1.C语言的汇编表示 c语言代码 int plus(int x,int y) { return 0; } void main() { __asm { mov eax,eax } //调用函数 pl ...
- 源码级深挖AQS队列同步器
我们知道,在java中提供了两类锁的实现,一种是在jvm层级上实现的synchrinized隐式锁,另一类是jdk在代码层级实现的,juc包下的Lock显示锁,而提到Lock就不得不提一下它的核心队列 ...
- Java高级【Junit、反射、注解】
1.Junit单元测试 * 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码的.关注程序具体的执行流程. * Junit使用 ...
- C++运算符重载的一些困惑
一.背景 在复习<C++基础与提高>时,自己实现运算符重载(i++)时,几次都报错.其实还是自己对运算符重载这一部分内容理解得不够透彻,于是再次看了下书上的内容,理解算是加深了一些,于是提 ...
- 【随笔】C++类静态成员变量初始化引发的惨痛教训
事情是这样的,我在某个类中声明了一个静态的map成员, 文件名暂且称之为 xxx.h 然后在 xxx.cc 中全局定义了这个东西,静态成员在类里面只是声明,需要在外边被定义才有内存 然后又在main. ...
- Go-23-接口
接口定义 type 接口名 interface{ 方法1(参数列表) [返回值] 方法2(参数列表)[返回值] } 接口实现 func (变量 结构体类型)方法1 ([参数列表])(返回值){ } f ...