代碼審計四(找回密碼問題)

驗證Token

在找回密碼的時候生成一個token,然後存儲到數據庫中,然後把找回密碼的地址發送到郵箱中,這個url中就含有token,由用戶點開後就可以修改密碼。

延伸

一些CMS的密碼加密方式很難被破掉,有時候拿到了管理的密碼破不掉

利用方法:一般找回密碼是用的郵箱,首先把管理的郵箱注入出來,然後再去找回密碼,再把數據庫的token注入出來,構造一下地址就可以重置密碼了。

rand函數生成Token

$resetpwd=md5(rand());

對 rand() 函數生成出來的數字進行md5,某些平臺下(例如:Windows )Rand_max只有32768,如果需要的範圍大於32768,那麼指定min和max參數就可以生成大於Rand_MAX的數了,或者考慮使用mt_rand()來替代它

$encryptstring=md5($this->time.$verification.$auth);

$timetemp=date("Y-m-d H:i:s",$this->time);
$auth=util::strcode($timetemp,'ENCODE');`

算法的 KEY 並沒有初始化,如果知道了這個時間,就可以生成加密的字符串

DedeCMS-V5.7前臺任意用戶密碼重置

漏洞影響:
該漏洞允許攻擊者修改任意前臺用戶密碼。

漏洞利用條件:
1,開啓會員模塊
2,攻擊者擁有一個正常的會員賬號
3,目標沒有設置安全問題

漏洞分析

漏洞文件爲/member/resetpassword.php:
這個文件是來找回用戶密碼的,這裏可以通過郵箱找回,也可以通過安全問題找回。
在這裏插入圖片描述
來看看代碼中問題出在哪裏:
在這裏插入圖片描述
這裏先接受了一個id變量,用來查詢用戶。
接下來看到:
在這裏插入圖片描述
這裏的dopost變量就是找回用戶密碼的操作,可以通過郵件找回也可以通過安全問題找回,上圖就是通過安全問題找回($dopost == “safequestion”)
首先mid變量通過正則來過濾提交的id參數,然後拼接到下面的select查詢語句中,

$sql = "SELECT safequestion,safeanswer,userid,email FROM #@__member WHERE mid = '$mid'";

漏洞重點在這裏:

if(empty($safequestion)) $safequestion = '';

if(empty($safeanswer)) $safeanswer = '';

判斷這兩個變量是否爲空,是就等於空字符,這兩個變量對應的就是找回密碼的安全問題和安全問題的答案。
接下來判斷我們在找回密碼頁面提交的安全問題和答案是否和數據庫中存的一樣,一樣的話進入執行這個sn函數,這個就是找回密碼的,否則不是。
問題就出在從數據庫中獲取safequestion,然後與傳過來的數據進行判等。用的是雙等號,又因爲用戶沒有設置安全問題,數據庫裏面默認存的是0。
在這裏插入圖片描述
通過php弱類型的轉換’0.0’ == '0’了。(內部運算:先是把0.0(浮點數(0.0)轉換爲int(0),然後字符串(‘0’)轉換爲int(0),最後 0==0 ,所以相等了。)

可以看到使用”0.0”,”0.”,”0e1”都可以繞過前面的判斷,最後進入sn()函數,繼續跟進sn()函數。
(記住這裏我們的send爲N)

sn()函數在文件/member/inc/inc_pwd_functions.php:
在這裏插入圖片描述
這裏發現還是要進行發郵箱驗證,繼續跟進newmail函數,看看是否可以不用驗證郵箱進行繞過。
在這裏插入圖片描述

else if ($send == 'N'){
	return ShowMsg('稍後跳轉到修改頁', $cfg_basehost.$cfg_memberurl."/resetpassword.php?dopost=getpasswd&id=".$mid."&key=".$randval);
}

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

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

漏洞驗證

通過分析代碼我們知道我們請求的地址是這樣了

http://192.168.5.149/DedeCMS-V5.7/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id={userid}

這裏我們註冊兩個個賬號:
賬號一 test 密碼 test 這是我們的目標賬號 id爲2
賬號二 secquan 密碼 secquan 這是我們的攻擊賬號 id爲3
在這裏插入圖片描述
在這裏插入圖片描述
這裏登錄了secquan的賬號 ,我們要重置目標id爲2的賬號,發送請求url,

http://192.168.5.149/DedeCMS-V5.7/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id=2

在這裏插入圖片描述
在這裏插入圖片描述
這裏直接返回了郵箱驗證裏的驗證碼

這時候我們再來請求修改頁URL:

http://192.168.5.149/DedeCMS-V5.7/uploads/member/resetpassword.php?dopost=getpasswd&id=2&key=ROivopAb

然後就可以直接重置密碼了。

這裏修改id的值即可修改對應的用戶的密碼。

但是這個漏洞存在一個缺陷,因爲通過分析可以看出來只有沒有設置安全問題的用戶纔會受此漏洞的影響;而且只能修改前臺用戶的密碼。

參考:
https://blog.csdn.net/Fly_hps/article/details/79845427
https://www.cnblogs.com/-qing-/p/10849028.html

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