1. 程式人生 > >dedecms5.7 sp2前臺修改任意使用者密碼漏洞(復現)

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安全