鄭昀 創建於2015/5/19 最后更新於2015/8/7
關鍵詞:
Web安全、系統安全、Web開發、找回密碼、重置密碼
本文檔適用人員:廣義的技術人員
上一集:
安全基礎教育第一季:堡壘是從內部攻破的
提綱:
- 堡壘是從內部攻破的
- 員工無知者無畏
- 運維配置暴露細節
- 后台不設防
- 常犯常新,屢戰屢敗
- 找回密碼
- 圖形和短信驗證碼
- 平行權限
- MD5等於明文
- 處處留心皆學問
- 表單被篡改
- App被篡改
- 跨站請求偽造
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年的時候,你注冊一個網易郵箱,注冊成功后會跳轉到一個綁定手機的安全提示頁面:
![]() 目標網易郵箱成功被越權綁定了密保手機。 |
這就是平行權限漏洞,或者叫“越權”。
案例十:身份通
+郵箱找回密碼功能
++重置密碼的鏈接發送到了對應郵箱,鏈接如下:
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 整理的找回密碼常見弱點:
|
他的建議是:找回密碼憑證要足夠復雜並且不可猜測,任何校驗動作都放在服務器端進行,
傳輸的驗證參數要做好加密,同時對參數做好過濾。
|
就到這里。
參考文獻:
1,2015,烏雲知識庫,
密碼找回邏輯漏洞總結;
2,2014,鄭昀,
被小伙伴們蠢哭了的那些事兒:找回密碼篇;
3,2013,鄭昀,
Web開發基本准則-55實錄-Web訪問安全;
4,2012,鄭昀,
5·12和6·17兩知名網站域名被劫持事件實施過程回放;
5,2011,陳皓,
你會做Web上的用戶登錄功能嗎?;
6,2015,鄭昀,
安全基礎教育第一季:堡壘是從內部攻破的;
-EOF-
歡迎訂閱我的微信訂閱號『老兵筆記』,請掃描二維碼關注:
