【漏洞分析】dedecms有前提前台任意用戶密碼修改


 0x00 前言

早上瀏覽sec-news,發現錦行信息安全發布了一篇文章《【漏洞分析】 織夢前台任意用戶密碼修改》,看完之后就想着自己復現一下。

該漏洞的精髓是php的弱類型比較,'0.0' == '0',也有一定的限制,只對沒有設置安全問題的用戶有效(默認是沒有設置的)。

 

0x01 漏洞版本

我復現的是DedeCMS V5.7 SP2正式版,2018-01-09發布的,其他的沒測。應該算是最新版本的一個0day了。

 

0x02 漏洞影響

該漏洞允許攻擊者修改任意前台用戶密碼。

 

0x03 漏洞利用條件

1,開啟會員模塊

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

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

 

0x04 漏洞分析

問題出現在/member/resetpasswordd.php  文件中。dedecms 用的是全局變量解析

一步步看:

 

這里先接受了一個id變量,用來查詢用戶。

接下來看到

 

這里是整個漏洞的核心所在,從數據庫中獲取safequestion,然后與傳過來的數據進行判等。用的是雙等號,又因為用戶沒有設置安全問題,數據庫里面默認存的是0。

通過php弱類型的轉換'0.0' == '0'了。(內部運算:先是把0.0(浮點數(0.0)轉換為int(0),然后字符串('0')轉換為int(0),最后 0==0 ,所以相等了。)

直接傳0是不行的,因為前面有一個empty的判斷,當然你也可以利用十六進制比如:0x0

 其內不轉換和上面的是一樣的。

接下來跟進sn函數(記住這里我們的send默認為N)

繼續跟進newmail函數

可以看到當send為N時,直接在前端頁面返回了驗證碼。(而我們這里剛好默認就是N,見前文)
又因為用戶id是我們可以控制的,safequestion(默認情況)下可以繞過。

那么也就達成了修改前台任意用戶密碼的效果。

 

0x05 漏洞復現

因為這里的模塊屬於會員模塊,包含了member.login.class.php。需要登錄才能操作。

那么我先注冊一個用戶,擔任攻擊者,再注冊另外一個用戶擔任目標。

請求url應該是這樣的:

http://127.0.0.1/dedecms/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id={userid}

test為攻擊者,用戶id為2,密碼:test。test1為目標,用戶id為3,修改密碼為:hacker

下面就演示一下用test修改test1用戶的過程。

Step1: 登陸test用戶

 

Step2:發送請求url

 

Step3:請求修改頁URL:

http://127.0.0.1/dedecms/member/resetpassword.php?dopost=getpasswd&id=3&key=Dj7PeiRm

 

 

Step4:修改用戶test1的密碼為hacker

Step5: 用修改之后的密碼登陸進行驗證

驗證成功。

 

0x06  思考與總結

雖然說整個漏洞的關鍵是那一處弱類型比較,也是php的特性與及開發人員對於特性的掌握不夠全面所致。漏洞危害其實不太,dede多用於內容,沒有什么用戶交互而言。如果需要提供用戶交流平台,大多數應該會用discuz。

但我覺得對於用戶的權限划分不明才是這個漏洞的根本,可以歸根為越權。用戶id竟然可以直接由用戶控制傳輸,倘若通過session,那么就算用戶安全問題沒有設置,可以用弱類型比較,最后也僅限於修改自己的密碼。

php的弱類型一直是一個問題,特別是早期沒有那么重視安全的時候。多少問題都是出在那里。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM