找回密码
 立即注册
首页 业界区 安全 H5渗透实战:从负数金额漏洞到签名绕过 ...

H5渗透实战:从负数金额漏洞到签名绕过

尝琨 昨天 05:20
前言

免责声明:本文仅供安全学习研究,所有测试均在授权环境或自建靶场中进行。严禁用于非法用途,否则后果自负。
某水卡系统漏洞实战

此次实战是针对混合开发APP的渗透测试,通过抓包提取APP内嵌的H5页面,对其API接口进行安全测试。
常见混合开发框架:
Cordova


  • 技术栈:WebView + H5


  • 代表应用:早期银行APP、政务APP


  • 特点:最早的混合开发方案,插件生态丰富
Ionic


  • 技术栈:Angular/React/Vue + WebView


  • 代表应用:企业OA、CRM系统


  • 特点:UI组件丰富,适合企业应用
原生WebView


  • 技术栈:原生壳 + H5页面


  • 代表应用:各种物业/水电缴费APP


  • 特点:开发成本低,更新灵活,最常见
为什么选择混合开发APP?因为原生APP需要逆向、Hook等技术门槛较高,而混合APP内嵌H5页面,只需抓包分析即可发现漏洞,是APP渗透的最佳入门目标。这次实战目标就是从app提取的h5页面进行挖掘(更偏向Web渗透)
混合APP容易测试的原因点如下:

  • 业务逻辑在H5中,可直接抓包
  • 前端JS代码可查看,签名算法可逆向
  • 提取H5链接后可在浏览器中测试
如何判断APP类型
最简单的方法就是看请求包
举个栗子(比如接口里面带有h5关键词的):
GET https://h5.***/app/index.html
亦或者解包apk去搜索WebView相关代码or查看assets目录是否有H5文件
话不多说,直接开始实战!本次实战基于真实场景搭建的模拟靶场进行演示。
正文

由于充值后会立即重定向,浏览器F12抓不到完整请求,这里用Reqable抓包。
[img=450,975.2760000000001]https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/ce732621-eae4-41ef-9d3d-fc13aa9b9691.png[/img]

直接将amount改为 -50,充值成功!这是典型的负数金额漏洞——后端未校验金额正负,导致 balance + (-50) 使余额反减。既然充值接口没有校验金额正负,那么转账接口大概率也存在同样的问题
[img=720,177.42857142857142]https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/88420cc6-a308-4e6f-8879-0136484e8dca.png[/img]

转账功能在前端是进行了校验的,跟充值一样,转账后会立即重定向,浏览器F12抓不到完整请求,继续使用Reqable抓包
[img=450,802.542372881356]https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/9d24f68f-8cbb-45df-955b-b79a1fd5ca43.png[/img]

转账也是一样,存在相同的逻辑漏洞
[img=720,212.78571428571428]https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/2a86409b-074e-403b-a034-c761e74f0b0e.png[/img]

虽然页面展示的我转账至A-102是-50,但是我的余额没扣反加,余额从349.48变成了399.48。原理很简单:
我的余额 = 100 - (-50) = 150 ← 不减反加
对方余额 = 200 + (-50) = 150 ← 被扣钱了
[img=450,662.9032258064516]https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/98dc3b6c-fb9b-4fde-aa5d-c7c103c43cf8.png[/img]

emmm,思考ing...既然是水电卡系统,那么充值也只是资金入口,真正的业务核心在缴费环节。继续沿着业务流程测试电费缴纳模块,看看是否存在类似的漏洞。
【----帮助网安学习,以下所有学习资料免费领!加vx:YJ-2021-1,备注 “博客园” 获取!】
 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)
进入到缴费页面,发现只有两个接口
[img=720,465.42857142857144]https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/abc436e7-c650-4172-a1dc-524125d8d319.png[/img]

还是跟之前一样测试是否能修改成负值进行充电勒
1.png

充电的接口与充值、转账接口不同,电费缴纳接口增加了安全防护——请求中包含 sign 签名参数:直接修改 amount 为 -100 后发送,返回"签名验证失败"。这是一种常见的防篡改机制,后端会根据参数重新计算签名并与请求中的 sign 比对。要绕过签名校验,需要逆向分析签名算法。由于这是混合APP,签名逻辑在前端JS中实现,我们可以直接分析。
[img=720,145.28571428571428]https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/df7446fd-65cb-4549-bef1-e26beaa92a60.png[/img]

直接全局搜索sign参数,触发充值事件,断点断住了,明文就是amount加上meter_no和时间戳放到generateSign函数进行了加密。
[img=720,402.7586206896552]https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/0a7cdcb7-d4fc-479c-96bc-c42b6fb8a82c.png[/img]

进入到generateSign函数进行分析
[img=720,118.47133757961784]https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/507162a9-aa39-4aad-a3a7-22bd9e17d156.png[/img]
  1. function generateSign(params) {
  2.    // 1. 获取所有参数名,过滤掉sign本身,然后按字母顺序排序
  3.    // → ["amount", "meter_no", "timestamp"]
  4.    const sortedKeys = Object.keys(params).filter(k => k !== 'sign').sort();
  5.    // 2. 将参数按 key=value 格式拼接,用 & 连接
  6.    let signStr = sortedKeys.map(k => `${k}=${params[k]}`).join('&');
  7.    // 3. 在末尾追加密钥(这就是签名的关键!密钥硬编码在前端)
  8.    signStr += '&key=WaterCard@2024#SecretKey';
  9.    // 4. 对拼接后的字符串进行MD5哈希,得到签名
  10.    return md5(signStr);
  11. }
复制代码
签名算法总结:
sign = MD5(参数按字母排序拼接 + &key=密钥)
加密算法分析完之后,进行py模拟发包
[img=720,599.1428571428571]https://www.yijinglab.com/guide-img/d9634e2f-3b66-42e7-8279-c0877cdd70e5/4b83c495-6cd1-43c8-a5ac-4ce0d7496afe.png[/img]

跟之前充值,转账的后端逻辑一样的,但是这次危害更大,因为不仅吸了钱还加了电费
负数度数 → 负数费用 → 扣负数 = 加钱
电表读数直接加负数 → 读数倒退
2.png

结尾:

本文仅供安全学习研究使用,请勿用于非法用途。
更多网安技能的在线实操练习,请点击这里>>
  

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册