密碼重置漏洞那點(diǎn)事兒 -電腦資料

電腦資料 時(shí)間:2019-01-01 我要投稿
【m.clearvueentertainment.com - 電腦資料】

   

    密碼重置功能是一些常見漏洞的起因,

密碼重置漏洞那點(diǎn)事兒

。例如用戶名枚舉漏洞(數(shù)據(jù)庫(kù)中用戶名不存在和密碼錯(cuò)誤顯示不同的錯(cuò)誤信息),敏感信息泄露(把明文密碼通過e-mail發(fā)送給用戶)重置密碼消息劫持(攻擊會(huì)者接收到密碼重置信息)這些都是在密碼重置功能中比較常見的漏洞。

    很多開發(fā)者都不能真正了解密碼重置所能引發(fā)的危害,而這個(gè)博客文章告訴大家一些不遵守基本安全準(zhǔn)則的開發(fā)人員所開發(fā)的密碼重置功能會(huì)帶來哪些危害。

    舉個(gè)例子,一個(gè)健壯的密碼恢重置功能會(huì)生成一個(gè)令牌,并通過電子郵件發(fā)送一個(gè)包含令牌的重置密碼連接給用戶。

    令牌應(yīng)具有以下特征:

    包含64個(gè)字符或者更多

    唯一性

    隨機(jī)性

    一次性

    擁有較短壽命(比如在24小時(shí)內(nèi)到期)

    當(dāng)用戶點(diǎn)擊該鏈接時(shí),應(yīng)用程序必須檢查令牌是否有效。

    如果令牌有效,應(yīng)用程序必須注銷這個(gè)令牌,以便它不能被重用,并允許用戶更改自己的密碼。

    此外,如果用戶試圖第二次重置密碼,在完成第一次重置過程之前,應(yīng)用程序必須廢止舊的密碼重置請(qǐng)求并生成一個(gè)新的重置請(qǐng)求。

    為了提高安全性,也可以使用雙重的用戶身份認(rèn)證(但并不是必須使用)。

    比如,要求用戶回答之前填寫的隱私問題(比如我的大姨媽的名字是神馬)或確認(rèn)發(fā)送到用戶手機(jī)的驗(yàn)證碼。

    現(xiàn)在,讓我們分析一個(gè)真實(shí)的并且設(shè)計(jì)的很糟糕的密碼恢復(fù)系統(tǒng),列舉出所有相關(guān)的安全漏洞,并嘗試編寫POC

   

    2:

    3: /* generates a new random password */

    4: function generatePassword() {

    5:   $chars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9");

    6:   for ($i = 0; $i < 10; $i++){

    7:      $password .= $chars[rand(0,35)];

    8:   }

    9:   return $password;

    10: }

    11:

    12: /* send the new password to the user e-mail and update the database */

    13: if ($_REQUEST['mail']) {

    14:   $con = new Connection();

    15:   $con->sql = " SELECT usr_user.id,

    16:           usr_user.name,

    17:           usr_user.email,

    18:           usr_user.password

    19:         FROM usr_user

    20:         WHERE usr_user.email = '" . $_REQUEST['mail'] . "'

    21:         ORDER BY id DESC ";

    22:   $res = $con->executeQuery();

    23:   if (is_array($res)){

    24:      $usr = $res[0];

    25:      $password = generatePassword();

    26:      $con->sql = "UPDATE usr_user SET password = MD5(trim('".$password."')) WHERE email = '" . $_REQUEST['mail'] . "' ";

    27:      $con->executeQuery();

    28:

    29:      /* headers */

    30:      $headers = "MIME-Version: 1.0\r\n";

    31:      $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";

    32:

    33:      /* aditional headers */

    34:      $headers .= "To: " . $usr->name . " <" .="" 35:="" headers="" 36:="" 37:="" message="" body="" 38:="" html="" 39:="" usr-="">name . '';

    40:      $html .= '';

    41:      $html .= '';

    42:      $html .= '

    ';

    43:      $html .= '';

    44:

    45:      /* Send e-mail to user with his new password

    46:      if (mail($_REQUEST['mail'], "Your new administrative password", $html, $headers)){

    47:        $message = "Your new password was sent to: " . $_REQUEST['mail'];

    48:        $success = true;

    49:      }

    50:   } else {

    51:      $message = "The provided e-mail is invalid";

    52:      $success = false;

    53:   }

    54:

    55: }

    56:

    57: ?>

    (1)用戶名枚舉

    最明顯的漏洞就是用戶名枚舉漏洞,用戶提交一個(gè)郵箱地址,如果郵箱存在那么,系統(tǒng)會(huì)返回一條信息

    "Your new password has been sent to: LanLan@wyl.com"

    如果該郵箱沒有被人注冊(cè),那么系統(tǒng)將返回

    "The provided e-mail is invalid"

    (2)拒絕服務(wù)

    第二個(gè)漏洞應(yīng)該是拒絕服務(wù)

    這個(gè)系統(tǒng)中有一個(gè)生成隨機(jī)密碼的函數(shù),攻擊者可以編寫一個(gè)腳本來不斷嘗試重置密碼過程(原文中給出15秒每次,懷疑頻率是否有點(diǎn)低)

    另外,如果配合用戶名枚舉漏洞的話,這個(gè)漏洞會(huì)產(chǎn)生更大的危害,可以用來更改任意用戶的密碼,

電腦資料

密碼重置漏洞那點(diǎn)事兒》(http://m.clearvueentertainment.com)。(雖然你收不到該密碼,但也可以給用戶產(chǎn)生不小的麻煩)

    (3)敏感信息泄露

    第三個(gè)漏洞是敏感信息泄露,因?yàn)樵撓到y(tǒng)使用明文把密碼通過郵件發(fā)送給用戶,并且沒有在用戶下次登錄的時(shí)候

    強(qiáng)制用戶修改密碼。如果攻擊者獲取了用戶的郵件信息(其實(shí)這個(gè)也不算特別容易),就可以通過郵件中的密碼登錄系統(tǒng)。

    (4)SQL 注入

    第四個(gè)注入漏洞也比較明顯,用戶提交的數(shù)據(jù)沒有經(jīng)過過濾直接代入查詢語句,利用方式也有很多種。這樣構(gòu)造可以改掉所有用戶的密碼,也可以用來造成拒絕服務(wù)攻擊。

    Input: ’ or 1=1%23

    First SQL becomes (Line 15): SELECT usr_user.id, usr_user.name, usr_user.email, usr_user.password FROM usr_user WHERE usr_user.email = ’’ or 1=1#’ ORDER BY id DESC

    Second SQL becomes (Line 26): UPDATE usr_user SET password = MD5(trim(‘xxxxxxxxxx’)) WHERE email like ’’ or 1=1#’

    這個(gè)注入點(diǎn)還可以用來進(jìn)行盲注來猜測(cè)一些敏感信息。

    (5)跨站腳本漏洞

    第五個(gè)漏洞也可以很明顯的找到,用戶輸入的mail參數(shù)被帶入到了郵件內(nèi)容中(沒有經(jīng)過任何過濾),這個(gè)漏洞的利用需要配合

    SQL 注入漏洞來使用

    User Input: ’ or 1=1%23

    First SQL becomes (Line 15): SELECT usr_user.id, usr_user.name, usr_user.email, usr_user.password FROM usr_user WHERE usr_user.email = ’’ or 1=1#‘ ORDER BY id DESC

    Second SQL becomes (Line 26): UPDATE usr_user SET password = MD5(trim(‘xxxxxxxxxx’)) WHERE email like ’’ or 1=1#‘

    Response Message (Line 47): Your new password was sent to: ’ or 1=1#

    提交上述數(shù)據(jù),系統(tǒng)首先會(huì)修改所有用戶的密碼,然后給所有用戶發(fā)送包含惡意腳本的文件

    (6)密碼重置信息劫持

    最后一個(gè)漏洞是密碼重置信息劫持,也是危害比較嚴(yán)重的漏洞。產(chǎn)生原因是,用戶提交數(shù)據(jù)mail(又是這貨)被包含到了MIME頭中,這個(gè)漏洞的利用同樣需要配合SQL注入:

    User Input: LanLan@wyl.com%00’ or 1=1%23

    First SQL becomes (Line 15): SELECT usr_user.id, usr_user.name, usr_user.email, usr_user.password FROM usr_user WHERE usr_user.email = ’LanLan@wyl.com[null byte char]’ or 1=1#’ ORDER BY id DESC

    Second SQL becomes (Line 26): UPDATE usr_user SET password = MD5(trim(‘xxxxxxxxxx’)) WHERE email like ’LanLan@wyl.com[null byte char]’ or 1=1#’

    MIME Header becomes (Line 34): To: John Smith

    執(zhí)行上面的代碼的結(jié)果就是所用用戶密碼被修改,修改后的郵件會(huì)被發(fā)送到LanLan@wyl.com,這里[null byte char]會(huì)截?cái)鄊ini頭中的信息

    最近Freebuf上發(fā)過一個(gè)郵件注入的帖子,感覺可以在這種情況下加以利用),但是我覺得在很多數(shù)據(jù)庫(kù)中[null byte char]也會(huì)截?cái)嗖樵,這里沒有進(jìn)行測(cè)試,有興趣的同學(xué)可以測(cè)試一下

    Hope you enjoy!

    Keep Hacking!原文地址:http://www.freebuf.com/articles/web/21214.html

最新文章