一文搞懂 Web 常見的攻擊方式

一、是什麼

Web 攻擊(WebAttack)是針對用戶上網行爲或網站服務器等設備進行攻擊的行爲

如植入惡意代碼,修改網站權限,獲取網站用戶隱私信息等等

Web 應用程序的安全性是任何基於 Web 業務的重要組成部分

確保 Web 應用程序安全十分重要,即使是代碼中很小的 bug 也有可能導致隱私信息被泄露

站點安全就是爲保護站點不受未授權的訪問、使用、修改和破壞而採取的行爲或實踐

我們常見的 Web 攻擊方式有

二、XSS

XSS,跨站腳本攻擊,允許攻擊者將惡意代碼植入到提供給其它用戶使用的頁面中

XSS涉及到三方,即攻擊者、客戶端與Web應用

XSS的攻擊目標是爲了盜取存儲在客戶端的cookie或者其他網站用於識別客戶端身份的敏感信息。一旦獲取到合法用戶的信息後,攻擊者甚至可以假冒合法用戶與網站進行交互

舉個例子:

一個搜索頁面,根據url參數決定關鍵詞的內容

<input type="text" value="<%= getParameter("keyword") %>">
<button>搜索</button>
<div>
  您搜索的關鍵詞是:<%= getParameter("keyword") %>
</div>

這裏看似並沒有問題,但是如果不按套路出牌呢?

用戶輸入"><script>alert('XSS');</script>,拼接到 HTML 中返回給瀏覽器。形成了如下的 HTML:

<input type="text" value=""><script>alert('XSS');</script>">
<button>搜索</button>
<div>
  您搜索的關鍵詞是:"><script>alert('XSS');</script>
</div>

瀏覽器無法分辨出 <script>alert('XSS');</script> 是惡意代碼,因而將其執行,試想一下,如果是獲取cookie發送對黑客服務器呢?

根據攻擊的來源,XSS攻擊可以分成:

存儲型

存儲型 XSS 的攻擊步驟:

  1. 攻擊者將惡意代碼提交到目標網站的數據庫中

  2. 用戶打開目標網站時,網站服務端將惡意代碼從數據庫取出,拼接在 HTML 中返回給瀏覽器

  3. 用戶瀏覽器接收到響應後解析執行,混在其中的惡意代碼也被執行

  4. 惡意代碼竊取用戶數據併發送到攻擊者的網站,或者冒充用戶的行爲,調用目標網站接口執行攻擊者指定的操作

這種攻擊常見於帶有用戶保存數據的網站功能,如論壇發帖、商品評論、用戶私信等

反射型 XSS

反射型 XSS 的攻擊步驟:

  1. 攻擊者構造出特殊的 URL,其中包含惡意代碼

  2. 用戶打開帶有惡意代碼的 URL 時,網站服務端將惡意代碼從 URL 中取出,拼接在 HTML 中返回給瀏覽器

  3. 用戶瀏覽器接收到響應後解析執行,混在其中的惡意代碼也被執行

  4. 惡意代碼竊取用戶數據併發送到攻擊者的網站,或者冒充用戶的行爲,調用目標網站接口執行攻擊者指定的操作

反射型 XSS 跟存儲型 XSS 的區別是:存儲型 XSS 的惡意代碼存在數據庫裏,反射型 XSS 的惡意代碼存在 URL 裏。

反射型 XSS 漏洞常見於通過 URL 傳遞參數的功能,如網站搜索、跳轉等。

由於需要用戶主動打開惡意的 URL 才能生效,攻擊者往往會結合多種手段誘導用戶點擊。

POST 的內容也可以觸發反射型 XSS,只不過其觸發條件比較苛刻(需要構造表單提交頁面,並引導用戶點擊),所以非常少見

DOM 型 XSS

DOM 型 XSS 的攻擊步驟:

  1. 攻擊者構造出特殊的 URL,其中包含惡意代碼

  2. 用戶打開帶有惡意代碼的 URL

  3. 用戶瀏覽器接收到響應後解析執行,前端 JavaScript 取出 URL 中的惡意代碼並執行

  4. 惡意代碼竊取用戶數據併發送到攻擊者的網站,或者冒充用戶的行爲,調用目標網站接口執行攻擊者指定的操作

