d_cms(某夢)公開漏洞復(fù)現(xiàn) - 篡改cookie登入admin
作者?| 楓澗
編輯?| 楌橪
審計系統(tǒng):dedeCMS v5.7
目標(biāo):篡改cookie實現(xiàn)任意登錄并分析原理。
我覺得這個漏洞主要是對于用戶ID的處理方式不當(dāng),以及把敏感的東西放到了cookie中進(jìn)行傳輸。
分析流程圖:

細(xì)致分析:
首先,當(dāng)我們訪問member/index.php?uid=00001時,觸發(fā)了Putcookie(),而Putcookie()中的last_vid就是我們url里面的uid,同時,還設(shè)置了last_vid以及l(fā)ast_vid_ckMd5兩個cookie進(jìn)行傳輸,這個地方就造成了cookie泄露,我們可以通過抓包得到。


獲得了后面需要用到的兩個東西:last_vid和last_vid_ckMd5。
其次,當(dāng)我們登陸成功后,會進(jìn)行IsLogin()判斷,判斷是否是登錄狀態(tài)。


而M_ID又是來源于memberlogin.class.php中170行,通過GetNum(GetCooke("DedeUserID"))來獲得;

期間我們可以觀察cookie.helper.php中的GetCookie()和PutCookie(),發(fā)現(xiàn)生成cookie的方法都一樣。

然后繼續(xù)memberlogin.class.php得到了M_ID往下走,我們發(fā)現(xiàn),在判斷M_ID是否為空時,運用了intval()函數(shù)。這個函數(shù)有一個特點,就是在處理一些特殊數(shù)據(jù)進(jìn)行取整處理時會進(jìn)行一定轉(zhuǎn)換,而也就是這些轉(zhuǎn)換為我們提供了機會。下面引用菜鳥論壇對于intval()對于一些數(shù)據(jù)的處理說明:


而之前我們提到在獲取cookie的時候也有一個GetNum()方法,這個方法其實也就是對M_ID做一個只取數(shù)字的處理,所以我們也可以通過修改正則表達(dá)式來達(dá)到想要的效果,避免使用intval()的而出現(xiàn)這個問題。

因此,我們設(shè)置M_ID=00001時,會通過intval()變?yōu)?,而1恰好就是admin的ID。那么我們得到了admin的M_ID之后,回到index.php進(jìn)行后續(xù)的數(shù)據(jù)獲取操作,從而進(jìn)入了對應(yīng)的空間。
操作及結(jié)果:
首先,注冊一個username是00001的用戶,類似能通過intval()換為1的就行,而這個username也就是我們的uid:

然后用00001用戶登陸后,刷新進(jìn)行抓包,用之前我們訪問00001主界面抓取到的cookie進(jìn)行修改再發(fā)包過去:

得到:
