《安全攻防技能30講》是極客時間上的一個關於Web安全的專欄,在學習之后特在此做記錄和總結。
一、安全基礎概念
先和你聊聊安全本身,以幫你建立整體的大局觀。安全的本質就是保護數據被合法地使用。
1)安全原則
CIA 三元組原則,是安全領域內最基礎也最重要的原則。
(1)機密性(Confidentiality)用一句話來說就是,確保數據只被授權的主體訪問,不被任何未授權的主體訪問。簡單用一個詞總結就是“不可見”。
(2)完整性(Integrity)就是確保數據只被授權的主體進行授權的修改,簡單來說,就是“不可改”。
(3)可用性(Availability)就是確保數據能夠被授權的主體訪問到 ,簡單來說,就是“可讀”。
2)黃金法則
黃金法則主要包含三部分:認證(Authentication)、授權(Authorization)、審計(Audit)。這三部分其實是一種串聯的關系,它描述的其實是用戶在使用應用過程中的生命周期:先進行登錄、再進行操作、最后留下記錄。
(1)認證其實包括兩個部分:身份識別和認證。身份識別強調的是主體如何聲明自己的身份,而身份認證強調的是,主體如何證明自己所聲明的身份是合法的。比如說,當你在使用用戶名和密碼登錄的過程中,用戶名起到身份識別的作用,而密碼起到身份認證的作用。
(2)除了對“你能做什么”進行限制,授權機制還會對“你能做多少”進行限制。比如,手機流量授權了你能夠使用多少的移動網絡數據。最原始和最安全的授權機制,一定是你的每一次操作,都經過了管理人員的審批和確認。
(3)當你在授權下完成操作后,安全需要檢查一下“你做了什么”,這個檢查的過程就是審計。當發現你做了某些異常操作時,安全還會提供你做了這些操作的“證據”,讓你無法抵賴,這個過程就是問責。
大部分情況下,事前防御屬於認證,事中防御屬於授權,事后防御屬於審計。
3)密碼學
(1)對稱加密,代表加密和解密使用的是同一個密鑰。經典的對稱加密算法有 DES、IDEA、AES、國密 SM1 和 SM4。
(2)非對稱加密代表加密和解密使用不同的密鑰。具體的加解密過程就是,發送方使用公鑰對信息進行加密,接收方收到密文后,使用私鑰進行解密。經典的非對稱加密算法包括:RSA、ECC 和國密 SM2。
(3)散列算法應該是最常見到的密碼學算法了。大量的應用都在使用 MD5 或者 SHA 算法計算一個唯一的 id。
4)身份認證
身份認證可以分為兩個部分:對外認證和對內認證。對外認證,其實就是應用的登錄注冊模塊,它面向用戶進行認證。
除了應用本身需要有登錄注冊的模塊,應用的各種內部系統同樣需要涉及登錄認證的功能,比如:服務器的登錄、數據庫的登錄、Git 的登錄、各種內部管理后台的登錄等等。這也就是我所說的對內認證。
對外認證是單一場景下的認證,對內認證是多場景下的認證。
當賬號體系變得越來越復雜時,如何對這些賬號進行統一的管理,是解決身份認證問題的關鍵。而單點登錄(Single Sign On,SSO)就是一個非常有效的解決方案。
單點登錄的概念很簡單:用戶只需要進行一次認證,就可以訪問所有的網頁、應用和其他產品了。CAS 是一個開源的單點登錄框架,它不屬於某一種單點登錄的實現方式,而是提供了一整套完整的落地方案。
5)訪問控制
“授權”和“訪問控制”其實是同一個概念,都是允許或者禁止某個用戶做某件事情。
一個主體請求一個客體,這個請求的授權由訪問控制來完成。例如在用戶去讀取文件的過程中,用戶是主體,讀取這個操作是請求,文件是客體。
(1)主體:請求的發起者。主體可以是用戶,也可以是進程、應用、設備等任何發起訪問請求的來源。
(2)客體:請求的接收方,一般是某種資源。比如某個文件、數據庫,也可以是進程、設備等接受指令的實體。
(3)請求:主體對客體進行的操作。常規的是讀、寫和執行,也可以進一步細分為刪除、追加等粒度更細的操作。
常見的訪問控制機制有 4 種:DAC、role-BAC、rule-BAC、MAC。
(1)DAC(Discretionary Access Control,自主訪問控制)。DAC 就是讓客體的所有者來定義訪問控制規則。
你想要從圖書館中拿走一本書。這個時候,管理員說,“你經過這本書的所有人同意了嗎?”這個過程就是 DAC。
(2)role-BAC(role Based Access Control,基於角色的訪問控制)。role-BAC 就是將主體划分為不同的角色,然后對每個角色的權限進行定義。
當你想借書的時候,管理員說,“你是學生嗎?”這個過程就是 role-BAC。
(3)rule-BAC(rule Based Access Control,基於規則的訪問控制)。rule-BAC 就是制定某種規則,將主體、請求和客體的信息結合起來進行判定。
有一點需要我們注意,需要定義是“默認通過”還是“默認拒絕”。即當某次請求沒有命中任何一條規則時,我們是應該讓它“通過”還是“拒絕”呢?
如果你想要在圖書館借書,管理員會說,“根據規定,持有閱覽證就可以借書。”
(4)MAC(Mandatory Access Control,強制訪問控制)。MAC 是一種基於安全級別標簽的訪問控制策略。
在互聯網中,主體和客體被划分為“秘密、私人、敏感、公開”這四個級別。MAC 要求對所有的主體和客體都打上對應的標簽,然后根據標簽來制定訪問控制規則。
當你在圖書館排隊借書的時候,聽到管理員說:“初中生不能借閱高中生的書籍。”這就是一種強制訪問控制。
相比較來說,DAC 是所有者對客體制定的訪問控制策略,role-BAC 是管理員對主體制定的訪問控制策略,而 rule-BAC 可以說是針對請求本身制定的訪問控制策略。
二、Web安全
在 Web 安全這個模塊中,我們所談論的 Web,是指所有基於 HTTP 或者其他超文本傳輸協議(RPC 等)開發的應用,包括:網頁、App、API 接口等等。這類應用的共同點是:通過 HTTP 等文本協議,在客戶端和服務端之間進行數據交換。客戶端需要將服務端傳出的數據展示渲染出來,服務端需要將客戶端傳入的數據進行對應的處理。而 Web 安全所涉及的正是這些應用中存在的各類安全問題。
“Web 安全”涉及的主要內容梳理成了一張表格,你可以利用它來及時回顧。
1)XSS
通過給定異常的輸入,黑客可以在你的瀏覽器中,插入一段惡意的 JavaScript 腳本,從而竊取你的隱私信息或者仿冒你進行操作。這就是 XSS 攻擊(Cross-Site Scripting,跨站腳本攻擊)的原理。
2)SQL注入
黑客會通過構造一些惡意的輸入參數,在應用拼接 SQL 語句的時候,去篡改正常的 SQL 語意,從而執行黑客所控制的 SQL 查詢功能。這個過程,就相當於黑客“注入”了一段 SQL 代碼到應用中。這就是我們常說的 SQL 注入。
3)CSRF/SSRF
黑客編寫帶有惡意 JavaScript 腳本的網頁,通過“釣魚”的方式誘導你訪問。然后,黑客會通過這些 JavaScript 腳本竊取你保存在網頁中的身份信息,通過仿冒你,讓你的瀏覽器發起偽造的請求,最終執行黑客定義的操作。而這一切對於你自己而言都是無感知的。這就是 CSRF(Cross-Site Request Forgery,跨站請求偽造)攻擊。
用戶在瀏覽器中輸入一個 URL(比如某個圖片資源),然后服務端會向這個 URL 發起請求,通過訪問其他的服務端資源來完成正常的頁面展示。這個時候,只要黑客在輸入中提交一個內網 URL,就能讓服務端發起一個黑客定義的內網請求,從而獲取到內網數據。這就是 SSRF(Server Side Request Forgery,服務端請求偽造)的原理。
4)反序列化漏洞
應用在輸出某個數據的時候,將對象轉化成字符串或者字節流,這就是序列化操作。反序列化操作也就是應用將字符串或者字節流變成對象。
在數據轉換成對象的過程中,應用需要根據數據的內容,去調用特定的方法。而黑客正是利用這個邏輯,在數據中嵌入自定義的代碼(比如執行某個系統命令)。應用對數據進行反序列化的時候,會執行這段代碼,從而使得黑客能夠控制整個應用及服務器。這就是反序列化漏洞攻擊的過程。
5)信息泄露
避免錯誤信息泄露代碼邏輯,一方面是要通過正確地配置文件,避免錯誤信息被展示到前端;另一方面是要對錯誤信息進行檢測,這里就需要用到“黑盒”檢測了。
所謂“黑盒(Black Box Testing,功能測試)”,就是在不獲取代碼的情況下,直接運行應用,然后對應用的請求和響應進行掃描。比如,在錯誤信息泄露的場景中,“黑盒”檢測可以向應用發起一些必然會導致錯誤的請求(比如上述例子中的單引號),然后觀察應用是返回完整的錯誤日志,還是返回某些經過處理的頁面。
除了錯誤信息之外,間接的信息泄露方式還有兩種:返回信息泄露和注釋信息泄露。
使用一種叫作“白盒”的代碼檢測方法,來避免關鍵的注釋信息出現在線上的代碼中。
所謂“白盒(White Box Testing,結構測試)”,即直接獲取到線上的源代碼,然后對它進行掃描。“白盒”掃描注釋信息的原理比較簡單,因為每一種語言的注釋都會帶有特殊的標記(比如 Java 和 PHP 中的 /* 等),可以比較准確地被識別出來。
返回信息過於明確不算是代碼層面的漏洞,更多的是產品層面的漏洞。因此,理論上沒有任何技術手段能夠對這種漏洞進行檢測,只能依靠人為的分析審計來避免。解決方案也比較簡單,直接將返回信息模糊化、統一化即可。比如在登錄的場景中,我們可以將兩種登錄失敗的返回信息,統一修改為“用戶名不存在或密碼錯誤”。
信息泄露最普遍的方式還是直接泄露 。這里我會講兩種常見的直接泄露方式。
(1)第一種泄露方式與版本管理工具中的隱藏文件有關。通過版本管理工具(比如 SVN 和 Git),你能夠很方便地進行代碼回滾、備份等操作。
(2)除此之外,還有一種最常見、也最不容易注意的泄露方式,那就是上傳代碼到 GitHub 上。
我們可以從以下幾個方面進行防護:
(1)屏蔽信息:通過技術手段,將不該被訪問的資源進行屏蔽,從而避免信息泄露的產生;
(2)代碼檢測:從“白盒”和“黑盒”兩個方向,對代碼、應用等進行檢測,對可能的泄露進行預警;
(3)人工審計:對於非技術原因造成的泄露,加強人工審計的工作。同時從公司制度上,去提高員工的安全意識。
6)插件漏洞
我准備了幾個問題,你可以看看自己是否對所用的插件了如指掌。
(1)你所使用的所有插件的版本是什么?(包括前端和后端,直接引用和間接引用)
(2)你所使用的這些插件,是否存在漏洞,是否不被維護了,是否被廢棄了?
(3)你所使用的這些插件,會在哪些地方發布更新信息和漏洞信息?
(4)你所使用的這些插件,是否會定期更新?
(5)你是否會對更新插件進行完整的測試?
(6)你所使用的這些插件,在安全方面,有哪些配置需要關注?
“0 day”,即在插件發布修復漏洞的安全補丁之前,黑客就已經知道漏洞細節的漏洞。換一句話說,“0 day”就是只有黑客知曉的未公開漏洞。
因為只有黑客知道這個漏洞,而我們連這個漏洞是什么都不知道,所以“0 day”幾乎無法防御。除此之外,“0 day”還具備極高的攻擊有效性,可以說只要應用使用了對應的插件,黑客幾乎“戰無不勝”。
建立插件漏洞的防護體系。
(1)第一步:整理插件,剔除無用插件。
(2)第二步:管理插件補丁更新。
(3)第三步:使用公開漏洞庫。
三、業務安全
1)業務安全體系
黑產是基於正常的業務產品邏輯,采取非正常或者批量的操作,來獲取利益的行為。業務安全就是通過各類產品策略,來對黑產進行識別和攔截,從而保障業務的正常運行。
在業務安全中,業內普遍將攻擊者稱為“黑產”。之所以會改換一個名稱,我認為主要有兩點原因。
(1)第一,“黑產”強調的是“產業化”。
(2)第二,黑客強調的是技術對抗,而“黑產”更看重資源對抗。
在基礎安全中,我們說過應用的本質是數據,安全的本質是數據的 CIA,我們可以通過黃金法則來保護數據。而業務安全的本質就是保障用戶價值不受黑產的惡意影響。保障的方法就是提高黑產的資源成本,使得黑產無法獲利。
一般來說,黑產會從四個方面進行資源投入,分別是:用戶資源、IP 資源、設備資源和操作資源。
(1)對於用戶資源的對抗,目前主要的方式就是黑名單。
(2)黑產會利用“秒撥 IP”來獲取大量 IP 資源。所謂“秒撥”,就是指每一次撥號上網,都會分配一個新的 IP 給我們。
(3)很多黑產案件中都會出現由大量手機設備組成的“手機牆”。除此之外,也有上游團隊將手機做成雲控模式,下游黑產可以直接花錢購入可遠程操控的真實手機設備。
(4)黑產會嘗試使用一些自動化的工具,比如按鍵精靈,讓機器來完成游戲的過程。我們和操作資源的對抗,就是在和黑產的自動化工具進行對抗。
2)產品安全方案
我對業務安全中 IPDRR 內容的重點講解。
(1)Identify(識別):和基礎安全一樣,業務安全的識別階段主要是進行威脅評估的工作。我們需要找到黑產可能獲取到的業務邏輯中的投入成本,比如,應用發放的紅包、優惠券等。
(2)Protect(保護):在業務安全中,我們是通過產品方案來實施認證和授權過程的。比如,對於登錄過程增加雙因子認證和驗證碼等,就是加強認證的安全性。
(3)Detect(檢測):檢測階段主要是風控系統發揮作用。
(4)Respond(響應):發現黑產的攻擊后,我們可以通過封禁賬號、攔截操作、拒絕提現等方式,來阻止黑產獲取利益。
(5)Recover(恢復):最后就是對整個系統進行恢復了。在業務安全中,黑產可能已經盜取了某些賬號,或者已經領取了部分紅包。這時,我們就需要通過合適的運營機制,將賬號返回給原用戶,把紅包退回到獎金池中。
提升應用安全性的產品方案還有很多。例如:
(1)在邀約活動中,我們可以適當增加用戶任務的難度,如必須連續活躍三天用戶才能得到收益;
(2)在抽獎活動中,我們可以增加參與抽獎的門檻,如必須是注冊一個月以上的老用戶才能參加;
(3)在排行榜活動中,我們可以將排行榜的計算規則隱藏,讓黑產摸不清刷的方式。
3)風控系統
風控系統就是從業務數據中挖掘出黑產行為的數據分析系統。
產品方案屬於事前的防控,是從根本上提高黑產操作的成本;風控系統屬於事中的防控,是在檢測到黑產行為時才進行攔截。
一個完整的風控流程還需要人工進行數據分析、處理用戶投訴、監控輿情,並采取應急響應機制。
(1)前端 SDK 可以采集各類前端數據,如手機型號、硬件類型等。除此之外,前端 SDK 還會計算出一個唯一的設備指紋,通過這個設備指紋,我們就能夠實現對設備行為的追蹤。
(2)規則引擎會接收到業務提供的原始數據,而想要從中識別出黑產,我們首先需要通過一些統計手段找到其中有用的特征。比如說,我們可以定義,一個設備在 1 分鍾內登錄 5 次的行為屬於異常行為,應當進行攔截。做好一款規則引擎的關鍵在兩個方面:采用正確的工作模式、設計高效的規則管理功能。
4)機器學習
機器學習是通過找出未知的規則參數來區分已知的行為。
在生活中,我們能夠快速地分辨一張圖片是貓還是狗。那你有沒有思考過,我們是怎么進行識別的?根據五官、顏色還是形狀?仔細回想一下,你就會發現,我們往往是根據經驗來判斷的,很難用文字描述出准確的判斷依據。
機器學習實際上是對人為經驗的一種總結,並不具備創新的能力,所以最終對抗效果的好壞,還是取決於人的對抗能力。
5)設備指紋
設備指紋是用來標識手機或者瀏覽器的唯一 ID,我們能夠通過這個 ID 關聯到手機或瀏覽器相關的全部數據。
對比於傳統的 IP、手機號等 ID,設備指紋具有唯一性高、穩定性強和信息豐富這三個優勢。
簡單來說,唯一性高是指一人一設備,因為使用者不同,每個智能設備上的使用痕跡和特征也具有唯一性。穩定性強也很好理解,就是智能設備的硬件不常更新,它們對應穩定不變的 ID。智能設備能夠收集的信息非常豐富,自下而上包括硬件、操作系統、應用信息等。
基於這些優勢,一方面,設備指紋可以以設備為單位對其相關的行為進行串聯,發現諸如使用一個設備進行大規模注冊等黑產攻擊行為;另一方面,設備指紋可以基於其豐富的設備信息,來識別黑產使用的虛擬設備,幫助風控系統對抗黑產。
設備指紋面臨的主要挑戰。
(1)第一,設備重置之后,保持設備指紋不變。
(2)第二,設備更新之后,保持設備指紋不變。
(3)最后,我們還要保證設備指紋的唯一性,避免兩個不同的設備產生相同的設備指紋
想要獲得准確且穩定的設備指紋,我們必須從多個維度采集不同的信息。這些信息可以大致分為:軟件 ID、軟件靜態特征、硬件靜態特征和硬件動態特征。
(1)軟件 ID 主要包括 iOS 設備的 IDFA、IDFV,Android 設備的 IMEI、MAC 等。這些 ID 本身就是蘋果和 Google 為了給 APP 廠商提供追蹤能力設計的標識,具備較好的唯一性和穩定性。但是,操作系統為了保障用戶隱私,對 APP 的權限做了較多的限制。比如,用戶可以自主選擇禁止 APP 獲取到這些 ID,重置手機也會同時重置這些 ID 等。
(2)軟件靜態特征主要是操作系統和 APP 本身的各類基本信息,比如操作系統版本、手機名稱、APP 版本等。這些信息基本都可以通過更新或者手動配置的方式修改,因此在穩定性上表現較差。但是,這些信息能夠反映出用戶的個人特征,因此,它們能夠對設備指紋的唯一性產生較大幫助。
(3)硬件靜態特征主要是設備的各類硬件信息,比如,主板、CPU、攝像頭等相關型號信息。正常用戶基本不會去替換設備上的各個硬件,因此硬件靜態特征具備較高的穩定性。但同一型號手機的硬件配置是一致的,所以,硬件靜態特征在唯一性上相對欠缺。
(4)硬件動態特征是目前比較新的研究方向,它的基本原理是基於硬件的一些動態執行層產生的特征(如:加速度傳感器的偏差)來識別虛擬設備。
設備指紋的 ID 計算其實就是計算兩組數據的相似度,相似度越高、差異度越低,就越有可能是同一個設備。
相關鏈接:
haveibeenpwned測試密碼是否泄漏
ATTACK框架識別漏洞
XSS工具BeEF
SQL注入工具sqlmap
對GitHub發起巡檢的工具Hawkeye
開源規則引擎Drools
開源風控系統Nebula
Web安全練習平台WebGoat
免費的攻擊滲透平台Pwnable.kr
插件漏洞檢測工具OWASP Dependency-Check
JavaScript插件管理工具Retire.js
基於Osquery來開發 HIDS(基於主機型入侵檢測系統)
httprecon報告各種可能的Web服務器
Burp Suite滲透利器