標籤:
鄭昀 建立於2015/5/19 最後更新於2015/8/7 關鍵詞: Web安全、系統安全、Web開發、找回密碼、重設密碼 本文檔適用人員:廣義的技術人員 提綱:
- 堡壘是從內部攻破的
- 常犯常新,屢戰屢敗
- 找回密碼
- 圖形和簡訊驗證碼
- 平行許可權
- MD5等於明文
- 處處留心皆學問
0x00. 前言: 第一季培訓主要宣導兩點,第一,白帽子或駭客都很有耐心,他手裡可能捏著你多個漏洞,他一直在等機會,他也有很多工具在掃在尋找機會,第二,一次成功的入侵滲透,並不需要是多麼高危的漏洞,幾個普普通通的中等漏洞,加上一次社交工程學行動,就可以殺進來。 第二季主要講一下幾乎所有的 Web 工程師都容易犯的安全錯誤。有些事情你必須知道,並且身體力行,成為你根深蒂固的開發習慣和思路,否則會重現這個 地毯上刹車的悲劇。 0x01. 找回密碼: Web 網站的安全重災區就是找回密碼功能。很多工作了多年的 Web 開發工程師仍然意識不到這些基本安全原則:
- 用戶端提交的 HTTP Request 是不可信的,表單資料可能被篡改,驗證資訊可能被仿冒;
- 用戶端展現的一切,伺服器端發給用戶端的一切,一切資訊,GET/POST參數,HTML/JS/Cookies,都可以被白帽子看到,毫無秘密可言;
- 靠 JavaScript 在用戶端校正,第一白帽子可以在瀏覽器跟蹤調試 JS,看懂你的演算法,第二設定斷點修改堆棧參數,所以靠伺服器端校正才是硬道理。
- 白帽子也是程式員,第一他可以把各種漏洞掃描規則寫成程式定時掃描深度廣度遍曆,你的網站今天上了一個漏洞,明天他可能就知道了,第二他可以發起字典窮舉式暴力密碼破解攻擊,換 IP 對他們來說是小菜一碟。所以,打一開始你就必須有防範措施,圖形驗證碼,rate limiter,Form Token,簽名……
- 安全問題往往是多個不起眼的小問題疊加在一起導致的,所以不要覺得這個問題無所謂那個問題小意思,想不修複就不修複,最後千裡之堤潰於蟻穴。
1.1.你看不見,你看不見:掩耳盜鈴式的開發人員 你敢保證你不會做出下面這種事情嗎?
案例一:PPS +網頁版忘記密碼功能: ++貼心地實現了“重新發送找回密碼郵件”功能。不幸的是,在 URL 裡, 用來內送郵件的 email 參數是明文的,WTF?! ++從而可以將任意使用者的密碼重設郵件發給指定郵箱。 圖1 找回密碼篇-案例1 圖2 找回密碼篇-案例1-把email參數改一下,改成我的郵箱,uid不變
案例二:拉手網 +App 裡的忘記密碼功能: ++首先,通過抓包分析,發現密碼重設介面也可以 Web 存取;其次,填入手機號碼提交,伺服器端的響應中, 居然包含明文簡訊驗證碼,雖然是在 JavaScript 中的注釋裡,當我看不見啊? 圖3 找回密碼篇-案例2 ++此事絕非個案。如 第三方支付平台支付通也幹過。
案例三:走秀網 +走秀網團購的忘記密碼功能 ++點擊忘記密碼,選擇輸入手機號碼重設,點擊擷取驗證碼,用 firebug 注意觀察 瀏覽器發出的 AJAX 請求,驗證碼即將出現,神啊: 圖4 找回密碼篇-案例3 ++直接輸入此驗證碼即可重設密碼了。
案例四:驚天大案,新網互聯 +網頁版忘記密碼功能 ++頁面上雖然展示的是星號遮擋的郵箱地址,很貼心,但 HTML 文檔構造的表單參數裡卻使用郵箱明文字串,最終導致2013年5月12日馬鈴薯網網域名稱被劫持,釀成國際知名大案: 圖5 找回密碼篇-案例4 圖6 找回密碼篇-案例4-白帽子有專用工具,找到關鍵詞很容易 圖7 找回密碼篇-案例4-改表單參數從新提交 圖7-1 找回密碼篇-案例4-成功獲得馬鈴薯網網域名稱系統管理權限 ++類似案例還有: WooYun:和訊網修改任意使用者密碼漏洞。
案例五:搜狐網 +網頁版找回密碼功能 ++找回密碼時要回答“密碼提示問題”;但是工程師 把答案明文寫在 textarea 控制項的 JS 校正函數裡了,暈倒,工程師真是單純; ++從而可以重設任意搜狐使用者密碼; 圖8 找回密碼篇-案例5
案例六:中興某站 +網頁版找回密碼功能 ++發送到郵箱裡的重設密碼連結上,Token 一看就是時間戳記,精確到秒,因此可以輕易構造; 圖9 找回密碼篇-案例6
1.2.你能看見,那我 MD5 一下你就看不見了:Too young too naive 的開發人員 有些工程師看的入門教材可能版本太老,內容過時,所以總以為 MD5() 是神器,殊不知在 MD5 爆破庫面前等同於明文。
案例七:奇虎360 +網頁版找回密碼功能: ++360的找回密碼郵件裡,重設密碼地址格式為:http://i.360.cn/findpwd/setpwdfromemail?vc=%
一個MD5加密串%&u=blabla%40gmail.com; ++利用 MD5 爆破庫逆向解密後發現,這個 MD5 加密串是一個類似於 1339744000 的數字,很像是UNIX時間戳記; ++白帽子進一步驗證後猜測,使用者找回密碼時,系統將此時的UNIX時間戳記,與帳號綁定,記錄在密碼重設隊列裡,修改該使用者的密碼時會驗證輸入的 vc 參數; ++看似合理,但360工程師忽略了一個細節:假如這個時間戳記是新產生的,攻擊者就能在一定時間段內進行暴力破解,給定任意郵箱,很快就能算出一個有效重設密碼連結; 圖10 找回密碼篇-案例7-MD5(timestamp)
案例八:途牛網 +註冊啟用郵件功能: ++註冊某牛網後,系統發的註冊郵件裡,啟用URL裡,id參數實際上是使用者的userid,可以遍曆,str參數則是MD5(id)加密串,如所示; 圖11 找回密碼篇-案例8-整數userid,MD5(userid) 圖12 找回密碼篇-案例8-密文輸入MD5爆破庫立刻得到明文真值 ++從而能註冊任意郵箱並啟用,或遍曆所有整數id啟用。
案例九:新浪二手房 +網頁版找回密碼功能: ++點擊忘記密碼,隨意輸入一個使用者名稱後,通過 firebug 觀察 AJAX 資料包,注意到伺服器端返回了一個 JSON 串,很明顯是一個手機號碼,被 MD5 了一把: 圖13 找回密碼篇-案例9-ajax返回了使用者名稱對應的手機號,MD5等同於明文 ++在手機號碼輸入框裡輸入解密後的號碼,焦點移開後,瀏覽器發起了一個 AJAX 請求去擷取數字驗證碼(這是神馬邏輯?WTF!) 圖14 找回密碼篇-案例9-好吧,數字驗證碼也是MD5了一把 ++MD5 爆破庫面前,統統都是明文,於是得到數字驗證碼為 234589,輸入後成功重設密碼。
1.3.眼裡只有 Token:Too young too naive 的開發人員 有些工程師確實單純,他們做各種業務情境都可能引入平行許可權漏洞。在他們的眼裡,在伺服器端校正一下輸入參數 checkcode 或 token 或 vi 參數,就已經很了不起了,校正過了,幹啥都行,所以 Token 雖然是頒發給使用者 A 的,但可以改使用者 B 的資料。 什麼是平行許可權漏洞? 我舉一個栗子。
2012年的時候,你註冊一個網易郵箱,註冊成功後會跳轉到一個綁定手機的安全提示頁面: 注意連結參數裡的 uid,將它改為其他人的網易郵箱地址,在頁面上輸入你可控的手機號,提交。 目標網易郵箱成功被越權綁定了密保手機。 |
這就是平行許可權漏洞,或者叫“越權”。
案例十:身份通 +郵箱找回密碼功能 ++重設密碼的連結發送到了對應郵箱,連結如下: http://www.idtag.cn/regionTempAction.do?method=resetPassword&idtagCard=使用者ID值&authcode=Go8K7yp4TWy&rtEmail=郵箱地址 ++抓包後,看到類似於的真值: org.apache.struts.taglib.html.TOKEN=83accc27d5178f832d9f22a1d02bdacf&org.apache.struts.taglib.html.TOKEN=83accc27d5178f832d9f22a1d02bdacf&rtPassword=123456&passwordw=123456&rtEmail=郵箱&idtagCard=使用者ID ++Token 不變,試著改一下使用者ID,再次提交請求,哇,成功重設密碼: 圖15 找回密碼篇-案例10
案例十一:OPPO +使用綁定手機號碼下發短驗找回密碼功能 ++走正常流程,輸入收到的短驗和新密碼提交,抓包,checkcode不變,將使用者名稱改為任意賬戶,再次提交,成功重設密碼; 圖16 找回密碼篇-案例11
案例十二:攜程旅行網 +使用郵箱重設密碼功能 ++點擊系統發送到郵箱的重設密碼連結,重設密碼並抓包: 圖17 找回密碼篇-案例12 圖18 找回密碼篇-案例12-發現Uid一枚 ++是的,在 POST 資料中發現標識使用者身份的 Uid 參數,而這個 Uid 在密碼重設的第二步時,系統會“主動”提供給我們(注意看圖17); ++我們用 firefox 的外掛程式 LiveHTTPHeaders,利用它的修改 POST 表單參數並重放功能,修改 Uid,提交表單; ++成功重設另一個使用者的密碼。
1.4.信任用戶端校正的小朋友,你危險了 白帽子有很方便的工具可以調試,可以攔截 Response,可以重放,這個用戶端不僅僅指瀏覽器,還包括手機 App。
案例十三:樂蜂網 +使用手機號找回密碼功能; ++進入樂峰網供應商管理系統,點擊忘記密碼,輸入使用者名稱 admin,選擇手機找回密碼,隨意填寫一個短驗,然後點擊下一步,此時抓包: 圖19 找回密碼篇-案例13-隨便寫一個驗證碼填進去 圖20 找回密碼篇-案例13-截斷返回的資料包 ++經過反覆測試,將中的返回碼,改成 102 即可繞過,伺服器端響應後,直接跳轉到重設密碼頁面: 圖21 找回密碼篇-案例13-修改 Body 值 ++成功重設。 類似案例還有: WooYun:oppo重設任意使用者密碼漏洞(4)。
1.5.玩 Cookie 玩砸了的小朋友 白帽子都身經百戰,跟各種互連網公司的各種層次攻城獅鬥智鬥勇,所以他們都總結了很多種突破模式。其中一種就是會話覆蓋,專門盯著那些喜歡把亂七八糟東西儲存在 Cookie 裡的小朋友。
案例十四:聚美優品 +使用郵箱找回密碼功能; ++1,用瀏覽器找回你自己的聚美優品帳號的密碼,選擇驗證身份方式為郵箱; ++2,你的郵箱會收到一封郵件,但不要點擊那個重設密碼連結,但你可以注意到這個連結上沒有帳號資訊參數; ++3,同一個瀏覽器繼續使用找回密碼功能,這次找回目標使用者的密碼,但到了下面這個步驟後就停住: 圖21 找回密碼篇-案例14 ++4,仍在同一個瀏覽器裡,(否則就不靈了),開啟第二步裡我們收到的那個重設密碼連結: 圖22 找回密碼篇-案例14 ++5,填寫新密碼,提交,okay,成功重設了目標使用者的聚美優品密碼: 圖23 找回密碼篇-案例14 圖24 找回密碼篇-案例14-搞定
1.6.不做 Rate Limiting 就是愚蠢 關鍵業務不做提交頻次閾值防範,就是愚蠢,就等著被別人爆破吧。
參考案例,WooYun: 噹噹網任意使用者密碼修改漏洞,還有的做了頻次限制但是被繞過的經典案例,WooYun: 任意使用者密碼修改漏洞,它限制了提交次數,但是存在邏輯問題,在手機號字串後放一些字元就可以繞過。
好了,大致就是這麼多案例,我們複習一下:
- 用戶端提交的資訊,用戶端儲存的資訊,都可能是經過篡改的;
- 白帽子是程式員,他們有很多工具,可以很方便地找到漏洞、篡改資料並重放;
- 整數ID是可以遍曆的;
- MD5加密串是可以反向爆破的;
- JS 校正是不大靠得住的,可以繞過;
- 每一個互連網網站都有的找回密碼功能,看似簡單,但對於 Web 開發工程師來說,沒那麼容易,它能考察出你是一個什麼樣的工程師,你未來能走多遠。
最後借用烏雲知識庫的 BMa 整理的找回密碼常見弱點:
- 密碼找回憑證太弱,如四位元字驗證碼,容易被爆破
- 密碼找回憑證可以從用戶端、URL中直接擷取
- 密碼找回憑證可以在網頁原始碼中直接擷取
- 密碼找回的郵箱連結易猜解,如時間的md5
- 跳過驗證步驟和找回方式,直接到設定新密碼頁面
- 密碼找回憑證存並非只是與單個使用者並綁定的問題
- 重設密碼時返回的 token 沒有與帳號以及驗證碼綁定
- 密碼找回的手機或郵箱可以從頁面擷取到,所以可以通過 firebug 修改
- 提交新密碼時修改使用者ID為其他使用者ID
- 找回密碼時沒有在伺服器上驗證使用者名稱與郵箱是否匹配便發送了驗證碼
- 在本地驗證伺服器的返回資訊,確定是否執行重設密碼,但是其返回資訊是可控的內容,或者可以得到的內容
- 傳送簡訊等驗證資訊的動作在本地進行,可以通過修改返回包進行控制
- 在找回密碼處存在注入漏洞
|
他的建議是:找回密碼憑證要足夠複雜並且不可猜測,任何校正動作都放在伺服器端進行, 傳輸的驗證參數要做好加密,同時對參數做好過濾。 |
就到這裡。
參考文獻: 1,2015,烏雲知識庫, 密碼找回邏輯漏洞總結; 2,2014,鄭昀, 被小夥伴們蠢哭了的那些事兒:找回密碼篇; 3,2013,鄭昀, Web開發基本準則-55實錄-Web訪問安全; 4,2012,鄭昀, 5·12和6·17兩知名網站網域名稱被劫持事件實施過程回放; 5,2011,陳皓, 你會做Web上的使用者登入功能嗎?; 6,2015,鄭昀, 安全基礎教育第一季:堡壘是從內部攻破的; -EOF-
安全基礎教育第二季第1集:屢戰屢敗的找回密碼