隨便登錄個(gè)賬號(hào)看到提示說只有admin可以能看到flag弓摘,嘗試登錄admin賬號(hào)驱显,他說admin不允許被登錄拆祈∨鸢辏看到題目提示說是CBC字節(jié)翻轉(zhuǎn)攻擊究飞,那么就想他肯定會(huì)告訴我們iv、cipher什么的吧,于是burp抓包發(fā)包亿傅,發(fā)現(xiàn)響應(yīng)頭中返回了iv媒峡、cipher,但是還沒完葵擎,因?yàn)槲覀儾恢篮笈_(tái)對(duì)我們傳進(jìn)去的username谅阿、password作了什么處理,試了一下坪蚁,發(fā)現(xiàn)存在.index.php.swp奔穿,訪問下載到備份文件镜沽,vim -r index.php.swp即可恢復(fù)敏晤,下面是關(guān)鍵代碼部分
在這里我們可以看到后臺(tái)將我們傳進(jìn)去的username、password構(gòu)造成了數(shù)組info缅茉,登錄的時(shí)候先將其序列化嘴脾,再加密形成cookie中的cipher,并以此來(lái)作為我們的身份標(biāo)識(shí)蔬墩。當(dāng)我們不post數(shù)據(jù)而是將返回iv译打、cipher添加到我們的請(qǐng)求頭中再次發(fā)起請(qǐng)求時(shí),服務(wù)器不會(huì)更新我們的身份拇颅,而是會(huì)利用我們請(qǐng)求頭中的iv奏司、cipher來(lái)解密,再反序列化得到用戶名以此來(lái)驗(yàn)證我們的身份樟插,我們來(lái)驗(yàn)證一下
假設(shè)我們的username為admik韵洋,密碼為123,那么序列化后就為
那我們的思路就是黄锤,修改cookie中的值搪缨,使其解密出來(lái)的username為admin,即將k改為n
知道了思路之后鸵熟,我們來(lái)了解一下CBC是怎么工作的
加密過程
Plaintext:待加密的數(shù)據(jù)
IV:用于隨機(jī)化加密的比特塊副编,保證即使對(duì)相同明文多次加密,也可以得到不同的密文流强。
Key:被一些如AES的對(duì)稱加密算法使用
Ciphertext:加密后的數(shù)據(jù)
對(duì)于第一塊密文:Ciphertext = Plaintext ^ IV
對(duì)于第二及剩下的組塊:Ciphertext(N) = Ciphertext(N-1) ^ Plaintext
即前一塊密文用來(lái)產(chǎn)生下一塊密文痹届,字節(jié)翻轉(zhuǎn)攻擊就是利用這一點(diǎn)
解密過程
對(duì)于第一塊:Plaintext = Decrypt(Ciphertext) ^ IV
對(duì)于第二塊及剩下的:Plaintext(N) = Decrypt(Ciphertext) ^?Ciphertext(N-1)
并且還要注意一點(diǎn):在密文中改變的字節(jié)只會(huì)影響在下一明文中具有相同偏移量的字節(jié),即如下圖
我們構(gòu)造的用戶名admik賬號(hào)序列化后為
a:2:{s:8:"username";s:5:"admik";s:8:"password";s:3:"123";}
我們的目標(biāo)是將k改成n打月,因此第一件事就是把明文分成16個(gè)字節(jié)的塊:
Block1: a:2:{s:8:"userna
Block2: me";s:5:"admik";
Block3: s:8:"password";s
Block4: :3:"123";}
我們可以看到我們的目標(biāo)字符位于塊2队腐,偏移量為13,這就意味著我們要改變塊一中偏移量為13的字符
第二塊明文偏移量為13的字符(C) = 第一塊密文偏移量為13的字符(A) ^ decrypt(第二塊密文的偏移量為13的字符)(B)
即 C = A ^ B僵控,這里我們知道C和A香到,因此B = A ^ C
假設(shè)我們修改A為A2,A2 = A ^ C ^ D(我們想要的字符,這里指n)
那么C = A2 ^ B = A ^ C ^ D ^ A ^ C = 0 ^ D? = D悠就,即
$enc[13] = chr(ord($enc[13]) ^ ord("k") ^ ord ("n"))
這里還有一個(gè)問題要注意一下千绪,因?yàn)槲覀冃薷牧说谝粔K的密文,如果我們繼續(xù)用原來(lái)的iv去解密第一塊密文梗脾,那么肯定是不成功的荸型,是無(wú)法反序列化的,因此我們需要修改iv炸茧,使其解密第一塊得到的是a:2:{s:8:"userna
如何修改iv呢
第一塊錯(cuò)誤明文 = decrypt(第一塊原密文) ^ ord_iv
那么? decrypt(第一塊原密文) =?第一塊錯(cuò)誤明文 ^ ord_iv
第一塊正確明文 =?decrypt(第一塊原密文) ^ new_iv
那么? new_iv =?decrypt(第一塊原密文) ^ 第一塊正確明文 =??第一塊錯(cuò)誤明文 ^ ord_iv ^?第一塊正確明文
將其url編碼替換原來(lái)的iv得到flag
參考:http://wooyun.jozxing.cc/static/drops/tips-7828.html
作者水平有限瑞妇,若有錯(cuò)誤請(qǐng)指出Orz