069-Web攻防-Java安全&JWT项目插件&Postman中文包等

知识点

1、Java安全-Druid监控-未授权访问&信息泄漏

2、Java安全-Swagger接口-文档导入&联动批量测试

2、Java安全-JWT令牌攻防-空算法&未签名&密匙提取

Java安全-Druid监控-未授权访问&信息泄漏

Druid是阿里巴巴数据库事业部出品,为监控而生的数据库连接池。Druid提供的监控功能,监控SQL的执行时间、监控Web URI的请求、Session监控。当开发者配置不当时就可能造成未授权访问漏洞。

参考:https://developer.aliyun.com/article/1260382

攻击点:

  • 直接拼接URL路径,尝试能否直接未授权访问系统功能点。
  • 结合泄露URL路径和Session信息,利用BurpSuite进行尝试登录。
  • 利用Cookie编辑器替换Session,再次访问后台路径尝试进入后台。

黑盒环境下

  1. 在黑盒环境下 在url后面加上druid即可查看当前是否存在
    • image-20250630231645508

白盒发现

  1. 在项目源码配置文件中搜索druid关键字

    • image-20250701094750508
  2. 把这里#去除就代表要进行登录

  3. 如果没有配置密码就是未授权访问

    • image-20250701094818029
    • image-20250701094943692

攻击点

直接拼接URL路径,尝试能否直接未授权访问系统功能点。

image-20250701095220509

结合泄露URL路径和Session信息,利用BurpSuite进行尝试登录

image-20250701095245288

利用Cookie编辑器替换Session,再次访问后台路径尝试进入后台。

Java安全-Swagger接口-导入&联动批量测试

Swagger是一个用于生成、描述和调用RESTful接口的Web服务。就是将项目中所有(想要暴露的)接口展现在页面上,并可以进行接口调用和测试的服务。所以可以对这个接口进行漏洞测试,看是否存在未授权访问、sql注入、文件上传等漏洞。由于接口太多,一个个接口测试的话太费时间,所以一般会采用自动化接口漏洞安全测试。

黑盒情况下

查看 Swagger 文档:Swagger 提供了自动生成的 API 文档,通常可以通过 /swagger-ui/ 或类似路径访问到。通过查看这些文档,你可以了解所有可用的接口和请求的参数。

自动化发包测试

  1. 将网站上面的一些接口信息,显示到了页面上上面

image-20250701100109552

  1. 菜单管理尝试着去请求如果数据能够正常回显,那就是未授权访问

image-20250701100326465

image-20250701100437746

image-20250701100455390

黑盒情况下

  1. 实战中可以有几十个也有可能有几千个这样的接口 ,不可能一个一个去点,这个时候就要用到了工具自动化发包测试,Postman

    • image-20250701102218848
    • image-20250701102319700
  2. 通过这里得到api的所有接口

    • image-20250701102608504
  3. 一般根据自己需要进项设置 我们这里默认完事

    • image-20250701102749541
    • image-20250701103018457
    • image-20250701103142357
  4. 如果发生了报错点击整个文件 在变量环节将前面的双斜杠//删除即可正常用

    • image-20250701103231019

    • image-20250701103315581

    • image-20250701103428425

  5. 这里还可以进行一个授权的key,因为有的接口需要登录才能使用

    • image-20250701105315699
  6. 运行后该工具会对swagger全部接口自动发包测试,但是这里发现都是500响应,浏览器接口访问又是200

    • image-20250701105502301
  7. 如果postman上有出现200的响应,那么就有可能是一个未授权接口

    • image-20250701105743846

自动化漏洞测试

