当前位置: 首页 > 科技观察

Mock在渗透测试中的泛化与改造

时间:2023-03-22 10:08:38 科技观察

Mock简介Mock这个词在软件测试行业比较常用。Mock方法是单元测试中的常用技术。它的主要作用是在应用中模拟一些不易构造或者比较复杂的对象,比如模拟某个接口在特殊情况下的返回值。或者前/后端测试团队用于验证数据返回和显示数据是否满足预期值。目前,有许多开源或商业模拟平台。比如阿里妈妈前端团队出品的RAP,就是一个优秀的接口文档管理和mock平台。RAP通过GUI工具帮助WEB工程师更高效地管理界面文档。同时自动生成Mock数据,通过分析接口结构来验证真实接口的正确性,使接口文档在开发过程中成为强依赖。有了结构化的API数据,RAP可以做的更多,我们可以避免更多的重复劳动。需要Mock的场景在渗透测试中,经常会遇到权限控制,无法访问某个角色下的功能菜单。因此,本文将从两个角度阐述MOCK是如何工作的,并讨论如何通过MOCK来挖掘更多的漏洞。首先,我想解释一下为什么渗透测试也需要MOCK。一方面是为了绕过前端的限制,比如前端的超时设置,手动抓包改包来不及。有些接口的一些参数规则需要手动构造,比较麻烦。上一个请求的返回值MOCK后,下一个请求会自动拼接参数请求,这样就省去了自己看js代码结构的麻烦。俗话说“工欲善其事,必先利其器”,那么让我们看看有哪些工具可以辅助我们进行测试。Mock工具作者使用了Proxyman和Burpsuite这两个抓包工具中的MOCK功能/插件。在Proxyman中,是在Tools-MapLocal(本地)和Tools-MapRemote(远程)中。以MapLocal为例,我们可以在我们感兴趣的界面上右击,添加到MapLocal/Remote中。然后编辑期望的返回类型和返回值,同时可以设置匹配路径,匹配请求方式等。下面演示一个系统前端根据登录后判断是否可以进入索引页面result的值是否为真,否则会提示用户名和密码错误。如果手动改包,会提示超时或请求错误,前端登录后无法跳转到页面。这时候可以通过MOCK将result的值修改为true,这样就可以进入系统进行进一步的测试,查找功能模块是否存在未授权访问等漏洞。还有一些系统的权限资源是根据接口返回的资源路径显示的。比如请求https://testivy.local/resource/list,根据返回消息中的ifBinding判断当前登录用户是否有对应的菜单。权限,因此您可以模拟此ifBinding全部为真以访问所有功能菜单。BurpSuite中也有一个MOCK插件,在插件市场安装HTTPMOCK。同样右键单击HTTP历史记录并选择模拟HTTP响应。然后写入期望的MOCK值,最后点击保存生效。(确认Enabled栏是否被选中)。以下为可注册/商户审核中的低权限账号示例。其中大多数是重复的或内部已知的。所以,我们要找软柿子,哪种柿子好捏,一个是商家的系统,但是这个系统的特点也很明显,或者可以注册但是必须提交各种文件,比如法人身份证、营业执照等后台人员审核通过后方可使用商户系统的功能;或商务合作后分配的账号无注册入口。首先说说可以注册但需要审核的商户账号。首先我们来看一下报送资质文件审核的大致流程:通常此类经营资质材料需要营业执照、法人身份证、法人姓名、门头照片、开户行等,正确还是比较困难的准备好这些材料,顺利通过审核。特别是对于我们快速测试接口漏洞,时间就是金钱。因此,通过MOCK可以快速测试哪些功能模块被认可,以及相应接口是否存在可利用的漏洞。例如,一个系统需要提交一些资质信息进行审核,审核通过后才能具备商户的功能。(图中数据为样例数据)由于本系统是人工审核,提交后多次发回,审核未通过。这时候,我想到了用MOCK。首先,打开首页,有一个界面可以查询商家当前的状态,是未提交、审核中还是审核通过。发现查询审计状态接口:/**/company/detail/v2这时候可以MOCK这个接口,对应proxyman中的Map。将status改为6(1inreview,0inpendingreview),可以通过js找到对应的代码行位置(在js中搜索“pendingreview”,即可轻松找到“reviewed”对应的状态码—状态码为6)(图中数据为样例数据)由于商户审核通过,前端一般会展示相应的功能。如果以后有新的接口来验证商家的状态,也会被MOCKed。这样方便了接口的参数构建,也省去了一行一行看代码的麻烦,扫描工具前点击获取完整的请求参数即可。通过上面的MOCK流程,就可以顺利进入合约页面了:接下来,我们就可以找到对应模块的功能点,开始“大干一场”。这里很多人可能会有疑惑。有很多工具可以从js中提取接口,好麻烦。这个在之前的文章《现代前后端分离式应用API渗透测试探究》已经讨论过了。接下来,我们再来看另外一个场景。无法注册的后台账号/内部员工账号就是针对这类系统。由于没有注册入口,通常只有管理员或者内部员工才能登录。MOCK在这个地方的难点在于不知道如何找到合适的参数。一些简单的系统是根据Response中的resultCode是true还是false来决定是否跳转到后台页面,但是有些系统就比较复杂了。这个时候需要看一下js,需要一点时间。以上内容如有错误,欢迎指出。综上所述,MOCK可以辅助我们进行安全测试。俗话说“通则易变,变则致胜”。安全也是如此。