web常見的攻擊方式有哪些?如何防禦?

来源:https://www.cnblogs.com/smileZAZ/p/18204628
-Advertisement-
Play Games

一、是什麼 Web攻擊(WebAttack)是針對用戶上網行為或網站伺服器等設備進行攻擊的行為 如植入惡意代碼,修改網站許可權,獲取網站用戶隱私信息等等 Web應用程式的安全性是任何基於Web業務的重要組成部分 確保Web應用程式安全十分重要,即使是代碼中很小的 bug 也有可能導致隱私信息被泄露 站 ...


一、是什麼

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

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

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

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

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

我們常見的Web攻擊方式有

  • XSS (Cross Site Scripting) 跨站腳本攻擊
  • CSRF(Cross-site request forgery)跨站請求偽造
  • SQL註入攻擊

二、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攻擊可以分成:

  • 存儲型
  • 反射型
  • DOM 型

#存儲型

存儲型 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 )

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

  • 當 5 < 7 作為 HTML 拼接頁面時,可以正常顯示:
<div title="comment">5 < 7</div>
  • 當 5 < 7 通過 Ajax 返回,然後賦值給 JavaScript 的變數時,前端得到的字元串就是轉義後的字元。這個內容不能直接用於 Vue 等模板的展示,也不能直接用於內容長度計算。不能用於標題、alert 等

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

在使用 .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=" ">1</ a>

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

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

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

三、CSRF

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

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

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

  • 受害者登錄a.com,並保留了登錄憑證(Cookie)
  • 攻擊者引誘受害者訪問了b.com
  • b.com 向 a.com 發送了一個請求:a.com/act=xx。瀏覽器會預設攜帶a.com的Cookie
  • a.com接收到請求後,對請求進行驗證,並確認是受害者的憑證,誤以為是受害者自己發送的請求
  • a.com以受害者的名義執行了act=xx
  • 攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者,讓a.com執行了自己定義的操作

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

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

<form action="http://bank.example/withdraw" method=POST>
    <input type="hidden" name="account" value="xiaoming" />
    <input type="hidden" name="amount" value="10000" />
    <input type="hidden" name="for" value="hacker" />
</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的特點

  • 攻擊一般發起在第三方網站,而不是被攻擊的網站。被攻擊的網站無法防止攻擊發生
  • 攻擊利用受害者在被攻擊網站的登錄憑證,冒充受害者提交操作;而不是直接竊取數據
  • 整個過程攻擊者並不能獲取到受害者的登錄憑證,僅僅是“冒用”
  • 跨站請求可以用各種方式:圖片URL、超鏈接、CORS、Form提交等等。部分請求方式可以直接嵌入在第三方論壇、文章中,難以進行追蹤

CSRF的預防

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

防止csrf常用方案如下:

  • 阻止不明外域的訪問
    • 同源檢測
    • Samesite Cookie
  • 提交時要求附加本域才能獲取的信息
    • CSRF Token
    • 雙重Cookie驗證

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

  • 用戶打開頁面的時候,伺服器需要給這個用戶生成一個Token
  • 對於GET請求,Token將附在請求地址之後。對於 POST 請求來說,要在 form 的最後加上
<input type=”hidden” name=”csrftoken” value=”tokenvalue”/>
  • 當用戶從客戶端得到了Token,再次提交給伺服器的時候,伺服器需要判斷Token的有效性

四、SQL註入

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

流程如下所示:

  • 找出SQL漏洞的註入點

  • 判斷資料庫的類型以及版本

  • 猜解用戶名和密碼

  • 利用工具查找Web後臺管理入口

  • 入侵和破壞

預防方式如下:

  • 嚴格檢查輸入變數的類型和格式
  • 過濾和轉義特殊字元
  • 對訪問資料庫的Web應用程式採用Web應用防火牆

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

參考文獻

  • https://tech.meituan.com/2018/09/27/fe-security.html
  • https://developer.mozilla.org/zh-CN/docs/learn/Server-side/First_steps/Website_security

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本章內容: 行分隔符(U + 2028)和段分隔符(U + 2029)符號現在允許在字元串文字中,與 JSON 匹配 更加友好的 JSON.stringify 新增了 Array 的flat()方法和flatMap()方法 新增了 String 的trimStart()方法和trimEnd()方法 ...
  • 一、區別 前面兩節我們有提到Loader與Plugin對應的概念,先來回顧下 loader 是文件載入器,能夠載入資源文件,並對這些文件進行一些處理,諸如編譯、壓縮等,最終一起打包到指定的文件中 plugin 賦予了 webpack 各種靈活的功能,例如打包優化、資源管理、環境變數註入等,目的是解決 ...
  • FreeTube —— 一款開源桌面 YouTube 播放器,基於 Electron 實現,同時支 Windows(10 及更高版本)、Mac(macOS 10.15 及更高版本)和 Linux。 ...
  • 當用戶進行滑鼠框選選擇了頁面上的內容時,把選擇的內容進行上報。 分為以下幾點: 選擇文案時 選擇圖片、svg、iframe、video、audio 等標簽時 選擇 input、select、textarea 等標簽時 選擇input、textarea 標簽內容時 選擇類似   字元時 鍵盤全選時 鼠... ...
  • 隨著大學校園跑腿業務市場的興起,懶人經濟越來越明顯,校園跑腿需求市場廣闊,不僅是商家可以做好校園跑腿業務,學生個人也是可以很好經營自己的跑腿業務的,前期的時候可以一個人做,後期隨著單量的增加,忙不過來了,可以號召身邊的同學,校友等願意賺取一點外快的小伙伴加入。 ...
  • 一、前言 下拉刷新和上拉載入這兩種交互方式通常出現在移動端中 本質上等同於PC網頁中的分頁,只是交互形式不同 開源社區也有很多優秀的解決方案,如iscroll、better-scroll、pulltorefresh.js庫等等 這些第三方庫使用起來非常便捷 我們通過原生的方式實現一次上拉載入,下拉刷 ...
  • 本章內容: Array.prototype.includes():判斷一個數組是否包含一個指定的值,如果包含則返回 true,否則返回 false。 冪運算符**: a ** b 指數運算符,它與 Math.pow(a, b)相同。 Array.prototype.includes() includ ...
  • ECMAScript 2023 主要包含內容 ECMAScript 2023 於 2023 年 6 月 27 日獲得 ECMA International 的批准。 ECMAScript 是標準化的 JavaScript 語言,於 1997 年發佈了第一版,現已發展成為世界上使用最廣泛的通用編程語言 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...