0x00 背景
測試過程中碰到了一個會話系統,出於保密原則這裡沒有截圖,自己想象一哈。
0x01 業務邏輯
系統功能很簡單,就是實現用戶A和用戶B進行會話,並且可以查看以往的聊天記錄。出現漏洞的點也是在歷史記錄上,通過構造參數可以查看網站內任意用戶的聊天記錄。
首先,用戶發起查詢歷史記錄的請求時,會發送如下的數據包,並且得到響應:
可以看到服務器返回了cid,也就是當前發送數據包的uid用戶發起過的會話名稱,一共有三條。
再之後,服務器緊接着發送了第二個數據包:
可以看到響應包就是要查詢的會話記錄。業務邏輯到此執行結束。
0x02 測試
不難想出,可以通過更改uid的方式來查看別人的聊天記錄。但我實際測試後發現,在第一個數據包如果更改為別人的uid,是可以返回別人的會話名稱的。但到了第二個數據包,發送的uid參數經過了加密,最後結果類似於以下字符串:
zrApelW+58GcN+At5Ons+8EysUAU77xqxj9ko3m7XMo=
大致猜個base64,解出來發現亂碼,應該是加密後的base64。
通過F12查看業務運行請求了哪些文件,最後在一個js文件里發現了AES加密的信息:
1234567891011function t(e) { var t = v.enc.Utf8.parse("bPsoyIvIALTcy6OP"), i = v.enc.Utf8.parse(e), a = v.enc.Utf8.parse("W8m2J1I3pQUADWyA8s"), s = v.AES.encrypt(i, t, { iv: a, mode: v.mode.CBC, padding: v.pad.Pkcs7 }); return s.toString() }
已經很明顯了,這是一個CBC方式的AES加密,密碼是bPsoyIvIALTcy6OP,偏移量是W8m2J1I3pQUADWy,直接把加密後的密文用工具解出來:
這時候思路已經很明顯了,我們可以構造其他人的uid來獲取歷史會話,再對uid進行上述AES加密,把剛剛獲取到的會話值也一併提交,就可以實現越權查看他人歷史記錄的效果。
0x03 結果
測試成功,無圖~
K1nm0,轉載於k1nm0.com。