小程序渗透

编写人:Rannnn

环境&软件:Windows11渗透版,微信,微信开发者工具,UnpackMiniApp,wxappUnpacker,Node.js

抓包

工具:burpsuite,Charles

配置:

Charles:

导入证书

依次选择

Help->SSL Proxying->Install Charles Root Certificate

image-20250213142141503

在弹出的窗口选择安装证书

image-20250213142206674

存储位置选择本地计算机

image-20250213142226862

将证书存放入受信任的根证书颁发机构

image-20250213142250382

导入成功后进行下一步

代理端口

点击proxy

然后点击proxy setting

image-20250213143731805

HTTP Proxy内修改Port为8888

SOCKS Proxy内修改Port为8889

最下方Ports内填写80,443,8080

image-20250213143758781

规则配置

点击Proxy,选择SSL Proxying Settings

image-20250213143830613

image-20250213143938289

点击左侧框下的add

两个都设置为*号

image-20250213144105428

点击ok

点击如下选项

image-20250213150241466

按照如下设置(Web Proxy和Secure Web Proxy都要设置成127.0.0.1:8091)

image-20250213150127829

点击ok,配置完成

burpsuite:

点击代理->代理设置

在代理监听器下点击添加

将绑定端口修改为8091,完成即可

image-20250213145310676

测试

打开bp

打开小程序(这里以畅行温州作为举例)

开启拦截

image-20250213150508841

点击小程序任意按钮

抓取到信息,发送到重发器

image-20250213150559183

抓包成功

常见漏洞

本版块的漏洞案例和图片均取自于:

阿里云开发者社区、先知社区、CSDN、博客园、雷神众测

支付业务逻辑漏洞

解析:应用程序未校验订单数据的取值范围,导致可以修改订单数量、订单金额,通过修改订单金额可以达到0元购的效果

案例:某酒店订房小程序在生成订单支付二维码时,客户端可以直接修改交易金额导致实际支付金额与商品原价不符,造成商家严重亏损

建议:1、服务器端在生成交易订单时,商品的价格从数据库中取出,禁止使用客户端发送的商品价格。2、服务器端对客户端提交的交易数据(如商品ID、商品数量、商品价格等)的取值范围进行校验,将商品ID和商品价格与数据库中的数据对比校验,商品数量为大于零的整型数。3、服务器端在生成支付订单时,对支付订单中影响支付金额的所有因素(比如商品ID、商品数量、商品价格、订单编号等)进行签名,对客户端提交的支付订单进行校验

前端绕过登录后台漏洞

解析:登录页面输入账号密码后用户可以通过拦截并修改响应包实现绕过登录

案例:某公司小程序使用账号密码登录,随意输入一个账号密码并抓包,拦截响应包,修改json数据,将”code”修改为0,两个false修改为true,修改后放行,成功登录,并可以直接进入工作台,但是由于未授权访问,只能拿到数据,没有办法进一步操作。

建议:1、后台直接比对数据库判断用户账号密码是否正确,删除前端控制登录状态的code字段。2、所有API接口启用HTTPS,防止中间人攻击篡改数据包。3、基于角色分配最小权限,敏感操作需二次鉴权。4、记录登录IP、设备指纹,对频繁失败尝试触发风控

水平越权漏洞

解析:越权访问,这类漏洞是指应用在检查授权(Authorization)时存在纰漏,使得攻击者在获得低权限用户帐后后,可以利用一些方式绕过权限检查,访问或者操作到原本无权访问的高权限功能。

案例:

查看某房产小程序个人房产信息,在点击查看详情时拦截数据包,通过修改get传参可以遍历他人房产,并且可以获取他人id、手机号、身份证号码、房屋信息等数据

建议:验证用户权限,在每个敏感操作之前,对用户进行严格的权限验证。确保用户拥有访问特定资源或数据的权限,且只能访问其授权的内容。

任意用户注册漏洞

解析:小程序为内部员工专用,注册功能未对外开发,攻击者可以根据此漏洞越过系统拦截直接注册任意用户并访问内部员工功能。暂不排除是否会对已存在的用户的影像,如覆盖账号导致无法登录等

案例:某公众号员工登录页面,此页面无注册功能,且登录逻辑为员工姓名+工号校验,输入任意姓名工号发现登录不进去,将登录接口LoginSubmit修改为注册接口registerSubmit(猜的),发现注册成功并能登录进入系统。

建议:销毁此接口,或对员工注册进行审核。

SessionKey三要素泄露

解析:session_key指的是会话密钥,可以简单理解为微信开放数据AES加密的密钥,它是微信服务器给开发者服务器颁发的身份凭证,这个数据正常来说是不能通过任何方式泄露出去的。小程序若存在session_key泄露漏洞的情况,则代表微信侧传递的用户数据有被泄露、篡改等风险,开发者应及时发现该漏洞并快速修复相应问题。

案例:某小程序因为session_key泄露,导致该小程序可以使用任意手机号进行登录,造成了极大的安全风险。

img-shentou4-1

通过获取该session_key,我们可以结合iv解密出密文。

简单整个香香的小插件(不是)

image-20250214151727328

把三个数据放到对应的位置上,点击解密,明文的敏感信息就显示出来了

跨小程序请求伪造CMRF

解析:利用小程序对用户微信身份的信任在获取页面传入的参数之后结合用户已经登录的身份信息(储存在本地的数据,或者用户的openid)向小程序后端发送对应的数据包,从而使用户在无意间(打开对应分享链接时)完成一次请求操作。

案例:某商城小程序中,用户来到“我的”页面时程序会自动登录向后端请求 openID等数据并判断当前微信用户是否已经进行了与商场网页账户的绑定操作,若无则前往绑定页面,若已经绑定则将 openID写入缓存之中。接着我们点击修改密码按钮,小程序会弹出如下让我们修改密码的弹窗

