常見Web安全問題及防御策略
本文轉載自微信公眾號「架構精進之路」,作者架構精進之路。轉載本文請聯(lián)系架構精進之路公眾號。
1、安全世界觀
安全世界觀一詞是《白帽子講Web安全》一書的開篇章節(jié),多年后再讀經(jīng)典,仍然受益匪淺!
正如開篇所說的:“互聯(lián)網(wǎng)本來是安全的,自從有了研究安全的人,互聯(lián)網(wǎng)就不安全了。” 世上沒有攻不破的系統(tǒng),只有還沒攻破的系統(tǒng),有多少條路可以通羅馬,大概就有多少種攻克之道。
1.1 Web安全的興起
“破壞往往比建設容易”,但凡事都不是絕對的。
跟機場安全檢查進行類比。通過一個安全檢查(過濾,凈化)的過程,可以梳理未知的人或物,使其變得可信任。被劃分出來的具有不同信任級別的區(qū)域,我們成為信任域,劃分兩個不同信任域之間的邊界,我們稱之為信任邊界。
數(shù)據(jù)從高等級的信任域流向低等級的信任域,是不需要經(jīng)過安全檢查的;數(shù)據(jù)從低等級的信任域流向高等級的信任域,是需要經(jīng)過信任邊界的安全檢查。
安全問題的本質是信任的問題。
一切的安全方案設計的基礎,都是建立在信任關系上的。我們必須相信一些東西,必須要有一些最基本的假設,安全方案才能得以建立。
1.2 安全的三要素
安全的三要素是安全的基本組成元素,分別為:
- 機密性(Confidentiality)
機密性要求數(shù)據(jù)內容不能泄露,加密是實現(xiàn)機密性要求的常見手段。如果不將文件存在抽屜里,而是放在透明的盒子里,那么雖然無法得到這個文件,但是文件的內容將會被泄露。
- 完整性(Integrity)
完整性則要求保護數(shù)據(jù)內容是完整,沒有被篡改的。常見的保證一致性的技術手段是數(shù)字簽名。
- 可用性(Availability)
可用性要求保護資源是“隨需而得”。
舉例來說,假如有100個車位,有一天一個壞人搬了100塊大石頭將車位全占了,那么停車場無法再提供正常服務。在安全領域中叫做拒絕服務攻擊,簡稱DoS(Denial of Service)。拒絕服務攻擊破壞的是安全的可用性。
1.3 白帽子兵法
Secure By Default原則
1)黑名單、白名單
實際上,Secure By Default原則,也可以歸納為白名單,黑名單的思想。如果更多地使用白名單,那么系統(tǒng)就會變得更安全。
2)最小權限原則
最小原則要求系統(tǒng)只授予主體必要的權限,而不要過度授權,這樣能有效地減少系統(tǒng),網(wǎng)絡,應用,數(shù)據(jù)庫出錯的機會。
如果網(wǎng)站只提供Web服務,只允許開啟80,443端口,屏蔽其它端口。
縱深防御原則
縱深防御原則包含兩層含義:
1)要在各個不同層面,不同方面實施安全方案,避免出現(xiàn)疏漏,不同安全方案之間需要相互配合,構成一個整體;
2)要在正確的地方做正確的事情,即:在解決根本問題的地方實施針對性的安全方案。
數(shù)據(jù)與代碼分離原則
這一原則適用于各種由于“注入”而引發(fā)安全問題的場景。
實際上,緩沖區(qū)溢出,也可以認為是程序違背了這一原則的后果——程序在棧或者堆中,將用戶數(shù)據(jù)當做代碼執(zhí)行,混淆了代碼與數(shù)據(jù)的邊界,從而導致安全問題的發(fā)生。
不可預測性原則
微軟使用的ASLR技術,在較新版本的Linux內核中也支持。在ASLR的控制下,一個程序每次啟動時,其進程的?;范疾幌嗤?,具有一定的隨機性,對于攻擊者來說,這就是“不可預測性”。
不可預測性,能有效地對抗基于篡改,偽造的攻擊。
不可預測性的實現(xiàn)往往需要用到加密算法,隨機數(shù)算法,哈希算法,好好利用這條規(guī)則,在設計安全方案時往往會事半功倍。
2、常見WEB安全
2.1 XSS
XSS (Cross Site Script),跨站腳本攻擊,因為縮寫和 CSS (Cascading Style Sheets) 重疊,所以只能叫 XSS。
XSS 的原理是惡意攻擊者往 Web 頁面里插入惡意可執(zhí)行網(wǎng)頁腳本代碼,當用戶瀏覽該頁之時,嵌入其中 Web 里面的腳本代碼會被執(zhí)行,從而可以達到攻擊者盜取用戶信息或其他侵犯用戶安全隱私的目的。XSS 的攻擊方式千變萬化,但還是可以大致細分為幾種類型:
非持久型XSS
也叫反射型 XSS 漏洞,一般是通過給別人發(fā)送帶有惡意腳本代碼參數(shù)的 URL,當 URL 地址被打開時,特有的惡意代碼參數(shù)被 HTML 解析、執(zhí)行。
持久型XSS
持久型 XSS 攻擊不需要誘騙點擊,黑客只需要在提交表單的地方完成注入即可,但是這種 XSS 攻擊的成本相對還是很高。
未經(jīng)驗證的跳轉XSS
一些場景是后端需要對一個傳進來的待跳轉的 URL 參數(shù)進行一個 302 跳轉,可能其中會帶有一些用戶的敏感(cookie)信息。
2.2 CSRF
CSRF(Cross-Site Request Forgery),名為:跨站請求偽造攻擊。
那么 CSRF 到底能夠干嘛呢?
你可以這樣簡單的理解:攻擊者可以盜用你的登陸信息,以你的身份模擬發(fā)送各種請求。攻擊者只要借助少許的社會工程學的詭計。
例如通過 QQ 等聊天軟件發(fā)送的鏈接(有些還偽裝成短域名,用戶無法分辨),攻擊者就能迫使 Web 應用的用戶去執(zhí)行攻擊者預設的操作。例如,當用戶登錄網(wǎng)絡銀行去查看其存款余額,在他沒有退出時,就點擊了一個 QQ 好友發(fā)來的鏈接,那么該用戶銀行帳戶中的資金就有可能被轉移到攻擊者指定的帳戶中。
所以遇到 CSRF 攻擊時,將對終端用戶的數(shù)據(jù)和操作指令構成嚴重的威脅。當受攻擊的終端用戶具有管理員帳戶的時候,CSRF 攻擊將危及整個 Web 應用程序。
CSRF 原理
下圖大概描述了 CSRF 攻擊的原理:
CSRF 攻擊必須要有三個條件 :
1. 用戶已經(jīng)登錄了站點 A,并在本地記錄了 cookie
2 . 在用戶沒有登出站點 A 的情況下(也就是 cookie 生效的情況下),訪問了惡意攻擊者提供的引誘危險站點 B (B 站點要求訪問站點A)。
3 . 站點 A 沒有做任何 CSRF 防御
預防 CSRF
CSRF 的防御可以從服務端和客戶端兩方面著手,防御效果是從服務端著手效果比較好,現(xiàn)在一般的 CSRF 防御也都在服務端進行。服務端的預防 CSRF 攻擊的方式方法有多種,但思路上都是差不多的,主要從以下兩個方面入手 :
1 . 正確使用 GET,POST 請求和 cookie
2 . 在非 GET 請求中增加 token
CSRF 的防御可以根據(jù)應用場景的不同自行選擇。CSRF 的防御工作確實會在正常業(yè)務邏輯的基礎上帶來很多額外的開發(fā)量,但是這種工作量是值得的,畢竟用戶隱私以及財產(chǎn)安全是產(chǎn)品最基礎的根本。
2.3 SQL 注入
SQL 注入漏洞(SQL Injection)是 Web 開發(fā)中最常見的一種安全漏洞。攻擊者利用這個漏洞,可以訪問或修改數(shù)據(jù),或者利用潛在的數(shù)據(jù)庫漏洞進行攻擊。
而造成 SQL 注入的原因是因為程序沒有有效的轉義過濾用戶的輸入,使攻擊者成功的向服務器提交惡意的 SQL 查詢代碼,程序在接收后錯誤的將攻擊者的輸入作為查詢語句的一部分執(zhí)行,導致原始的查詢邏輯被改變,額外的執(zhí)行了攻擊者精心構造的惡意代碼。
如何預防
防止 SQL 注入主要是不能允許用戶輸入的內容影響正常的 SQL 語句的邏輯,當用戶的輸入信心將要用來拼接 SQL 語句的話,我們應該永遠選擇不相信,任何內容都必須進行轉義過濾,當然做到這個還是不夠的,下面列出防御 SQL 注入的幾點注意事項:
- 嚴格限制Web應用的數(shù)據(jù)庫的操作權限,給此用戶提供僅僅能夠滿足其工作的最低權限,從而最大限度的減少注入攻擊對數(shù)據(jù)庫的危害;
- 后端代碼檢查輸入的數(shù)據(jù)是否符合預期,嚴格限制變量的類型,例如使用正則表達式進行一些匹配處理;
- 對進入數(shù)據(jù)庫的特殊字符(',",\,<,>,&,*,; 等)進行轉義處理,或編碼轉換;
- 所有的查詢語句建議使用數(shù)據(jù)庫提供的參數(shù)化查詢接口,參數(shù)化的語句使用參數(shù)而不是將用戶輸入變量嵌入到 SQL 語句中,即不要直接拼接 SQL 語句。
2.4 DDoS 攻擊
DDoS 又叫分布式拒絕服務,全稱 Distributed Denial of Service。
其原理就是利用大量的請求造成資源過載,導致服務不可用,這個攻擊應該不能算是安全問題,這應該算是一個另類的存在,因為這種攻擊根本就是耍流氓的存在,「傷敵一千,自損八百」的行為。
DDoS 攻擊可以理解為:「你開了一家店,隔壁家店看不慣,就雇了一大堆黑社會人員進你店里干坐著,也不消費,其他客人也進不來,導致你營業(yè)慘淡」。
也許你的站點遭受過 DDoS 攻擊,具體什么原因怎么解讀見仁見智。DDos 攻擊從層次上可分為網(wǎng)絡層攻擊與應用層攻擊,從攻擊手法上可分為快型流量攻擊與慢型流量攻擊,但其原理都是造成資源過載,導致服務不可用。
主要分類
網(wǎng)絡層的 DDoS 攻擊究其本質其實是無法防御的,我們能做得就是不斷優(yōu)化服務本身部署的網(wǎng)絡架構,以及提升網(wǎng)絡帶寬。
應用層 DDoS 攻擊不是發(fā)生在網(wǎng)絡層,是發(fā)生在 TCP 建立握手成功之后,應用程序處理請求的時候,現(xiàn)在很多常見的 DDoS 攻擊都是應用層攻擊。
- 應用層的防御有時比網(wǎng)絡層的更難,因為導致應用層被 DDoS 攻擊的因素非常多,有時往往是因為程序員的失誤,導致某個頁面加載需要消耗大量資源,有時是因為中間件配置不當?shù)鹊取?/li>
- 而應用層 DDoS 防御的核心就是區(qū)分人與機器(爬蟲),因為大量的請求不可能是人為的,肯定是機器構造的。因此如果能有效的區(qū)分人與爬蟲行為,則可以很好地防御此攻擊。
總結
Web 安全的對于 Web 從業(yè)人員來說是一個非常重要的課題。本文介紹了安全世界觀,以及常見Web 相關的三種安全防御知識,希望大家以后的工作中不要誤入踩雷,希望對大家有所幫助!
安全是一門樸素的學問,也是一種平衡的藝術,無論是傳統(tǒng)安全,還是互聯(lián)網(wǎng)安全,其內在原理都是一樣的。我們只需抓住安全問題的本質,之后無論遇到任何安全問題,都會無往而不利!