dedecms5.7 sp2前臺修改任意用戶密碼
前言
其實這個漏洞出來有一段時間了,不算是一個影響特別大的漏洞,畢竟dede是一個內容管理系統,用戶這一塊本來就基本沒有用。該漏洞的精髓就是一個弱類型的比較:’0.0’==’0’
漏洞版本
該漏洞出現在最新版的dede上,我復現的版本是v5.7 sp2 utf8版本
漏洞影響
允許用戶修改任意前臺用戶的密碼,不能對管理員賬戶造成影響,畢竟管理員賬戶與前臺用戶的數據表時分開存放的。而且,前臺也不能直接登錄管理員賬戶
漏洞利用條件
開啓會員模塊
攻擊者擁有一個正常的會員賬號
目標沒有設置安全問題
由於dede默認是沒有開啓會員功能的,也就是我們不能註冊用戶,所以要復現該漏洞需要自己開啓。請大家自行搜索開啓
漏洞復現
首先我先註冊兩個用戶吧
攻擊者:000001 密碼:123
受害者:test 密碼:123
由於dedecms註冊用戶需要審覈,我這裏是本地搭的,我直接在數據庫裏更改一下就行了。
把-10改爲0
update dede_member set spacesta=0 where mid=3
執行了該語句你註冊的用戶就相當於通過了審覈了。
現在我們的目標就是把test用戶的密碼更改爲hacker
第一步:
在登錄000001用戶的前提下,請求
http://{yourwebsite}/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id={userid}
通過burp抓包,並把這個請求發送的repeater中,可以看到返回的包中有一個鏈接
我們直接訪問該鏈接就可以看到一個更改密碼的頁面:
我們把密碼改爲hacker,然後試着登錄下
成功利用!下面我們具體來看看漏洞產生的原因
漏洞分析
問題出現在resetpassword.php文件的75行處。
這裏的代碼大概意思就是把我們傳過去的安全$safequestion
以及$safeanswer
與數據庫中一開始用戶設定的safequestion與safeanswer是否匹配,如果匹配則可以往下進行,相當於驗證密保問題。我們要做的就是繞過這裏的判斷,因爲我們這個攻擊成功的前提就是用戶沒有設置密保問題,所以在數據庫中safequestion的值如下圖:
這裏需要做的主要是繞過對safequestion的判斷,對safeanswer的判斷不需要我們繞過,本身就是滿足的。我們可不可以直接傳一個safequestion=0過去呢?答案是不行的,因爲0在php中empty測試時會返回true。所以我們需要繞過的還有empty這個函數
所以我們直接令safequestion=0.0,0.0可以繞過empty檢查,而且由於if判斷裏面的比較是弱類型比較
0.0 == 0
//true
這樣我們就會執行sn函數了,繼續追蹤一下吧,位於dedecms\member\inc\inc_pwd_functions.php:
默認狀態下,臨時密碼的表爲空。所以會進入第一個判斷,我們去看看newmail函數都做了什麼吧。
主要代碼我已經用紅框圈出來了,第二個紅框中的鏈接也就是最後修改密碼鏈接,只要拿到它我們就可以改密碼了。獲得這個鏈接需要通過抓取返回包。
總結
整個流程大概就到這了,可以很清晰的看到該漏洞就是由於那個弱類型的比較,通過構造請求我們可以控制mid(越權),mid也就是不同用戶的編號,所以我們可以更改幾乎所有用戶的密碼,只是還不能對管理員做什麼。當然這個漏洞結合另外一個dede漏洞可以更改管理員的密碼,後續將會進行復現
關注web安全