文章目錄
- 一、加密算法/編碼
- 二、JWT:
-
-
- 2.1 概念:
- 2.2 确認網站使用JWT:
- 2.3 實際例子:
- 2.4 結構(三部分):
- 2.5 攻擊思路:
-
- 2.6 其他:
-
一、加密算法/編碼
常見的:
md5(大多數網站已經開始加鹽)
SHA-1、2、256等(與md5同屬于雜湊演算法)
AES(加密模式、填充、資料庫、密碼、偏移量),可選以上5種方法對内容進行加密,且輸出可以選base64與hex(16進制)兩種。
假設一串特殊的base64解碼(密文中存在“ +/= ”)之後發現是一些亂碼,這串密文大機率是AES進行加密的
其破解來說,除了“密碼”與”偏移量“難搞,另外3種相關好碰撞(常見于CTF),正在陸續取代md5。
DES(與base64相似,但是在密文之中會出現“ / ”字元)
二、JWT:
2.1 概念:
一個用于替代session機制的産物,用于對使用者的身份做檢驗。
全稱JSON Web Token(JSON Web令牌)。
JWT不加密傳輸的資料,但是可以通過數字簽名來防止資料被篡改,用戶端與伺服器的具體互動如下:
~使用者輸入正确的賬戶密碼上傳伺服器,
~通過認證之後,伺服器将一串證明身份的字元傳回使用者端,即JWT
~之後使用者所有需要認證身份的資料包都攜帶着JWT去請求,作用十分類似cookie
需要注意的一點是,
一般JWT字元串都是儲存在header之中而非cookie之中(當然可以存在cookie中)。
這就使得其可以天然防禦csrf攻擊,但是無法抵擋XSS攻擊。
2.2 确認網站使用JWT:
~關鍵字 “ Authorization ”
~資料包格式(XXX.XXX.XXX)
2.3 實際例子:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
2.4 結構(三部分):
頭部(base64編碼)、資料(base64編碼)、簽名((頭部+資料+一個秘鑰)加密得到)
//由上述看出,一個強秘鑰(類似強密碼)對JWT的安全來說十分重要。
舉個例子:
頭部内容:
{
"alg": "HS256", 、、加密算法,常見的如HS256
"typ": "JWT" 、、可有可無的字段
}
資料:
{
"user_id": "666", 、、目前使用者的編号
"admin": "false", 、、目前使用者不是管理者
"iat": 1516239022 、、時間戳
}
2.5 攻擊思路:
~第一種:
正常的JWT: AAA.BBB.CCC
我們可以先base64還原 AAA.BBB 之後,修改完畢在base64編碼成為 XXX.YYY .
、、這裡注意,假設編譯的xxx.yyy中含有“=”直接去掉即可。
最終上傳“ XXX.YYY. ”到伺服器,直接幹掉簽名部分,這樣假設伺服器對簽名不進行校驗,
即可達成越權的目的。
注意的是,假設可以使用這種方式繞過身份驗證,可以嘗試在AAA.BBB中sql注入、XSS等等
XXX是base64編碼後的:
{
"alg": "none",
}
YYY是base64編碼後的:
{
"user_id": "666",
"admin": "true",
"iat": 1516239022
}
~第二種:
直接使用腳本爆破JWT的秘鑰,直接谷歌/百度即可,或者在GitHub上搜尋
~第三種:
在一些日志檔案中得到JWT,直接使用可能提示失效,
可以試着修改其對應的時間戳,即失效時間。(配合前兩種情況)
2.6 其他:
~遇到類似字元串的時候,可以複制粘貼到這個網站看看:
https://jwt.io/
~可以通過對JWT進行二次加密或者魔改來達到提高其安全性的目的