吳江城鄉(xiāng)建設(shè)局網(wǎng)站搜索引擎優(yōu)化特點(diǎn)
文章目錄
- 理論知識(shí)
- cookie(放在瀏覽器)
- session(放在 服務(wù)器)
- token
- jwt(json web token)
- header
- payload
- Signature
- JWT通信流程
- JWT與Token 區(qū)別
- 相同點(diǎn)
- 區(qū)別
- WebGoat靶場(chǎng)--JWT tokens
- 環(huán)境啟動(dòng)
- 第四關(guān)
- 第五關(guān)
- 第七關(guān)
屬于越權(quán)漏洞
理論知識(shí)
cookie(放在瀏覽器)
? cookie 是一個(gè)非常具體的東西,指的就是瀏覽器里面能永久存儲(chǔ)的一種數(shù)據(jù),僅僅是瀏 覽器實(shí)現(xiàn)的一種數(shù)據(jù)存儲(chǔ)功能。
cookie 由服務(wù)器生成,發(fā)送給瀏覽器,瀏覽器把 cookie 以 kv 形式保存到某個(gè)目錄下的 文本文件內(nèi),下一次請(qǐng)求同一網(wǎng)站時(shí)會(huì)把該 cookie 發(fā)送給服務(wù)器。由于 cookie 是存在客戶 端上的,所以瀏覽器加入了一些限制確保 cookie 不會(huì)被惡意使用,同時(shí)不會(huì)占據(jù)太多磁盤空 間,所以每個(gè)域的 cookie 數(shù)量是有限的
session(放在 服務(wù)器)
session 從字面上講,就是會(huì)話。這個(gè)就類似于你和一個(gè)人交談,你怎么知道當(dāng)前和你交 談的是張三而不是李四呢?對(duì)方肯定有某種特征(長(zhǎng)相等)表明他就是張三。
session 也是類似的道理,服務(wù)器要知道當(dāng)前發(fā)請(qǐng)求給自己的是誰。為了做這種區(qū)分,服 務(wù)器就要給每個(gè)客戶端分配不同的“身份標(biāo)識(shí)”,然后客戶端每次向服務(wù)器發(fā)請(qǐng)求的時(shí)候,都 帶上這個(gè)“身份標(biāo)識(shí)”,服務(wù)器就知道這個(gè)請(qǐng)求來自于誰了。至于客戶端怎么保存這個(gè)“身份 標(biāo)識(shí)”,可以有很多種方式,對(duì)于瀏覽器客戶端,大家都默認(rèn)采用 cookie 的方式。
服務(wù)器使用 session 把用戶的信息臨時(shí)保存在了服務(wù)器上,用戶離開網(wǎng)站后 session 會(huì)被 銷毀。這種用戶信息存儲(chǔ)方式相對(duì) cookie 來說更安全,可是 session 有一個(gè)缺陷:如果 web 服務(wù)器做了負(fù)載均衡,那么下一個(gè)操作請(qǐng)求到了另一臺(tái)服務(wù)器的時(shí)候 session 會(huì)丟失。
token
Token是用戶進(jìn)行一些權(quán)限操作時(shí)的許可憑證。token本質(zhì)是字符串,里面包含了用戶信息,過期時(shí)間,加密方式等。token是在前端進(jìn)行登錄之后,由服務(wù)器分發(fā)給前端,然后前端進(jìn)行權(quán)限操作時(shí),再將token發(fā)送給服務(wù)器,由服務(wù)器來驗(yàn)證。token是有過期時(shí)間的,一但token過期,用戶就要重新登陸讓服務(wù)器生成新的token。
在 Web 領(lǐng)域基于 Token 的身份驗(yàn)證隨處可見。在大多數(shù)使用 Web API 的互聯(lián)網(wǎng)公司中, tokens 是多用戶下處理認(rèn)證的最佳方式。
以下幾點(diǎn)特性會(huì)讓你在程序中使用基于 Token 的身份驗(yàn)證
- 無狀態(tài)、可擴(kuò)展
- 支持移動(dòng)設(shè)備
- 跨程序調(diào)用
- 安全
jwt(json web token)
一個(gè) JWT 實(shí)際上就是一個(gè)字符串,它由三部分組成:
- 頭部(head)
- 負(fù)載(payload)
- 簽名(Signature)
前兩部分需要經(jīng)過 Base64
編碼,后一部分通過前兩部分Base64
編碼后再加密
而成
header
頭部通常由兩部分組成:算法類型和令牌類型。
- 算法類型:指定用于生成簽名的算法,例如 HMAC、RSA 或者 ECDSA。
- 令牌類型:指定令牌的類型,常見的是 JWT。
頭部使用 Base64URL
編碼表示,并作為整個(gè) JWT 的第一部分。頭部的一個(gè)示例:
{"alg": "HS256","typ": "JWT"
}alg:是說明這個(gè) JWT 的簽名使用的算法的參數(shù),常見值用 HS256(默認(rèn)),HS512 等,也可以為
None。HS256 表示 HMAC SHA256。
typ:說明這個(gè) token 的類型為 JW算法類型也可以是 none,表示不加密,不加密的話簽名就沒用了,但是最后那個(gè) 點(diǎn) 必須要有
payload
載荷存儲(chǔ)了有關(guān)用戶或?qū)嶓w的聲明和其他有關(guān)信息
- 聲明:如用戶 ID、角色、權(quán)限等信息
- 注冊(cè)聲明:包含一些標(biāo)準(zhǔn)的聲明(比如發(fā)行人、過期時(shí)間等)和一些自定義的 聲明
載荷也使用 Base64URL
編碼表示,并作為整個(gè) JWT 的第二部分。載荷的一個(gè)示例:
{"sub": "1234567890","name": "John Doe","iat": 1516239022
}
Signature
簽名是拿到被base64編碼的頭部和負(fù)載后,用標(biāo)頭里的加密算法對(duì)拿到的標(biāo)頭和負(fù)載進(jìn)行加密,然后作為jwt的第三部分。簽名是用來驗(yàn)證標(biāo)頭和負(fù)載中的信息有沒有被篡改。如果標(biāo)頭和負(fù)載的信息被篡改,則這個(gè)jwt是失效的。反之驗(yàn)證通過 ----------------用于驗(yàn)證 JWT 的完整 性和真實(shí)性
服務(wù)器有一個(gè)不會(huì)發(fā)送給客戶端的密碼(secret),用頭部中指定的算法對(duì)頭部和聲明的內(nèi)容用 此密碼進(jìn)行加密,生成的字符串就是 JWT 的簽名
簽名生成方式:將頭部和載荷進(jìn)行 Base64URL
編碼后拼接在一起,然后使 用指定的加密算法(如 HMAC、RSA
)進(jìn)行簽名,將生成的簽名添加到JWT
中
JWT通信流程
JWT與Token 區(qū)別
相同點(diǎn)
- 都是訪問資源的令牌
- 都可以記錄用戶的信息
- 都是使服務(wù)端無狀態(tài)變化
- 都是驗(yàn)證成功后,客戶端才能訪問服務(wù)端上受保護(hù)的資源
區(qū)別
- Token: 服務(wù)端驗(yàn)證客戶端發(fā)送過來的Token 時(shí),還需要查詢數(shù)據(jù)庫獲取用戶信息,然后驗(yàn)證Token 是否有效
- JWT: 將token 和 Payload 加密后存儲(chǔ)于客戶端,服務(wù)端只需要使用秘鑰進(jìn)行校驗(yàn)即可,不需要查詢或者減少查詢數(shù)據(jù)庫,因?yàn)镴WT自包含了用戶信息和加密的數(shù)據(jù)
WebGoat靶場(chǎng)–JWT tokens
環(huán)境啟動(dòng)
啟動(dòng)WebGoat
靶場(chǎng)
java -jar webgoat-server-8.0.0.M17.jar --server.port=8888 --
server.address=192.168.8.8
訪問WebGoat
靶場(chǎng)
127.0.0.1:8888/WebGoat
注冊(cè)一個(gè)用戶
第四關(guān)
通過目標(biāo):以管理員的身份清楚普通用戶的投票數(shù)
點(diǎn)擊刪除投票的按鈕, BurpSuite
攔截?cái)?shù)據(jù)包,并觀察數(shù)據(jù)包
訪問jwt.io網(wǎng)站,粘貼進(jìn)去
可以看出使用的加密算法為HS512
Payload:admin
為false
,user
不是admin
,而是Tom
選中Payload
來到base64這個(gè)網(wǎng)站,admin
修改為true
,
再把JWT頭部的算法類型改為none
,如果改為了none
,后面的簽名就沒有意義了
簽名的意義就是為了加密算法是否正確,內(nèi)容是否正確,現(xiàn)在不用加密了,所以最后一個(gè).
后面的簽名部分就不要了
刷新頁面
成功重置!!
第五關(guān)
修改 exp 有效時(shí)間 ,修改username為 WebGoat
爆破秘鑰
hashcat -m 16500 jwt.txt -a 3 -w 3 1.txt-m 16500 這里的 16500 對(duì)應(yīng)的就是 jwt 的 token 爆破;
-a 3 代表蠻力破解
-w 3 可以理解為高速破解,就是會(huì)讓桌面進(jìn)程無響應(yīng)的那種高速
jwt.txt 是我把題目要求破解的 token 保存到的文件
pass.txt 密碼字典
得出密鑰是victory
第七關(guān)
通過目標(biāo):冒充tom用戶,讓tom幫我們付錢
BurpSuite
攔截?cái)?shù)據(jù)包,并觀察數(shù)據(jù)包
并不是說一定要把JWT
放到Cookie
字段里
靶場(chǎng)提供了一個(gè)JWT ,點(diǎn)擊here
跳轉(zhuǎn)鏈接
修改Payload的過期時(shí)間和頭部的算法類型
unix時(shí)間互換