dedecms5.7 sp2前臺修改任意用戶密碼漏洞(復現)

dedecms5.7 sp2前臺修改任意用戶密碼

前言

其實這個漏洞出來有一段時間了,不算是一個影響特別大的漏洞,畢竟dede是一個內容管理系統,用戶這一塊本來就基本沒有用。該漏洞的精髓就是一個弱類型的比較:’0.0’==’0’

漏洞版本

該漏洞出現在最新版的dede上,我復現的版本是v5.7 sp2 utf8版本
mark

漏洞影響

允許用戶修改任意前臺用戶的密碼,不能對管理員賬戶造成影響,畢竟管理員賬戶與前臺用戶的數據表時分開存放的。而且,前臺也不能直接登錄管理員賬戶

漏洞利用條件

  1. 開啓會員模塊

  2. 攻擊者擁有一個正常的會員賬號

  3. 目標沒有設置安全問題

由於dede默認是沒有開啓會員功能的,也就是我們不能註冊用戶,所以要復現該漏洞需要自己開啓。請大家自行搜索開啓

漏洞復現

首先我先註冊兩個用戶吧
攻擊者:000001 密碼:123
受害者:test 密碼:123
由於dedecms註冊用戶需要審覈,我這裏是本地搭的,我直接在數據庫裏更改一下就行了。
mark
把-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中,可以看到返回的包中有一個鏈接
mark
我們直接訪問該鏈接就可以看到一個更改密碼的頁面:
mark
我們把密碼改爲hacker,然後試着登錄下
mark
成功利用!下面我們具體來看看漏洞產生的原因

漏洞分析

問題出現在resetpassword.php文件的75行處。
mark
這裏的代碼大概意思就是把我們傳過去的安全$safequestion以及$safeanswer與數據庫中一開始用戶設定的safequestion與safeanswer是否匹配,如果匹配則可以往下進行,相當於驗證密保問題。我們要做的就是繞過這裏的判斷,因爲我們這個攻擊成功的前提就是用戶沒有設置密保問題,所以在數據庫中safequestion的值如下圖:
mark
這裏需要做的主要是繞過對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
mark

默認狀態下,臨時密碼的表爲空。所以會進入第一個判斷,我們去看看newmail函數都做了什麼吧。
mark
主要代碼我已經用紅框圈出來了,第二個紅框中的鏈接也就是最後修改密碼鏈接,只要拿到它我們就可以改密碼了。獲得這個鏈接需要通過抓取返回包。

總結

整個流程大概就到這了,可以很清晰的看到該漏洞就是由於那個弱類型的比較,通過構造請求我們可以控制mid(越權),mid也就是不同用戶的編號,所以我們可以更改幾乎所有用戶的密碼,只是還不能對管理員做什麼。當然這個漏洞結合另外一個dede漏洞可以更改管理員的密碼,後續將會進行復現


mark
關注web安全

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章