1. 项目概述为什么需要关注小程序安全最近几年微信小程序渗透测试的需求在安全圈里肉眼可见地多了起来。这背后其实有个很简单的逻辑小程序这东西它太“轻”了。开发快、部署快、迭代更快很多团队为了抢时间上线安全往往被放在了“后面再说”的位置。但小程序本质上是一个混合体它既有前端逻辑又严重依赖后端接口还绑定了微信这个庞大的生态。一个看似不起眼的小程序可能背后就是一个完整的业务系统一旦被攻破泄露的不仅仅是用户数据还可能涉及到支付、订单、甚至企业核心业务逻辑。我经手过不少小程序的渗透测试项目发现一个普遍现象很多开发者甚至是一些经验丰富的后端工程师对小程序的攻击面认知是模糊的。他们觉得小程序跑在微信的“沙箱”里有微信的安全机制兜底自己写的代码就安全了。这其实是个巨大的误区。微信提供的更多是运行环境的安全和基础的用户身份认证如wx.login获取code而业务逻辑安全、接口安全、数据安全这些“硬骨头”还得开发者自己来啃。所以这篇指北的目的就是帮你把小程序这个“黑盒”拆开看看里面到底有哪些门道。我会结合一个真实的、脱敏后的案例把从信息收集到漏洞利用的完整链条给你捋清楚。无论你是安全测试人员想入门小程序方向还是开发人员想自查自纠这篇文章里的思路和工具都能直接拿来用。2. 核心攻击面与信息收集策略小程序渗透测试的第一步绝对不是上来就抓包。你得先搞清楚你要测的这个东西它到底是个什么“物种”有哪些“器官”是暴露在外面的。盲目测试就像蒙着眼睛打靶效率极低。2.1 小程序的技术架构与攻击面分析要理解攻击面得先明白小程序是怎么跑起来的。简单来说微信客户端提供了一个“容器”WebView 增强版小程序代码包一个.wxapkg文件被下载到这个容器里解析执行。这个包里面包含了WXML/WXSS/JS/JSON前端页面结构、样式、逻辑和配置文件。其他资源图片、字体等。这里就引出了第一个也是最重要的一个攻击面源码泄露。虽然微信对小程序包做了加密但这个加密并非牢不可破。通过逆向微信客户端或利用一些已知的漏洞可以获取到小程序的源码包。拿到源码就等于拿到了前端的全部逻辑包括硬编码的敏感信息API密钥、阿里云OSS的AccessKey、地图服务的Key等被直接写在app.js或配置文件里屡见不鲜。接口路径和参数所有请求的后端API接口一目了然为后续的接口测试提供了完整的地图。前端逻辑漏洞比如一些本应在后端做的权限校验被错误地放在了前端通过修改前端代码或参数就能绕过。注意获取和逆向他人小程序源码用于非法目的属于违法行为。本文讨论的渗透测试场景仅限于获得明确授权的安全评估、企业自查或对已公开/自己开发的小程序进行学习研究。请务必遵守法律法规和职业道德。除了源码另一个核心攻击面是网络通信。小程序的所有数据交互都通过微信的网络通道进行这包括了与开发者服务器的通信。虽然微信会处理DNS、做链路优化但数据本身HTTP/HTTPS报文是可以被拦截和审查的前提是你能抓到包。2.2 高效的信息收集方法论信息收集不能蛮干得有章法。我通常按照“由外到内由浅入深”的顺序进行。第一步公开情报收集OSINT在动手碰技术之前先用人脑和搜索引擎。小程序本身打开小程序像个普通用户一样完整走一遍核心业务流程注册、登录、浏览商品、下单、支付、查看个人中心、管理功能等。用笔记下每一个页面的功能、可能涉及的输入点表单、搜索框、上传点。关联资产发现小程序的“关于我们”、“客服”、“用户协议”页面常常会留下公司名、官网地址。用这些信息去搜索引擎、企查查等平台寻找同公司名下的其他产品APP、网站、公众号。这些关联系统往往共享同一套后端、同一个数据库或同一个管理后台可能存在相同的漏洞。域名/IP发现在小程序使用过程中通过抓包后续会讲或查看源码收集其请求的域名。然后对这些域名进行子域名爆破subfinder,amass、端口扫描nmap绘制出更完整的网络资产地图。第二步前端源码反编译与审计这是小程序测试的“杀手锏”。你需要准备以下工具获取小程序包.wxapkg在PC版微信的缓存目录中寻找。路径通常类似于C:\Users\[用户名]\Documents\WeChat Files\Applet。里面有一串由字母和数字组成的文件夹对应不同的小程序。你需要根据修改时间来判断哪个是你刚打开过的小程序包。找到最大的.wxapkg文件。反编译工具推荐使用开源的wxappUnpacker。这是一个Node.js工具链能解密和反编译.wxapkg文件还原出项目的WXML、WXSS、JS等源代码。# 示例命令具体请参考wxappUnpacker的README node wuWxapkg.js 你的小程序包.wxapkg源码审计得到源码后重点审计以下文件app.js/app.json全局配置可能有关键密钥。config.js或类似命名的配置文件专门存放配置信息。各个页面的.js文件查看网络请求函数wx.request分析请求的URL、参数、请求头。搜索关键词key,secret,password,token,oss,cos,api.,http://(注意不安全的HTTP链接)。第三步网络流量捕获与接口分析这是动态测试的基础。小程序的抓包比普通网页稍麻烦因为它走的是微信的协议栈。在PC端抓包推荐最稳定代理工具Burp Suite 或 Fiddler。配置代理在Burp中开启监听如127.0.0.1:8080。在系统或浏览器设置中配置全局HTTP/HTTPS代理指向Burp。安装Burp证书这是关键访问http://burp下载CA证书并安装到“受信任的根证书颁发机构”存储中。否则无法解密HTTPS流量。配置微信客户端代理PC版微信默认不使用系统代理。你需要通过启动参数或第三方工具如Proxifier强制将微信的流量导向你的代理服务器。方法A启动参数关闭所有微信进程。创建微信快捷方式在“目标”栏末尾添加--proxy-server127.0.0.1:8080。用此快捷方式启动微信。方法B使用Proxifier在Proxifier中配置规则将所有WeChat.exe进程的流量指向Burp的代理地址。打开小程序此时Burp的Proxy历史中应该能看到小程序发出的所有请求。实操心得PC端抓包常遇到证书问题导致小程序白屏。除了正确安装证书有时还需要将Burp的CA证书文件.der或.pem手动导入到Windows的证书管理器并确保其位于“受信任的根证书颁发机构”下。如果还不行检查微信是否真的走了代理可以尝试在Burp中设置上游代理或使用更彻底的流量转发工具。在移动端抓包针对仅移动端可用的功能将手机和电脑置于同一局域网。在Burp中配置监听所有接口0.0.0.0:8080。在手机Wi-Fi设置中配置手动代理服务器为电脑的IP端口为8080。手机浏览器访问http://电脑IP:8080下载并安装Burp的CA证书iOS需要在“设置-通用-关于本机-证书信任设置”中完全信任该证书。在微信中打开小程序开始抓包。抓包成功后你的重点就变成了分析这些HTTP/HTTPS请求。建立一个接口清单表格记录每个请求的功能、URL、方法、参数、可能的敏感数据Token、ID以及你的测试思路。接口路径方法功能关键参数测试思路/api/user/loginPOST登录phone,code爆破验证码、重放攻击、SQL注入/api/order/listGET查询订单page,size,token越权访问修改token或用户ID参数/api/admin/user/deletePOST删除用户疑似管理功能uid,adminToken垂直越权普通用户尝试访问3. 核心漏洞挖掘与实战案例解析有了清晰的信息地图我们就可以开始“攻城”了。小程序的漏洞类型和Web应用大同小异但由于其特定的开发模式和微信环境某些漏洞的出现概率和利用方式会有所不同。3.1 越权访问最常见的高危漏洞越权分为水平越权和垂直越权在小程序里简直像“家常便饭”。根本原因在于开发者过度信任前端传递的用户标识。水平越权案例在查看“我的订单”功能时抓包看到请求为GET /api/order/list?userId12345page1。这里的userId直接由前端传入。尝试将userId修改为另一个用户的ID比如67890如果成功返回了该用户的订单信息那就是典型的水平越权。更隐蔽的情况是userId可能不在URL参数里而是在POST的JSON体中或者是一个JWT Token但后端解码后未校验Token中的用户ID与请求目标ID是否一致。垂直越权案例在反编译的源码中你发现了一个隐藏的管理员接口路径/api/admin/exportUserData在前端界面中根本没有入口。直接构造请求访问它如果后端只校验了用户是否登录token有效而没有校验用户的角色role字段是否为admin那么普通用户就能直接调用这个接口导出全站用户数据这就是垂直越权。修复建议后端必须在每一个业务接口中从可信的会话信息如服务器端存储的Session或已验证的JWT Payload中获取当前用户ID和角色并用这个信息进行权限判断绝不能信任前端传来的任何用户标识参数。3.2 业务逻辑漏洞绕过与篡改这类漏洞利用的是业务流程设计上的缺陷往往能造成非常直接的业务影响。案例支付漏洞0元购/低价购在小程序购买商品流程是前端选择商品 - 生成订单 - 调用微信支付 - 支付成功后后端回调通知发货。 漏洞可能出现在价格篡改在提交订单的请求中拦截并修改totalFee总金额或productPrice单价字段将其改为0.01或负数看后端是否直接使用这个值进行支付校验。订单状态篡改支付成功后微信会通知商家服务器。攻击者可能伪造这个支付成功的回调请求如果签名校验不严或者在前端支付成功后拦截“确认订单”的请求尝试修改其中的orderStatus字段为“已支付”从而欺骗后端发货。重放攻击针对使用优惠券或积分抵扣的场景。提交订单时使用了优惠券拦截请求并重放多次可能导致一张优惠券被重复使用。测试方法使用Burp的Repeater模块对涉及状态变更、金额计算的请求进行参数篡改和重放测试观察后端响应和实际业务结果。3.3 接口安全与注入漏洞小程序前端与后端的交互完全通过API接口因此接口的安全就是整个小程序安全的核心。SQL注入/NoSQL注入 虽然现在框架成熟直接SQL注入变少但并非绝迹。重点关注搜索、筛选、订单查询等带有参数传递给数据库的功能点。使用Burp的Intruder模块对参数进行、、1 AND 11、1 AND 12等常见Payload的模糊测试。对于使用MongoDB的尝试注入$ne、$gt等操作符例如将查询参数从{username:admin}修改为{username:{$ne:invalid}}可能导致返回非admin的第一个用户信息。SSRF服务器端请求伪造 如果小程序有“网络图片转存”、“文档预览”、“网页抓取”等功能很可能存在SSRF。抓包寻找参数值像URL的请求尝试将其替换为内网地址http://127.0.0.1:8080、http://192.168.1.1或云元数据地址http://169.254.169.254/看服务器是否代为请求并返回了内容。文件上传漏洞 小程序内如果有头像上传、证件上传、反馈上传图片等功能就是测试点。尝试上传非图片文件如.php,.jsp看是否被后端检测。图片马将一句话木马写入图片的EXIF信息或末尾看是否被后端二次渲染处理。修改Content-Type为image/jpeg看是否仅靠前端或简单后缀名判断。尝试路径穿越../../../test.php看上传路径是否可控。3.4 附一个综合渗透测试案例实录去年我评估过一个电商类小程序这里把脱敏后的过程和思路分享出来。第一阶段信息收集使用小程序发现其有商品浏览、加入购物车、下单、支付、查看物流、评价、会员中心等功能。在“关于我们”页面找到公司名称“XX科技”通过搜索引擎找到其官网www.xx-tech.com。对官网域名进行子域名扫描发现admin.xx-tech.com和api.xx-tech.com。在PC端成功抓包小程序流量确认其API域名为api.xx-tech.com。第二阶段源码反编译与初步分析从微信缓存中提取到.wxapkg包并反编译成功。审计config.js发现硬编码了一个阿里云OSS的AccessKeyId和AccessKeySecret已打码但未发现Endpoint。// config.js 片段 const ossConfig { accessKeyId: LTAI5t**********, accessKeySecret: KZoH4VW**********, bucket: xx-tech-prod };通过搜索bucket和oss关键词在另一个工具类文件中找到了OSS的Endpointoss-cn-hangzhou.aliyuncs.com。立即验证使用OSS命令行工具或SDK尝试用泄露的AK/SK列出Bucket内容。成功发现Bucket是公共读的里面存储了所有用户上传的头像、商品图片甚至还有/backup/目录里面是近一个月的数据库SQL备份文件。这是一个高危信息泄露漏洞。第三阶段越权漏洞挖掘查看“我的订单”接口GET /api/v1/orders?userId12345。修改userId为其他值返回“权限不足”。看来有基础校验。但查看“订单详情”接口时GET /api/v1/order/detail?orderId10086。这个接口只传了orderId。尝试遍历orderId10087, 10088...成功获取到其他用户的订单详情包括收货地址、手机号。水平越权漏洞成立。在源码中发现一个前端未使用的接口POST /api/v1/admin/coupon/generate生成优惠券。直接使用普通用户Token调用返回“需要管理员权限”。但将请求方法从POST改为GET再发送竟然返回了成功并生成了一张满100减50的优惠券这是一个基于HTTP方法的不安全权限校验漏洞。第四阶段业务逻辑漏洞-优惠券无限领取在领取优惠券的活动中流程是前端点击领取 - 请求POST /api/v1/coupon/receive- 返回成功。使用Burp拦截这个请求并发送到Intruder模块。设置空Payload选择“无限次”重放模式。开始攻击观察响应。发现每次请求都返回成功且优惠券ID不同。在小程序前端的“我的优惠券”中确认成功领取了数十张相同的优惠券。这是一个严重的业务逻辑漏洞缺少防重放和领取频率限制。最终报告本次测试共发现1个高危漏洞OSS密钥泄露导致数据库备份泄露、2个中危漏洞订单详情越权、管理接口方法绕过和1个低危漏洞优惠券无限领取。向客户提供了详细的漏洞证明PoC和修复建议。4. 工具链与自动化渗透测试思路手工测试固然重要但效率有限。对于大型或复杂的小程序需要借助自动化工具来提高覆盖面。4.1 专用工具与脚本wxappUnpacker反编译核心工具必须掌握。Burp Suite主力测试平台。除了Proxy/Repeater/Intruder其Scanner模块可以对已抓取的流量进行自动化的主动漏洞扫描注意避开生产环境。Extensions插件生态强大可以安装AuthMatrix用于越权测试JSON Web Tokens用于解码和篡改JWT。Fiddler Everywhere抓包工具的另一个优秀选择界面更友好尤其适合HTTP/HTTPS流量分析和API调试。自定义Python脚本用于处理重复性工作。例如写一个脚本自动从反编译的JS文件中提取所有API端点并生成一个URL列表供Burp的Target - Site map导入。4.2 半自动化测试流程我推荐一个结合手工和自动化的流程手动探索完整使用小程序用Burp记录所有流量。这一步的目的是理解业务发现主要功能点和接口。源码审计反编译小程序提取硬编码密钥、接口地图、隐藏参数。将发现的API补充到Burp的Target Scope中。自动化扫描在Burp中设置好Scope目标范围使用Active Scan对范围内的所有请求进行漏洞扫描。重点关注SQL注入、XSS、SSRF等通用漏洞。手工深度测试自动化扫描主要找“明面”的漏洞。对于业务逻辑漏洞越权、支付、状态机问题、复杂的认证授权问题必须手工测试。利用之前整理的接口清单逐个进行边界情况测试、参数篡改、顺序扰乱等。漏洞验证与利用对发现的疑似漏洞点使用Repeater进行稳定复现并尝试构造更有破坏性的Payload评估实际风险等级。4.3 针对小程序特点的测试清单你可以根据下面这个清单确保你的测试覆盖了小程序的主要风险点测试类别具体测试项检查方法/工具信息泄露源码硬编码敏感信息反编译后全局搜索key,secret,password,token,oss,cos接口敏感信息泄露抓包检查响应中是否包含服务器路径、数据库错误信息、堆栈跟踪等认证与授权水平越权修改请求中的用户ID、订单ID等参数尝试访问他人数据垂直越权寻找隐藏的管理接口使用普通用户Token尝试访问JWT令牌安全检查JWT是否在本地存储、是否可解密、alg是否为none、是否校验签名业务逻辑支付漏洞篡改订单金额、重放支付请求、伪造支付回调优惠券/积分滥用重放领取请求、并发请求、修改领取数量参数竞争条件对库存扣减、余额变更等操作进行并发测试输入验证SQL/NoSQL注入对查询参数使用SQLMap或手动注入Payload测试XSS虽难利用但需检查在可回显的输入点尝试注入scriptalert(1)/script文件上传尝试上传恶意文件、绕过类型检查、路径穿越SSRF在图片处理、URL预览等功能点测试内网地址访问配置安全HTTPS强制检查是否有HTTP请求或HTTPS配置不当弱密码套件错误处理触发异常如非法参数看是否返回详细的调试信息5. 疑难排查与防御加固建议测试过程中总会遇到各种问题而作为开发或安全人员知道怎么防同样重要。5.1 常见问题排查表问题现象可能原因解决方案小程序抓包无流量1. 微信未走代理2. 证书未正确安装/信任3. 代理设置错误1. 用Proxifier等工具强制微信流量走代理2. 将Burp CA证书导入系统“受信任的根证书颁发机构”3. 检查Burp监听地址和端口确保手机/电脑IP正确HTTPS请求显示Tunnel to这是HTTP CONNECT隧道正常现象在Burp Proxy的SSL选项卡中确保勾选了“Generate a CA-signed certificate...”反编译工具报错小程序包版本过新加密方式有变尝试更新wxappUnpacker到最新版本或寻找其他分支版本的工具越权测试时修改ID后返回“系统错误”后端可能进行了强类型校验或存在其他校验尝试将数字ID改为字符串、负数、极大数、或其他用户的ID确保格式一致观察错误信息差异业务逻辑漏洞难以复现可能存在状态依赖或时间窗口理清完整业务流程使用Burp的Sequencer或手工控制多个标签页/工具进行并发测试5.2 给开发者的安全加固指南如果你正在开发小程序或者测试后需要提供修复建议以下是一些核心的安全原则最小化前端信任前端的一切都是不可信的。用户ID、角色、权限、商品价格、库存数量等关键业务数据必须从后端可信源数据库、Session中获取或由后端经过严格校验后返回给前端展示。绝不允许前端直接传递这些参数来驱动核心业务逻辑。接口权限校验标准化每一个API接口必须在入口处进行统一的身份认证和权限校验。建议使用中间件Middleware来实现。校验逻辑应包括Token是否有效、Token对应的用户是否有权访问当前接口RBAC模型、当前用户是否有权操作目标数据数据级权限。敏感信息绝不硬编码AK/SK、数据库密码、第三方服务密钥等必须通过小程序云开发的环境变量、或自己的配置中心来管理。前端代码中不应出现任何形式的明文密钥。业务逻辑防重放与防篡改对关键业务操作支付、领券、扣库存使用防重放令牌Nonce、签名机制对请求参数生成签名后端校验或幂等性设计。确保核心业务状态如订单状态的变更只能通过后端明确的状态机进行防止前端随意修改。输入输出严格处理对所有用户输入进行严格的过滤和校验白名单原则。使用参数化查询防止SQL注入。对输出到页面的内容进行HTML编码防止XSS。对上传文件进行严格的类型、内容、后缀名检查并重命名存储。启用HTTPS并正确配置确保服务器和所有子域名都强制使用HTTPS并配置安全的加密套件禁用SSLv3, TLS 1.0。合理的错误处理生产环境应关闭调试模式自定义统一的错误页面避免将数据库错误、堆栈信息等敏感内容返回给前端。安全依赖与更新定期更新后端框架、依赖库修复已知安全漏洞。小程序的安全是一个持续的过程需要开发、测试、运维共同关注。渗透测试的目的不是找茬而是像一次全面的“健康体检”提前发现隐患避免在真正的攻击面前造成损失。希望这份指北能为你打开小程序安全测试的大门在实际操作中保持好奇心多思考“如果…会怎样”你会发现更多有趣的安全问题。