联动BurpSuite Xray

  1. postman左上角文件,设置里面选中代理,开启自定义代理配置,将代理的地址和端口和burp端口设置一样。

    • image-20250701110420773
    • image-20250701110436088
  2. postman上再次运行项目后可以看到流量转发到了burp上

  • image-20250701111004834
  1. 我们这里设置代理规则,使用Xary对burp进行流量转发,然后进行检测

    • image-20250701110942732

    • image-20250701114146164

  2. 使用命令对流量包进行检测

    • webscan --listen 127.0.0.1:7777 --html-output proxy.html
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118

      * ![image-20250701114401775](/img/image-20250701114401775.png)



      ## Java安全-[JWT](https://so.csdn.net/so/search?q=JWT&spm=1001.2101.3001.7020)令牌-空算法&未签名&密匙提取

      JSON Web Token(JWT)。它遵循JSON格式,将用户信息加密到token里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证token,通过token验证用户身份。基于token的身份验证可以替代传统的cookie+session身份验证方法。这使得JWT成为高度分布式网站的热门选择,在这些网站中,用户需要与多个后端服务器无缝交互。
      ![image-20250701114530780](/img/image-20250701114530780.png)

      ### 识别 JWT

      JWT由三部分组成:表头,有效载荷,签名

      > 标头(Header)
      > Header是JWT的第一个部分,是一个JSON对象,主要声明了JWT的签名算法,如"HS256”、"RS256"等,以及其他可选参数,如"kid"、"jku"、"x5u"等
      > alg字段通常用于表示加密采用的算法。如"HS256"、"RS256"等
      > typ字段通常用于表示类型
      > 还有一些其他可选参数,如"kid"、"jku"、"x5u"等

      > 有效载荷(Payload)
      > Payload是JWT的第二个部分,这是一个JSON对象,主要承载了各种声明并传递明文数据,用于存储用户的信息,如id、用户名、角色、令牌生成时间和其他自定义声明。
      > iss:该字段表示jwt的签发者。
      > sub:该jwt面向的用户。
      > aud:jwt的接收方。
      > exp:jwt的过期时间,通常来说是一个时间戳。
      > iat:jwt的签发时间,常来说是一个时间戳。
      > jti:此jwt的唯一标识。通常用于解决请求中的重放攻击。该字段在大多数地方没有被提及或使用。因为使用此字段就意味着必须要在服务器维护一张jti表, 当客户端携带jwt访问的时候需要在jti表中查找这个唯一标识是否被使用过。使用这种方式防止重放攻击似乎让jwt有点怪怪的感觉, 毕竟jwt所宣称的优点就是无状态访问

      > 签名(Signature)
      > Signature是对Header和Payload进行签名,具体是用什么加密方式写在Header的alg 中。同时拥有该部分的JWT被称为JWS,也就是签了名的JWT。
      > 对Header和Payload进行签名,具体是用什么加密方式写在Header的alg中。
      > 同时拥有该部分的JWT被称为JWS,也就是签了名的JWT。

      第一部分:对 JSON 的头部做 base64 编码处理得到
      第二部分:对 JSON 类型的 payload 做 base64 编码处理得到
      第三部分:分别对头部和载荷做base64编码,并使用.拼接起来
      使用头部声明的加密方式,对base64编码前两部分合并的结果加盐加密处理,作为JWT

      JWT 分为三部分,每一部分都是 **Base64Url 编码** 的字符串:

      1. **Header**(头部):描述 token 的类型(JWT)和签名算法(如 HS256)。
      2. **Payload**(载荷):实际的数据部分,通常包括用户信息、权限、过期时间等。
      3. **Signature**(签名):用于校验 token 是否被篡改。

      ![40bb0992afa8883a37881a9b546bbec3](C:\Users\liuyuanbiao\Desktop\BlogPhoto\40bb0992afa8883a37881a9b546bbec3./img/jpeg)

      在线解析:https://jwt.io/
      BURP插件:Hae 或 JSON Web Tokens



      #### 方式一:人工识别

      1. 拆分为三段(按 `.`)
      2. 对前两段用 Base64 解码
      3. 前面两段开头都是`eyj`

      ![image-20250701121235610](/img/image-20250701121235610.png)



      #### 方式二:Burp插件识别

      Hae(需要自己下载项目)

      JSON Web Tokens(BP商店有,支持识别解析)

      ![image-20250701142811248](/img/image-20250701142811248.png)

      ![image-20250701143236914](/img/image-20250701143236914.png)

      ![image-20250701150135860](/img/image-20250701150135860.png)

      ![image-20250701150412443](/img/image-20250701150412443.png)







      ### 解析JWT数据

      JWT在线解析:https://jwt.io/

      ![image-20250701150329816](/img/image-20250701150329816.png)



      ### JWT安全

      #### 空加密算法(攻击头部不使用加密)

      签名算法可被修改为none,JWT支持将算法设定为"None"。如果"alg"字段设为"None",那么签名会被置空,这样任何token都是有效的。

      ![image-20250701150640070](/img/image-20250701150640070.png)

      ![image-20250701150828665](/img/image-20250701150828665.png)

      #### 未校验签名(攻击签名不使用签名认证)
      某些服务端并未校验JWT签名,可以尝试修改payload后然后直接请求token或者直接删除signature再次请求查看其是否还有效。

      #### 暴力破解密钥(攻击签名知道密钥实现重组)
      针对是对称加密算法(非对称没有用)
      非对称要使用方法:从源码获取公钥私钥文件

      某些签名算法,例如HS256(HMAC+SHA-256),会像密码一样使用一个任意的、独立的字符串作为秘密密钥。这个秘钥如被轻易猜到或暴力破解,则攻击者能以任意的头部和载荷值来创建JWT,然后用密钥重新给令牌签名。

      #### 其他安全参考:(源码泄漏密匙,Kid注入等)
      参考文章:https://blog.csdn.net/weixin_44288604/article/details/128562796



      ### CTF-JWT

      JWT利用项目:https://github.com/ticarpi/jwt_tool

