app&小程序&web安全—sign签名绕过
零、前言
在web界面登陆时,小程序和app传输数据时经常会碰到签名,会对请求的参数进行签名,如果自己修改了数据包就会校验失败非常麻烦。
本文编写的契机就是因为碰到了一个JeecgBoot的小程序, 想请求信息泄露的url但是显示“Sign签名校验失败”,让我非常无语,到手的漏洞飞了。所以打算研究一下签名,本文讲的是md5签名,以后再研究研究aes加密传输数据啥的。
一、环境准备
本文测试环境为JeecgBoot,代码链接:jeecgboot/Github
环境配置链接:IDEA启动项目 - JeecgBoot 文档中心
配置好依赖和数据库后启动后端:org.jeecg.JeecgSystemApplication
启动Vue3前端,点击dev,Jeecg启动!
二、阅读代码(后端)
关于签名函数的位置我不太会定位,是通过网络搜索找到的。
最终定位到SignAuthConfiguration
、SignAuthInterceptor
和SignUtil
等类。
1. SignAuthConfiguration
SignAuthConfiguration关键代码
boolean isSigned = SignUtil.verifySign(allParams,headerSign);
if (isSigned) {
log.debug("Sign 签名通过!Header Sign : {}",headerSign);
return true;
}
调用了verifySign进行校验签名,如果isSigned为true,签名通过。
2. SignUtil.verifySign
SignUtil.verifySign代码
public static boolean verifySign(SortedMap<String, String> params,String headerSign) {
if (params == null || StringUtils.isEmpty(headerSign)) {
return false;
}
// 把参数加密
String paramsSign = getParamsSign(params);
log.info("Param Sign : {}", paramsSign);
return !StringUtils.isEmpty(paramsSign) && headerSign.equals(paramsSign);
}
经过调试得出params的内容是get和post请求参数的总和:
调用了getParamsSign来进行校验签名。
3. SignUtil.getParamsSign
SignUtil.getParamsSign关键代码
String signatureSecret = jeecgBaseConfig.getSignatureSecret();
return DigestUtils.md5DigestAsHex((paramsJsonStr + signatureSecret).getBytes("UTF-8")).toUpperCase();
对http请求参数paramsJsonStr加上signatureSecret的值,进行md5运算,最后对md5值大写处理。
signatureSecret的值在org/jeecg/config/JeecgBaseConfig.java
里:dd05f1c54d63749eda95f9fa6d49v442a
4. 最后
getParamsSign返回签名计算后的数据,verifySign对后端计算的sign和http请求头的X-Sign进行比较,如果相同则sngn校验通过,返回true。
实践一下
获取验证码处抓包,清除掉多余请求头。
POST /jeecgboot/sys/sms HTTP/1.1
Host: 192.168.171.1:3100
X-Sign: 1478A8A6639F1495342C603DC05BAEB7
X-TIMESTAMP: 1732282707313
Content-Type: application/json;charset=UTF-8
{"mobile":"13066668888","smsmode":"1"}
处理后,可以看到和X-Sign值一样。
所以JeecgBoot的签名逻辑就是把请求内容加上密钥,然后再进行md5计算,最后大写字符,就得到了X-Sign字符。
三、阅读代码(前端)
打开开发者工具,全局搜索secret,可以看到签名密钥
const signatureSecret = 'dd05f1c54d63749eda95f9fa6d49v442a';
文件位置:/src/utils/encryption/signMd5Utils.js
在signMd5Utils.js的第43行可以看到签名逻辑
return md5(JSON.stringify(requestBody) + signatureSecret).toUpperCase();
调试后可以看出签名逻辑和后端一样,都是将请求内容加上密钥,然后md5再大写处理。
四、关于参数顺序的问题
上面只测试了POST请求体的参数,如果通过url传参该怎么加密呢?
这里通过后端调试可以看出,参数是按照(数字,大写字母,小写字母)的顺序来排序的。
URL的参数为:1papam=0&Zparam=1&aparam=2&nparam=3
请求体为:{"mobile":"13066668888","smsmode":"1"}
最终整合成json,得到的数据为:
{"1papam":"0","Zparam":"1","aparam":"2","mobile":"13066668888","nparam":"3","smsmode":"1"}
请求
后端log:log.info("Param paramsJsonStr : {}", paramsJsonStr)
五、Yak
随便写了点yakit的热加载代码,现在才知道yaklang功能很强大,但还是不太熟练,所以实战用处不大。
func sign(mobile) {
return codec.Md5(f`{"mobile":"${mobile}","smsmode":"1"}dd05f1c54d63749eda95f9fa6d49v442a`).Upper()
}
func sign(param) {
return codec.Md5(f`${param}dd05f1c54d63749eda95f9fa6d49v442a`).Upper()
}
POST /jeecgboot/sys/sms HTTP/1.1
Host: 192.168.171.1:3100
X-Sign: {{yak(sign|{"mobile":"13066668888","smsmode":"1"})}}
X-TIMESTAMP: {{timestamp(ms)}}
Content-Type: application/json;charset=UTF-8
{"mobile":"13066668888","smsmode":"1"}
六、参考文章
jeecg 请求url签名_signauthconfiguration
Fuzz Tag Playbook (yaklang.io)
app&小程序&web安全—sign签名绕过的更多相关文章
- 一套代码小程序&Web&Native运行的探索02
接上文:一套代码小程序&Web&Native运行的探索01,本文都是一些探索性为目的的研究学习,在最终版输出前,内中的内容可能会有点乱 参考: https://github.com/f ...
- 一套代码小程序&Web&Native运行的探索06——组件系统
接上文:一套代码小程序&Web&Native运行的探索05——snabbdom 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tre ...
- 一套代码小程序&Web&Native运行的探索04——数据更新
接上文:一套代码小程序&Web&Native运行的探索03 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/master/m ...
- 一套代码小程序&Web&Native运行的探索03——处理模板及属性
接上文:一套代码小程序&Web&Native运行的探索02 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/master/m ...
- Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解
Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解 说明:Java生鲜电商平台-APP/小程序接口传输常见的加密算法及详解,加密算法,是现在每个软件项目里必须用到的内容. 广泛应用在包括 ...
- 小程序 web 端实时运行工具
微信小程序 web 端实时运行工具 https://chemzqm.github.io/wept/
- 一套代码小程序&Web&Native运行的探索05——snabbdom
接上文:一套代码小程序&Web&Native运行的探索04——数据更新 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tree/ma ...
- Java生鲜电商平台-电商中"再来一单"功能架构与详细设计(APP/小程序)
Java生鲜电商平台-电商中"再来一单"功能架构与详细设计(APP/小程序) 说明:在实际的业务场景中(无论是TO B还是TO C)不管是休闲食品.餐饮.水果.日用百货.母婴等高频 ...
- Java生鲜电商平台-API接口设计之token、timestamp、sign 具体架构与实现(APP/小程序,传输安全)
Java生鲜电商平台-API接口设计之token.timestamp.sign 具体设计与实现 说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃 ...
- API接口设计之token、timestamp、sign 具体架构与实现(APP/小程序,传输安全)
Java生鲜电商平台-API接口设计之token.timestamp.sign 具体设计与实现 说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃 ...
随机推荐
- LaTeX 常见希腊字母
字母名称 大写 命令 小写 命令 alpha A A α \alpha beta B B β \beta gamma Γ \Gamma γ \gamma delta Δ \Delta δ \delta ...
- docker高级篇2-分布式存储之三种算法
面试题: 1~2亿条数据需要缓存,请问如何设计这个缓存案例? 答:单机单台100%是不可能的.肯定是分布式缓存的.那么用Redis如何落地? 一般有三种方案: 哈希取余分区:一致性哈希算法分区:哈希槽 ...
- 【YashanDB知识库】swap空间使用超大报错
问题描述 问题单 使用GROUP_CONCAT函数时,数据库swap表空间上涨厉害 测试用例 drop table tmp1; create table tmp1(c1 int,c2 double,c ...
- 计算机网络之TCP/IP协议简介
TCP/IP协议 简介 首先TCP/IP协议不只是表示TCP协议和IP协议两种协议,而是一个协议簇.协议簇是什么并不难理解,就是字面意思,一个由多个协议组合而成的集合体,其中最有代表性的就是TCP和I ...
- 如何基于Java解析国密数字证书
一.说明 随着信息安全的重要性日益凸显,数字证书在各种安全通信场景中扮演着至关重要的角色.国密算法,作为我国自主研发的加密算法标准,其应用也愈发广泛.然而,在Java环境中解析使用国密算法的数字证书时 ...
- JavaScript习题之简答题
1.分别描述HTML.CSS.JS在页面组成中的作用.HTML是超文本标记语言,是用来描述网页的语言,定义网页的结构,内容可以包含文字.图片.视频等. CSS是层叠样式表,定义如何显示HTML元素,比 ...
- 利用AutoGpt将任何模型支持o1模型的推理实现
利用AutoGpt将任何模型支持o1模型的推理实现 相信大家都对于OpenAI最新出的o1模型都非常关注,它已经能通过推理让回复的效果更加理想, 但是目前o1的限制太大,而且使用o1至少也是需要购买O ...
- AD域下,环境下办公机系统时间不准确
事件起因: 某部门一同事电脑时间和AD域控时间相差3分钟,虽然说时间相差5分钟内问题不大,但是本着有问题就解决的原则,还是花了点时间去查资料解决. (小小吐槽一下,在我看来域控机是掌管下面所有的办公机 ...
- Spirng Aop 实现自定义注解及实现
需求:日志记录 需要记录当前用户访问的每个接口对应的前端页面功能信息 声明一个注解 @Documented @Retention(RetentionPolicy.RUNTIME) @Target({E ...
- 图片 电力电网行业IT运维方案
智能电网背景下,电力.电网企业信息化逐渐渗透到其业务链的各个环节,云计算.物联网.移动互联网等新技术的应用,更驱动信息化与业务创新深度融合.电力.电网企业集团信息系统群逐渐朝着一体化方向发展,信息链越 ...