安全基礎教育第二季第1集:屢戰屢敗的找回密碼

鄭昀 創建於2015/5/19 最後更新於2015/8/7
關鍵詞: Web安全、系統安全、Web開發、找回密碼、重置密碼

本文檔適用人員:廣義的技術人員
提綱:
  1. 堡壘是從內部攻破的
  • 員工無知者無畏
  • 運維配置暴露細節
  • 後臺不設防
  • 常犯常新,屢戰屢敗
  • 找回密碼
  • 圖形和短信驗證碼
  • 平行權限
  • MD5等於明文
  • 處處留心皆學問
  • 表單被篡改
  • App被篡改
  • 跨站請求僞造

0x00. 前言:

    第一季培訓主要宣導兩點,第一,白帽子或黑客都很有耐心,他手裏可能捏着你多個漏洞,他一直在等機會,他也有很多工具在掃在尋找機會,第二,一次成功的入侵滲透,並不需要是多麼高危的漏洞,幾個普普通通的中等漏洞,加上一次社會工程學行動,就可以殺進來。
    第二季主要講一下幾乎所有的 Web 工程師都容易犯的安全錯誤。有些事情你必須知道,並且身體力行,成爲你根深蒂固的開發習慣和思路,否則會重現這個地毯上剎車的悲劇。
 http://ww1.sinaimg.cn/bmiddle/62037b5ajw1ec0lxccvrbg20a305ve83.gif

0x01. 找回密碼:

    Web 站點的安全重災區就是找回密碼功能。很多工作了多年的 Web 開發工程師仍然意識不到這些基本安全原則:
  1. 客戶端提交的 HTTP Request 是不可信的,表單數據可能被篡改,驗證信息可能被仿冒;
  2. 客戶端展現的一切,服務器端發給客戶端的一切,一切信息,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-成功獲得土豆網域名管理權限
 
案例五:搜狐網
+網頁版找回密碼功能
++找回密碼時要回答“密碼提示問題”;但是工程師把答案明文寫在 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 值
++成功重置。
 
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 整理的找回密碼常見弱點:
  1. 密碼找回憑證太弱,如四位數字驗證碼,容易被爆破 
  2. 密碼找回憑證可以從客戶端、URL中直接獲取 
  3. 密碼找回憑證可以在網頁源代碼中直接獲取 
  4. 密碼找回的郵箱鏈接易猜解,如時間的md5 
  5. 跳過驗證步驟和找回方式,直接到設置新密碼頁面
  6. 密碼找回憑證存並非只是與單個用戶並綁定的問題
  7. 重置密碼時返回的 token 沒有與賬號以及驗證碼綁定
  8. 密碼找回的手機或郵箱可以從頁面獲取到,所以可以通過 firebug 修改 
  9. 提交新密碼時修改用戶ID爲其他用戶ID
  10. 找回密碼時沒有在服務器上驗證用戶名與郵箱是否匹配便發送了驗證碼
  11. 在本地驗證服務器的返回信息,確定是否執行重置密碼,但是其返回信息是可控的內容,或者可以得到的內容
  12. 發送短信等驗證信息的動作在本地進行,可以通過修改返回包進行控制
  13. 在找回密碼處存在注入漏洞
他的建議是:找回密碼憑證要足夠複雜並且不可猜測,任何校驗動作都放在服務器端進行,
傳輸的驗證參數要做好加密,同時對參數做好過濾。
就到這裏。
 
參考文獻:
1,2015,烏雲知識庫,密碼找回邏輯漏洞總結
 
-EOF-
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章