質問編集履歴

1

入力値と結果の追記、

2021/12/11 09:18

投稿

lkl191
lkl191

スコア14

test CHANGED
File without changes
test CHANGED
@@ -20,34 +20,100 @@
20
20
 
21
21
  const jwt = require("jsonwebtoken");
22
22
 
23
+
24
+
25
+ const fs = require("fs");
26
+
23
27
  const PUBLIC_KEY = fs.readFileSync("../publicKey.pem"); // 公開鍵
24
28
 
25
29
 
26
30
 
31
+ let token =
32
+
27
- // test_tokenは[{"alg": "none", "typ": "JWT"}.{"user", "admin"}.]をbase64でエンコードしたものです。
33
+ "eyJhbGciOiJSUzI1NiJ9.eyJ1c2VyIjogIueUsOS4rSJ9.Tvowrr98fHxyHjRtzHKe58cBP7vWUzYvRXRTS1e4zZNWUqDopnRf4fAZ9cbcx8ovvj9NZetqo1lz6eQK2hsF6Q";
28
34
 
29
35
 
30
36
 
31
- const test_token = "eyJhbGciOiAibm9uZSIsICJ0eXAiOiAiSldUIn0.eyJ1c2VyIjogImFkbWluIn0."
37
+ const secretsOrPrivateKey = PUBLIC_KEY;
32
38
 
33
39
 
34
40
 
35
- jwt.verify(testToken, PUBLIC_KEY, (err, decoded) => {
41
+ jwt.verify(token, secretsOrPrivateKey, (err, decoded) => {
36
42
 
37
- if (err) {
43
+ if (err) {
38
44
 
39
- res.status(500).send("jwtの解読に失敗しました");
45
+ console.log("jwtの解読に失敗しました");
40
46
 
41
- return;
47
+ } else {
42
48
 
43
- } else {
49
+ console.log(decoded);
44
50
 
45
- res.json(decoded);
51
+ }
46
52
 
47
- }
48
-
49
- });
53
+ });
50
54
 
51
55
  ```
52
56
 
53
57
  どなたかわかる方はいませんでしょうか?
58
+
59
+
60
+
61
+ テスト用なのでAPI通信はしていません。
62
+
63
+ このコマンドから実行しています。
64
+
65
+ ```
66
+
67
+ node test.js
68
+
69
+ ```
70
+
71
+ jwtのヘッダとペイロードは
72
+
73
+ ```
74
+
75
+ header = {"alg": "RS256"}
76
+
77
+ payload = {"user": "田中"}
78
+
79
+ ```
80
+
81
+ になり、
82
+
83
+ この結果が返ってきます。
84
+
85
+ ```
86
+
87
+ { user: '田中' }
88
+
89
+ ```
90
+
91
+
92
+
93
+ ここで、jwtを以下に変更して、署名を削除し、再度base64でエンコードし
94
+
95
+ ```
96
+
97
+ header = {"alg": "none"}
98
+
99
+ payload = {"user": "admin"}
100
+
101
+ ```
102
+
103
+ 再度base64でエンコードしjwt
104
+
105
+ ```
106
+
107
+ token = "eyJhbGciOiAibm9uZSIsICJ0eXAiOiAiSldUIn0.eyJ1c2VyIjogImFkbWluIn0."
108
+
109
+ ```
110
+
111
+ でalg=noneの脆弱性のテストをすると、
112
+
113
+ ```
114
+
115
+ jwtの解読に失敗しました
116
+
117
+ ```
118
+
119
+ と出てしまいます。