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的弱類型一直是一個問題,特別是早期沒有那么重視安全的時候。多少問題都是出在那里。