DOM 型 XSS 跟前兩種 XSS 的區別:DOM 型 XSS 攻擊中,取出和執行惡意代碼由瀏覽器端完成,屬於前端 JavaScript 自身的安全漏洞,而其他兩種 XSS 都屬於服務端的安全漏洞

XSS 的預防

通過前面介紹,看到XSS攻擊的兩大要素:

針對第一個要素,我們在用戶輸入的過程中,過濾掉用戶輸入的惡劣代碼,然後提交給後端,但是如果攻擊者繞開前端請求,直接構造請求就不能預防了

而如果在後端寫入數據庫前,對輸入進行過濾,然後把內容給前端,但是這個內容在不同地方就會有不同顯示

例如:

一個正常的用戶輸入了 5 < 7 這個內容,在寫入數據庫前,被轉義,變成了 5 < 7

在客戶端中,一旦經過了 escapeHTML(),客戶端顯示的內容就變成了亂碼 ( 5 < 7 )

在前端中,不同的位置所需的編碼也不同。

<div title="comment">5 < 7</div>

可以看到,過濾並非可靠的,下面就要通過防止瀏覽器執行惡意代碼:

在使用 .innerHTML.outerHTMLdocument.write() 時要特別小心,不要把不可信的數據作爲 HTML 插到頁面上,而應儘量使用 .textContent.setAttribute()

如果用 Vue/React 技術棧,並且不使用 v-html/dangerouslySetInnerHTML 功能,就在前端 render 階段避免 innerHTMLouterHTML 的 XSS 隱患

DOM 中的內聯事件監聽器,如 locationonclickonerroronloadonmouseover 等,<a> 標籤的 href 屬性,JavaScript 的 eval()setTimeout()setInterval() 等,都能把字符串作爲代碼運行。如果不可信的數據拼接到字符串中傳遞給這些 API,很容易產生安全隱患,請務必避免

<!-- 鏈接內包含惡意代碼 -->
<a href="UNTRUSTED">1</a>

<script>
// setTimeout()/setInterval() 中調用惡意代碼
setTimeout("UNTRUSTED")
setInterval("UNTRUSTED")

// location 調用惡意代碼
location.href = 'UNTRUSTED'

// eval() 中調用惡意代碼
eval("UNTRUSTED")

三、CSRF

CSRF(Cross-site request forgery)跨站請求僞造:攻擊者誘導受害者進入第三方網站,在第三方網站中,向被攻擊網站發送跨站請求

利用受害者在被攻擊網站已經獲取的註冊憑證,繞過後臺的用戶驗證,達到冒充用戶對被攻擊的網站執行某項操作的目

一個典型的 CSRF 攻擊有着如下的流程:

csrf可以通過get請求,即通過訪問img的頁面後,瀏覽器自動訪問目標地址,發送請求

同樣,也可以設置一個自動提交的表單發送post請求,如下:

<form action="http://bank.example/withdraw" method=POST>
    <input type="hidden"  />
    <input type="hidden"  />
    <input type="hidden"  />
</form>
<script> document.forms[0].submit(); </script>

訪問該頁面後,表單會自動提交,相當於模擬用戶完成了一次POST操作

還有一種爲使用a標籤的,需要用戶點擊鏈接纔會觸發

訪問該頁面後,表單會自動提交,相當於模擬用戶完成了一次 POST 操作

<a href="http://test.com/csrf/withdraw.php?amount=1000&for=hacker" taget="_blank">
    重磅消息!!
<a/>

CSRF 的特點

CSRF 的預防

CSRF 通常從第三方網站發起,被攻擊的網站無法防止攻擊發生,只能通過增強自己網站針對 CSRF 的防護能力來提升安全性

防止csrf常用方案如下:

這裏主要講講token這種形式,流程如下:

<input type=”hidden” name=”csrftoken” value=”tokenvalue”/>

四、SQL 注入

Sql 注入攻擊,是通過將惡意的 Sql查詢或添加語句插入到應用的輸入參數中,再在後臺 Sql服務器上解析執行進行的攻擊

流程如下所示:

預防方式如下:

上述只是列舉了常見的web攻擊方式,實際開發過程中還會遇到很多安全問題,對於這些問題, 切記不可忽視

參考文獻

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Wic__-qqkPvZKqrByuPp2g