image-20200425173955039

对应功能的JS代码如下:

passFn() {    // 修改密码弹窗
this.setData({ close: true });
},
closeFn() { //关闭修改密码的弹层
this.setData({ close: false });
},
passinput1Fn(e) {
var value = e.detail.value;
this.setData({
pass1: value
})
},
passinput2Fn(e) {
var value = e.detail.value;
this.setData({
pass2: value
})
},
changeFn(e) { //前往修改密码页面
if (this.data.pass1 != this.data.pass2) {
wx.showModal({
title: "提示",
content: "两次密码不一致!",
showCancel: !1,
});
} else {
wx.navigateTo({
url: "/pages/my/changepwd?newpwd=" + this.data.pass1,
});
}
},

可以看到上述JS代码中changeFn会判断用户两次输入的密码是否一致,若一致则将用户输入的密码作为参数传入小程序的“/pages/my/changepwd”页面中。接着我们来到“/pages/my/changepwd”观察其核心功能函数如下:

onLoad: function (options) {
var newpwd = options.newpwd; //获取传入的密码
let that = this;
wx.getStorage({ //从Storage中获取绑定用户的openid
key: 'openid',
success(res) {
wx.request({
url: 'http://demo.c-est.cool/ThorSRC/changepwd.php?pwd=' + newpwd + '&openid=' + res.data,
header: {
'content-type': 'application/json'
},
success: function (res) {
if (res.data.code == '000') { //代表绑定成功
that.setData({
chgstu: true,
changeinfo: res.data
})
} else {
that.setData({
chgstu: false
})
}
}
})
}
})
},

小程序会将传入的密码和保存在本地Storage中的与对应商城用户绑定的微信用户openid值一起传回给后端服务器,服务器后端通过查询openid对应的用户信息来修改对应用户的密码。那么我们只需要构造一个微信小程序的页面指向/pages/my/changepwd.html?newpwd=XXX自己预设密码,并让其他已绑定商城账户的人点击我们构造好的微信小程序消息,那么他在此商城的密码就会被自动更改为我们预设的值。例如下图我们将<pagepath>值设置为:/pages/my/changepwd.html?newpwd=Abc@123456,预设密码即为Abc@123456

image-20200425195246501

接着我们将构造好的消息转发给被害者,诱导其点击小程序消息访问对应的页面,一但用户点击了对应的消息页面打开微信小程序,他的商城账户密码即被修改为了Abc@123456

至此我们完成了一次典型且易被利用的CMRF攻击,虽然并不是所有的CMRF攻击都能造成非常严重的危害,但这类漏洞并非无稽之谈,目前在很多微信或者其他小程序中还隐藏着许多类似的脆弱点。

小程序反编译

本部分参考:https://blog.csdn.net/Xm3333691/article/details/120312160

工具:node.js、反编译的脚本、小程序包解密工具

链接:https://wwn.lanzouj.com/i7opW0bnop4d 密码:71g7

第一步

先把反编译脚本文件夹放在根目录下,推荐放C盘,一是便于操作,二是避免了路径名存在中文字符

image-20250214163743624

第二步

找到自己想要编译的小程序包,位置跟微信聊天文件的位置是同一个大文件夹下,我的目录是D:\WeChatCaches\WeChat Files\Applet

image-20250214163935030

里面有很多以wx开头的数字与字母组合的文件夹,点进去还有一个以数字命名的文件夹,再点进去,会发现有一个__APP__.wxapkg的文件,有的还有其他的文件

image-20250214164537587

第三步

打开小程序解密程序(可能会弹出.NET Framework弹窗,点击安装即可)

打开后的效果

image-20250214164747647

安装完打开解密程序,点击唯一的一个按钮“选择加密小程序包”,将想反编译的程序包的所在目录粘过去,点击打开,进行解密

第四步

解密完成后,解密好的包会在解密程序上面或者下面的wxpack的目录里面,进去发现会有一个以wx开头的数字与字母组合的文件,他就是我们要反编译的包。

image-20250214165152553

第五步

为了方便操作,将解密好的包放在反编译脚本文件夹下

image-20250214165320604

第六步

安装node环境,为避免麻烦,所有步骤都默认进行

image-20250214165517696

打开cmd,为了避免出现问题,建议用管理员身份打开。
先用node -v看看能不能查看node版本,确保能使用node环境。

image-20250214165602224

使用cd 命令,将位置改成脚本所在位置。

这里有个问题,如果当时放的是D盘,你会发现你使用cd d:就显示个D:\就完了,下面还是你的C盘用户路径

输入cd /d d:即可

第七步

安装依赖,就在反编译脚本目录下安装

npm install esprima
npm install css-tree
npm install js-beautify
npm install uglify-es
npm install vm2
npm install cssbeautify

如果卡进度条不动的情况就ctrl+c然后重新执行一遍

第八步

安装完成之后,执行反编译命令

node wuWxapkg.js 你粘过来的文件的文件名.wxapkg

image-20250217081616925

发现报错,不要紧,注意Error这句话的结尾单词escodegen,这就是缺少的模块,npm安装就完了

装完运行还是报错,哪个缺装哪个,直到开始跑代码就说明成功了

PS:如果发现缺少一个名为cheerio的模块,不要直接用npm下载!!!打开下面的链接,复制网页右边的下载代码粘贴到命令提示符下就可以了。不要不听劝啊,看到Error: Cannot find module 'node:stream'你就老实了

链接:cheerio - npm

image-20250217090756393

在目录中会生成一个文件夹,里面就是反编译后的文件

image-20250217090845165

打开微信开发者工具,导入刚刚反编译的wx开头的文件夹,就可以看到小程序的真实代码了

image-20250217091838852