小程序渗透测试实战:从登录绕越到Web接口漏洞挖掘

发布时间:2026/7/11 5:02:51

小程序渗透测试实战:从登录绕越到Web接口漏洞挖掘 1. 项目概述从“速通”到“挖洞”的实战思维最近和几个做安全研究的朋友聊天发现一个挺有意思的现象很多刚入门渗透测试的朋友一提到小程序就觉得无从下手感觉它像是个“黑盒”。但实际上小程序作为一种广泛应用的Web应用形态其安全测试的核心思路与传统Web应用一脉相承只是多了些特定的“包装”和“限制”。今天我就结合自己这些年摸爬滚打的经验和大家深入聊聊小程序渗透测试中那些绕不开的“硬骨头”——登录绕过、Web接口的快速测试以及如何构建一套高效的漏洞挖掘思路。这不仅仅是几个技巧的堆砌更是一种从攻击者视角理解应用架构、寻找薄弱环节的思维方式。所谓“速通”并不是指有什么一键破解的“神器”而是指在有限的时间和资源下如何快速定位到最可能出问题的关键路径并验证其安全性。小程序由于其运行环境的特殊性如微信容器、网络请求封装、本地缓存机制往往会暴露出一些独特的攻击面。理解这些特性并将其转化为我们的测试优势正是本次分享的核心。无论你是刚接触渗透测试的新手还是想拓宽Web安全测试视野的开发者相信接下来的内容都能给你带来一些直接的启发和可操作的方案。2. 核心思路拆解穿透小程序的“外壳”在动手之前我们必须先想明白我们测的到底是什么小程序本质上是一个运行在特定容器如微信中的、前端逻辑以JavaScript为主、后端通过Web接口交互的应用程序。因此我们的测试目标非常明确前端逻辑的安全性和后端接口的安全性。而“登录绕过”往往是贯穿这两者的黄金入口点。2.1 为什么登录环节是突破口登录认证是绝大多数业务系统的第一道门也是最经典、最复杂的逻辑之一。在小程序场景下登录流程通常涉及微信官方登录态code换取session_key和openid、自定义TokenJWT等、本地缓存wx.setStorageSync等多个环节。任何一个环节的逻辑缺陷、校验不严或配置不当都可能导致整个认证体系被绕过。攻击者一旦绕过登录就相当于拿到了进入系统内部的“万能钥匙”后续的数据泄露、越权访问等高风险漏洞便唾手可得。因此我们的渗透测试很大一部分精力就应该聚焦在如何找到这把“钥匙”的复制品或后门上。2.2 小程序渗透的特殊性分析与传统Web端或App端相比小程序渗透测试有几个关键的不同点理解这些是成功的前提抓包环境复杂化小程序网络请求默认走HTTPS且可能受到微信客户端网络库的封装。你不能简单地用浏览器F12就能看到所有请求。常用的抓包工具如Burp Suite、Charles、Fiddler等需要正确配置代理并安装CA证书到测试设备手机或模拟器同时可能还需要处理小程序对证书绑定的校验。前端代码“半透明”虽然小程序包.wxapkg可以反编译获取前端JavaScript和WXML/WXSS代码这比纯黑盒测试多了很多信息但核心业务逻辑和后端接口交互依然需要动态分析。反编译的代码能帮你快速理解页面结构、找到隐藏接口、分析前端加密逻辑。本地存储与缓存小程序大量使用wx.setStorage进行本地数据存储登录Token、用户信息、敏感配置都可能存放在这里。这些数据如果未加密或加密方式可逆就可能成为突破口。微信生态接口依赖小程序常调用微信提供的JS-SDK接口如支付、分享、获取用户信息。这些接口本身的安全性由微信保障但开发者如何调用、如何处理返回数据就可能引入安全问题例如对wx.getUserInfo返回的加密数据解密处理不当。基于以上特点我们的渗透测试流程就需要进行针对性的调整和强化。3. 实战前准备搭建高效的测试环境工欲善其事必先利其器。一个稳定、可控的测试环境能极大提升你的测试效率。3.1 抓包工具链配置抓包是小程序渗透的“眼睛”。我个人的主力工具链是Burp Suite Professional 一台已Root的安卓测试机或模拟器。以下是关键配置步骤Burp Suite代理设置在Burp中确保Proxy - Options下的代理监听器运行在正确的接口如0.0.0.0:8080。建议关闭“支持不可见代理”选项以减少兼容性问题。手机代理配置将测试手机连接到与电脑同一局域网在手机Wi-Fi设置中手动配置代理服务器为电脑的IP地址端口为Burp监听的端口如8080。安装CA证书这是最关键的一步。用手机浏览器访问http://burpsuite具体地址看Burp Proxy监听器下载并安装Burp的CA证书。在安卓高版本7.0以上中还需要将证书安装到系统信任的凭据存储中否则小程序可能无法信任该证书导致HTTPS请求失败。对于模拟器如夜神、雷电通常可以直接将Burp的证书文件cacert.der拖入模拟器并安装。处理证书绑定SSL Pinning部分安全意识较强的开发者会在小程序中启用SSL Pinning校验服务器证书指纹这会导致我们的代理证书不被信任抓包失败。应对方法有两种一是尝试反编译小程序搜索wx.request相关代码看是否有自定义证书校验逻辑并尝试修改二是使用Frida等动态插桩框架在运行时Hook掉证书校验函数。对于新手可以先从没有证书绑定的小程序练手。注意使用模拟器进行测试有时会更方便但要注意微信官方对模拟器的支持并不完美部分功能可能异常。真机测试是最接近真实用户的环境。3.2 小程序反编译与静态分析拿到小程序的前端代码能让我们从“盲测”变为“半透明测试”。这里推荐一个强大的工具wxappUnpacker。你需要一台安装了Node.js的电脑。获取小程序包.wxapkg安卓手机小程序的包通常存放在/data/data/com.tencent.mm/MicroMsg/{一串哈希值}/appbrand/pkg/目录下。需要Root权限才能访问。文件命名类似__APP__.wxapkg。模拟器同样路径使用模拟器自带的文件管理器如有Root或ADB命令拉取。微信开发者工具如果你有项目的源码权限可以直接在开发者工具中上传体验版然后在详情页找到“下载”按钮获取体验版包可能需要特定权限。使用wxappUnpacker解包# 克隆项目 git clone https://github.com/xuedingmiaojun/wxappUnpacker.git cd wxappUnpacker # 安装依赖 npm install # 解包 node wuWxapkg.js 路径/到/__APP__.wxapkg解包成功后你会得到一个包含所有前端资源的文件夹.js逻辑、.wxml结构、.wxss样式、图片等。静态分析重点搜索关键词在解包后的.js文件中全局搜索以下关键词wx.request找到所有网络请求接口。url:,api,/api/定位后端API地址。token,session,Authorization查找认证相关的参数和存储逻辑。login,checkSession查找登录相关函数。md5,sha1,aes,encrypt,decrypt查找加密解密函数分析前端加密方式。setStorage,getStorage查看本地存储了哪些敏感信息。分析路由与页面查看app.json中的pages配置了解所有页面路径。有时未在导航中显示的功能页面就在这里。静态分析能帮你快速绘制出小程序的“地图”知道有哪些功能点、哪些接口、数据如何流动为后续的动态测试提供精准的目标。4. 登录绕过实战从接口到逻辑的全面突破登录绕过的方法多种多样核心思想是“欺骗系统让它认为你已经是一个合法登录的用户”。下面我按从易到难的顺序分享几种常见的绕过思路和实战案例。4.1 Web接口参数篡改与逻辑漏洞这是最直接、也最常见的一类漏洞。通过抓包修改请求参数利用服务端校验逻辑不严谨进行绕过。案例一验证码可爆破/失效时间过长在登录或敏感操作时小程序常会发送短信或邮箱验证码。抓取发送验证码和验证验证码的请求。漏洞点验证码多为4-6位数字若服务端未在验证失败后使验证码立即失效且未对单个验证码的尝试次数做限制就可能被暴力破解。测试方法使用Burp Suite的Intruder模块对验证码参数进行数字爆破0000-9999。观察返回包长度或状态码的差异找到正确的验证码。修复建议服务端应限制单次验证码的有效期如5分钟、尝试次数如5次错误后锁定或要求重新获取并采用更复杂的验证码如6位字母数字混合。案例二返回包状态码篡改某些小程序的前端登录逻辑很简单发送登录请求如果后端返回code: 200或success: true则跳转到首页并保存Token否则提示错误。漏洞点前端完全信任后端返回的状态标识未对Token的有效性做二次校验。测试方法抓取一个失败的登录请求如用错误密码。在Burp Proxy的拦截历史中找到这个请求的响应包Response将其中的code从错误值如401修改为200或者将success从false改为true。然后在Burp中右键该请求选择“Do Intercept” - “Response to this request”将修改后的响应包发送给客户端。观察小程序是否直接登录成功。实操心得这种方法成功率在早期的小程序中不低。关键在于拦截响应包。测试时可以同时清空响应体中的data字段或token字段看前端是否因缺少必要数据而报错这能帮助你理解前端逻辑的健壮性。案例三用户标识可控导致垂直越权在一些设计中登录接口或获取用户信息的接口通过参数如user_id、phone来指定要操作或返回哪个用户的数据。漏洞点服务端仅通过Token判断用户是否登录但未校验当前登录的用户是否有权操作user_id参数指定的其他用户。测试方法首先正常登录一个低权限用户A抓取一个查看“我的信息”的请求其中可能包含user_id: 123。将user_id参数修改为另一个用户B的ID如456重放请求。如果成功返回了用户B的敏感信息如手机号、地址则存在越权漏洞。修复建议服务端必须进行“所有权”校验。即从当前请求携带的Token中解析出当前登录用户的ID并与业务参数中的用户ID进行比对不一致则直接拒绝。4.2 Token机制的安全测试Token如JWT是现代Web认证的主流方式但其实现细节中藏着不少坑。1. Token解密与伪造针对弱加密或未签名测试将登录成功后返回的Token通常放在响应体的data.token字段或请求头的Authorization中复制出来到 jwt.io 进行解码。观察其Payload部分。如果Token是明文或简单Base64编码非JWT标准的三段式直接修改Payload中的user_id、role角色等信息再重新编码替换原Token看是否生效。如果是JWT检查其头部Header的alg字段。如果是HS256需要密钥才能伪造但如果是none则存在严重漏洞可以删除签名部分直接构造Token。更常见的是弱密钥问题可以尝试用常见弱密钥字典进行破解。实操心得多关注Payload中的自定义字段如isAdmin、vipLevel等这些往往是权限校验的关键。2. Token存储与泄露测试使用小程序开发者工具或反编译后的代码查看登录成功后Token被存储在哪里。通常是wx.setStorageSync(token, res.data.token)。检查小程序的其他功能点是否有接口、日志、错误信息等不经意间将Token返回给了前端。同时检查本地存储的其他数据看是否有用户敏感信息明文存放。3. Token刷新机制漏洞场景为了安全Token有有效期。小程序会通过一个刷新接口用旧的refresh_token换取新的access_token。漏洞点刷新接口可能未与旧Token绑定或者刷新后旧Token未立即失效。测试方法用户A登录获取access_token_A和refresh_token_A。用refresh_token_A调用刷新接口获取access_token_B。测试access_token_A是否还能用于访问需要认证的接口即是否已失效。更隐蔽的测试用户A用自己的refresh_token_A刷新得到access_token_B后将其共享给用户B。用户B是否能用access_token_B访问A的资源这取决于服务端对刷新机制的实现。4.3 客户端逻辑绕过信任前端不可取小程序的前端逻辑是暴露给用户的任何仅靠前端进行的校验都不可信。案例前端价格篡改在电商小程序下单流程中总价可能在提交订单前由前端计算商品单价*数量然后随订单请求发送给后端。漏洞点后端未对前端传来的价格进行复核直接以此价格创建订单和支付。测试方法抓取提交订单的请求包找到代表总价的参数如total_fee、amount将其修改为一个极小的值如0.01元然后重放请求。观察订单是否以篡改后的价格创建成功。修复建议所有涉及金额、库存、权限等核心业务逻辑的校验必须在服务端严格进行。前端传参仅作为参考服务端应根据商品ID、数量等信息从数据库重新计算价格。案例前端路由鉴权绕过小程序通过wx.navigateTo等API进行页面跳转。某些页面如管理员后台可能只在app.js或页面onLoad函数中做了简单的条件判断如检查本地存储的role字段。测试方法通过反编译找到管理员页面的路径如pages/admin/index。在微信开发者工具的Console中或通过修改反编译代码后重新运行直接执行wx.navigateTo({url: /pages/admin/index})看是否能绕过前端检查直接进入页面。即使进入后接口因无权限而报错这也暴露了一个前端路由控制不严的问题。修复建议页面级权限必须在路由守卫小程序可用全局行为拦截或在onLoad中调用服务端接口验证和服务端接口双重校验。5. Web接口漏洞挖掘超越登录的广阔战场绕过登录只是拿到了入场券真正的“宝藏”藏在各个业务接口里。这里分享一套我常用的接口测试思路。5.1 接口信息收集与梳理首先你需要一份尽可能全的接口清单。从反编译代码中提取搜索所有wx.request整理出URL、方法GET/POST、主要参数。可以用脚本自动化完成。从抓包历史中整理在Burp的Proxy - HTTP history中筛选出目标域名的所有请求导出为文件用工具进行去重和整理。目录/文件爆破针对API的常见路径如/api//v1//admin/等使用字典进行爆破寻找未在前端暴露的隐藏接口。工具如Burp Intruder、dirsearch等。整理出一张接口地图后按功能模块分类用户中心、订单管理、商品管理、支付、消息等。5.2 常见Web漏洞在小程序接口上的测试1. SQL注入虽然现在ORM框架和预编译语句很普及但SQL注入并未绝迹尤其在老旧系统或复杂查询中。测试点所有接收用户输入并参与数据库查询的参数。如搜索框、筛选条件、ID参数等。测试方法手工探测在参数后添加单引号观察返回错误如SQL语法错误或页面行为异常。工具辅助使用Burp Scanner或sqlmap。将可疑的请求发送到sqlmapsqlmap -r request.txt --batch --level 3。特别注意JSON格式的POST请求sqlmap需要指定--data参数。小程序特性小程序接口常使用JSON格式传参注入点可能在JSON的某个值里。测试时要确保修改的是JSON字符串内的值并保持JSON格式正确。2. 越权访问水平/垂直越权这是出现频率最高的漏洞之一在4.1的案例三中已有涉及这里系统化一下水平越权同权限用户A能操作/访问用户B的数据。测试方法就是替换与用户身份绑定的参数如id,orderNo,phone。垂直越权低权限用户能执行高权限操作。测试方法是找到管理员接口如/api/admin/user/list用普通用户Token去尝试访问。测试技巧在Burp中可以将已登录的低权限用户和高权限用户如果有测试账号的请求同时抓包对比同一个接口的请求参数和响应差异能快速发现权限控制点。3. 信息泄露接口可能返回了过多不必要的敏感信息。测试点用户信息查询接口、订单详情接口、错误信息接口。关注内容身份证号、手机号、邮箱、详细地址、银行卡号后四位以外的信息、内部ID、系统路径、SQL语句错误回显等。测试方法仔细查看每个接口的响应包。使用Burp的“查找”功能搜索phone、idcard、email等关键词。4. 业务逻辑漏洞这是最考验测试人员思维的一类漏洞与具体业务强相关。无限刷券/积分如果领取优惠券或积分的接口只校验了客户端状态如按钮是否可点而未在服务端做次数限制就可能被重放攻击无限刷取。条件竞争在限量抢购、秒杀场景中库存检查select和扣减update如果不是原子操作就可能出现超卖。测试时可用Burp的Turbo Intruder插件并发数十个请求。顺序执行绕过例如支付流程是创建订单 - 调用支付 - 支付成功回调更新订单状态。如果攻击者能直接调用“更新订单状态为已支付”的接口并传入一个未支付的低价订单号就可能完成“0元购”。5.3 漏洞挖掘思路的构建从点到面不要满足于单个漏洞的发现要尝试构建攻击链提升漏洞危害。入口突破从登录绕过、弱口令、验证码爆破等找到一个入口获取一个合法账号哪怕是低权限。权限提升用这个账号测试垂直越权看能否访问管理员接口或功能。同时测试Token相关漏洞尝试提升当前账号的权限如修改JWT中的角色字段。横向移动利用水平越权漏洞遍历其他用户的数据寻找高价值目标如管理员用户、VIP用户。数据泄露与篡改结合信息泄露和越权漏洞大量获取敏感数据。利用业务逻辑漏洞进行薅羊毛、篡改关键数据等操作。组合利用例如先通过一个信息泄露接口获取所有用户的ID再通过一个水平越权的订单详情接口批量抓取这些用户的订单信息含地址、手机号。在整个过程中保持好奇心多问“如果...会怎样”。对于每一个参数都思考它是否可以被用户控制、控制后会影响什么、服务端是否做了充分的校验。6. 高级技巧与疑难问题排查在实际测试中你肯定会遇到一些棘手的障碍。这里分享几个高级技巧和排查思路。6.1 如何处理加密参数很多小程序会对请求参数或响应数据进行加密增加测试难度。应对思路如下定位加密函数在反编译的JS代码中搜索encrypt、CryptoJS、AES、RSA等关键词。找到负责加密的函数。分析加密逻辑仔细阅读加密函数。是AES还是RSA密钥Key和向量IV是硬编码在代码里还是从服务端动态获取如果是硬编码恭喜你直接提取出来。模拟加密如果密钥是固定的你可以用Python或Node.js写一个脚本模拟前端的加密过程从而能构造任意的加密请求。这对于测试需要加密参数的接口如登录密码至关重要。Hook动态函数如果加密逻辑复杂或混淆严重可以尝试使用Frida框架Hook住JavaScript的加密函数直接在运行时打印出输入参数和输出结果或者修改输出结果。这需要一定的逆向工程基础。6.2 小程序抓包无数据或证书错误这是最常见的问题。现象配置好代理后手机能上网但微信或小程序里没流量经过Burp。检查代理配置确认手机Wi-Fi代理的IP和端口正确且电脑防火墙允许该端口连接。检查证书安装确保Burp的CA证书已正确安装并受信任安卓需安装到系统凭据。可以尝试用手机浏览器访问一个HTTPS网站如https://example.com看Burp是否能截获。现象小程序打开白屏或提示网络错误。证书绑定SSL Pinning这是最可能的原因。如前所述需要尝试绕过。微信自身限制微信对某些域名如其官方API可能做了特殊处理不走系统代理。这部分流量通常抓不到属于正常现象。使用旧版微信有时新版微信加强了网络库限制可以尝试安装稍旧版本的微信客户端进行测试。6.3 反编译代码严重混淆怎么办开发者可能使用了代码压缩和混淆工具变量名都变成了a,b,c难以阅读。策略不要试图完全读懂所有逻辑。聚焦于关键函数和字符串。搜索字符串常量混淆不会改变字符串常量。因此搜索/api/user/login、token、password等字符串能快速定位到关键代码位置。分析网络请求函数搜索wx.request即使它被赋值给一个变量如var d wx.request后续调用也是d(...)。找到调用d的地方就能分析请求参数是如何构造的。使用AST解析工具对于有经验的测试者可以使用JavaScript的AST抽象语法树解析库尝试对混淆代码进行一定的反混淆和格式化但这门槛较高。7. 防御视角给开发者的安全建议作为渗透测试者我们不仅要会攻也要理解如何防。从防御角度复盘能给开发同学更有效的建议。服务端校验是铁律所有来自客户端的输入都是不可信的。身份、权限、金额、库存等核心业务逻辑必须在服务端进行最终校验。完善的认证与授权使用成熟的认证方案如OAuth 2.0, JWT并正确实现。JWT应使用强密钥HS256并设置合理的过期时间。实现细粒度的权限控制RBAC对每个接口进行权限校验杜绝越权。安全的通信与存储全程使用HTTPS并合理配置HSTS、安全Cipher Suite。小程序本地存储Storage仅用于存储非敏感数据。敏感信息如需临时存储应进行可靠的加密。避免在前端代码中硬编码密钥、API地址等敏感信息。业务逻辑安全对验证码、短信、邮件等验证机制实施次数、频率、有效期限制。对资金、积分、优惠券等变动操作做好幂等性设计和并发控制如使用数据库悲观锁或分布式锁。关键业务流程如支付要有完整的日志记录和事后审计能力。安全开发流程在需求设计和代码评审阶段引入安全考量。对第三方组件和SDK进行安全评估。定期进行安全扫描和渗透测试特别是上线前和新功能发布后。渗透测试是一个不断学习和对抗的过程。小程序生态在快速发展新的框架、新的特性会带来新的攻击面。保持对技术的热情多动手实践多与他人交流才能在这个领域持续精进。最后所有测试行为务必在合法授权的前提下进行技术应用于提升安全性共同营造更安全的网络环境。

相关新闻