项目命令帮助

使用None算法

python3 jwt_tool.py JWT_HERE -X a

自定义修改生成

python3 jwt_tool.py JWT_HERE -T

使用字典破解

python3 jwt_tool.py JWT_HERE -C -d dictionary.txt

指定密码测试

python3 jwt_tool.py JWT_HERE -C -p password_here

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109



#### **WEB345(None空加密算法)**

签名算法可被修改为none,JWT支持将算法设定为 "None" 。如果 "alg" 字段设为 "None" ,那么签名会被置空,这样任何token都是有效的。

![image-20250701151502567](/img/image-20250701151502567.png)

![image-20250701151550641](/img/image-20250701151550641.png)

![image-20250701151604997](/img/image-20250701151604997.png)

![image-20250701151624756](/img/image-20250701151624756.png)

因为第一部分和第二部分都是使用了base64加密我们这里放到decode里面去

先解密将user修改为admin再base64加密

![image-20250701152252471](/img/image-20250701152252471.png)

将里面的jwt值进行替换 发送拿到flag,这里使用空算法none然后所以修改能成功

![image-20250701152343369](/img/image-20250701152343369.png)



#### Web346(None算法绕过签名)

1. 启动这题抓包后发现alg算法为HS256,这里就不能随意修改sub对象了

![image-20250701152705048](/img/image-20250701152705048.png)



2. 解题思路:alg强制设置为none绕过签名

* ![image-20250701153715488](/img/image-20250701153715488.png)

* ![image-20250701153855784](/img/image-20250701153855784.png)

* ![image-20250701164646995](/img/image-20250701164646995.png)

* ![image-20250701164955736](/img/image-20250701164955736.png)

* ![image-20250701165055336](/img/image-20250701165055336.png)

* > 签名算法可被修改为none,JWT支持将算法设定为 "None" 。如果 "alg" 字段设为 "None" ,那么签名会被置空,这样任何token都是有效的



2. 使用插件修改JWT

* 将Alg修改为none 再把sub改为admin,这里在response模块就自动修改了

* ![image-20250701165237618](/img/image-20250701165237618.png)
* ![image-20250701165358768](/img/image-20250701165358768.png)





#### Web347(弱口令密钥获取)



针对是对称加密算法(非对称没有用)
非对称要使用方法:获取源码或者公钥私钥文件

某些签名算法,例如HS256(HMAC+SHA-256),会像密码一样使用一个任意的、独立的字符串作为秘密密钥。这个秘钥如被轻易猜到或暴力破解,则攻击者能以任意的头部和载荷值来创建JWT,然后用密钥重新给令牌签名。


![image-20250701170211672](/img/image-20250701170211672.png)

![image-20250701170415777](/img/image-20250701170415777.png)

![image-20250701170530022](/img/image-20250701170530022.png)

![image-20250701170622103](/img/image-20250701170622103.png)

#### Web348(爆破密钥上题一样)

同上



#### Web349(公钥私钥泄露)

1. 环境启动后在页面app.js上下载源文件 分析

2. 公钥加密,私钥解密,私钥签名,公钥验签

* ![image-20250701171509112](/img/image-20250701171509112.png)

* ![image-20250701171428087](/img/image-20250701171428087.png)
* ![image-20250701171641607](/img/image-20250701171641607.png)
* ![image-20250701172143919](/img/image-20250701172143919.png)



2. 源码中私钥生成jwt签名,利用公钥解密jwt,只要有私钥就可以重新生成JWT

* ![image-20250701172252392](/img/image-20250701172252392.png)

* ```python
import jwt
public = open('private.key', 'r').read()
payload={"user":"admin"}
print(jwt.encode(payload, key=public, algorithm='RS256'))
  • image-20250701172632774

  • image-20250701172815087

  • image-20250701173725489

  • image-20250701173732154

Web350(密钥混淆攻击RS256=>HS256)

  1. 下载源码后使用Webstorm打开

  2. 从代码上看都是私钥生成签名,公钥进行验证,但是这里只能看到公钥,私钥是被删除了的,全局搜索无法找到

  3. 我们这里更换算法,把RS256更换为HS256 非对称算法改对称算法

    • image-20250701174708741

    • image-20250701174625872

    • var jwt = require('jsonwebtoken');
      var fs = require('fs');
      var privateKey = fs.readFileSync('./public.key');
      var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
      console.log(token)