app小程序web安全—sign签名绕过

news/2025/2/27 16:34:24/文章来源:https://www.cnblogs.com/CVE-Lemon/p/18563947

零、前言

在web界面登陆时,小程序和app传输数据时经常会碰到签名,会对请求的参数进行签名,如果自己修改了数据包就会校验失败非常麻烦。

本文编写的契机就是因为碰到了一个JeecgBoot的小程序, 想请求信息泄露的url但是显示“Sign签名校验失败”,让我非常无语,到手的漏洞飞了。所以打算研究一下签名,本文讲的是md5签名,以后再研究研究aes加密传输数据啥的。

一、环境准备

本文测试环境为JeecgBoot,代码链接:jeecgboot/Github

环境配置链接:IDEA启动项目 - JeecgBoot 文档中心

配置好依赖和数据库后启动后端:org.jeecg.JeecgSystemApplication

启动Vue3前端,点击dev,Jeecg启动!

二、阅读代码(后端)

关于签名函数的位置我不太会定位,是通过网络搜索找到的。

最终定位到SignAuthConfigurationSignAuthInterceptorSignUtil等类。

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)

热加载 (yaklang.io)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/839694.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mobaxterm

软件来源: https://webra.top/app/249.html 安装包:推荐的B站视频: https://www.bilibili.com/video/BV1ze41157SP/?spm_id_from=333.337.search-card.all.click&vd_source=a171527166b8663ca801f58ca719a9b8

如何保留 wpftmp.csproj 文件用于调试

在构建 WPF 的过程,会生成 wpftmp.csproj 中间项目文件,用这个文件来辅助 XAML 构建过程。中间项目文件会在构建完成之后被删除,本文告诉大家如何保留 wpftmp.csproj 文件用于调试设置方法是添加 <GenerateTemporaryTargetAssemblyDebuggingInformation>true</Gene…

React Fiber架构的原理和工作模式

React16 => React引入Fiber架构,解决过去更新机制的问题 =》 在长时间的更新过程中,主线程会被阻塞,导致应用无法即时响应用户输入。 核心内容: 【Fiber是什么】【Fiber的底层原理】Fiber是什么? 当编写React组件并使用JSX时,React在底层会将JSX转换为元素的对象结构转…

【shell脚本】精选10款Nginx日志分析脚本

Nginx日志分析是网站运维和性能优化的重要环节。10个常用的Nginx日志分析脚本,脚本涵盖了从基本访问统计到高级性能分析的多个方面。供参考学习。 1、统计访问最多的前10个IP地址 #!/bin/bash LOG_FILE=$1 echo "统计访问最多的10个IP" awk {a[$1]++}END{print &quo…

【后门程序编程】基础1

一、后门概述 1.1 后门的发展历史 1.1.1 功能上发展。1.1.2 隐蔽性上的发展。1.2 后门的分类1.2.1 网页后门 1.2.2 线程插入后门 1.2.3 扩展后门 1.2.4 C/S后门。1.2.5 root kit。二、编写简单的cmdshell程序 2.1 管道通信技术简介 2.2 正向连接后门的编程 2.2.1 双…

LEAD:用于无源通用域自适应的学习分解

LEAD:用于无源通用域自适应的学习分解 通用领域适应(UniDA)的目标是在存在协变量和标签转移的情况下进行知识转移。最近,出现了无源通用域适配(SF UniDA),可以在不访问源数据的情况下实现UniDA,由于数据保护政策,这往往更实用。主要的挑战在于确定协变量移位样本是否属…

无监督域自适应的域不可知相互激励

无监督域自适应的域不可知相互激励 传统的无监督域自适应(UDA)致力于最大限度地减少域之间的分布差异,这忽视了从数据中利用丰富的语义,并难以处理复杂的域转换。一种有前景的技术是利用大规模预训练视觉语言模型的知识进行更有指导的适应。尽管做出了一些努力,但当前的方…

收藏篇:低功耗模组软件的PWM应用实例

本文是把我自己收藏的低功耗模组软件的PWM应用实例分析大家,我是以低功耗4G模组Air724UG为例。本文是把我自己收藏的低功耗模组软件的PWM应用实例分析大家,我是以低功耗4G模组Air724UG为例。 一、简介 1.1 pwm是什么 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩…

4G模组Air724UG软件的GPIO教程 | 技术版!

今天我要讲的技术是4G模组Air724UG软件的GPIO教程,希望看文的你有所收获。今天我要讲的技术是4G模组Air724UG软件的GPIO教程,希望看文的你有所收获。 一、GPIO 概述 GPIO 是通用型输入输出的简称,一个 GPIO 引脚可以用于输入、输出或其他特殊功能。 二、演示功能概述 本文将…

Air724UG软件的SD卡随笔!贴身版

本次要讲的是4G模组的SD卡示例,以Air724UG模组为例子供大家参考。本次要讲的是4G模组的SD卡示例,以Air724UG模组为例子供大家参考。 一、SD 卡概述 SD卡在物联网设备中,经常用于存储较大文件的容器载体。本文介绍如何用 Air724UG开发板,和PC端搭建一个基于SD卡存储文件的功…

关于低功耗模组的SPI示例详细教程!

本文说的是低功耗模组的SPI示例详细教程,以低功耗4G模组Air724UG为例我将详细分析。本文说的是低功耗模组的SPI示例详细教程,以低功耗4G模组Air724UG为例我将详细分析。 一、简介 SPI 是串行外设接口(Serial Peripheral Interface)的缩写。 SPI,是一种高速的,全双工,同步的…

在WPF程序中实现PropertyGrid功能

使用C#开发过Windows Forms的都知道,在Windows Forms程序中,有一个PropertyGrid控件,可以用于显示对象的属性,在WPF中并没有默认提供此功能的控件,今天以一个简单的小例子,简述在WPF中借助WinForm的PropertyGrid实现属性列表功能,仅供学习分享使用,如有不足之处,还请指…