金九銀十進大廠必須掌握的五種Web攻擊類型的知識

web安全

安全性主要分爲兩大塊。 私密性:不被非法獲取和利用。 可靠性:不丟失、不損壞、不被篡改javascript

攻擊類型

  • XSS 跨站腳本攻擊
  • CSRF 跨站請求僞造
  • SQL注入
  • 點擊劫持
  • 中間人攻擊


XSS 跨站腳本攻擊

XSS ( Cross Site Scripting ) 是指惡意攻擊者利用網站沒有對用戶提交數據進行轉義處理或者過濾不足的缺點,進而添加一些代碼,嵌入到web頁面中去。使別的用戶訪問都會執行相應的嵌入代碼。html

從而盜取用戶資料、利用用戶身份進行某種動做或者對訪問者進行病毒侵害的一種攻擊方式。前端

XSS攻擊的危害包括:

  1. 獲取頁面數據
  2. 獲取cookie
  3. 劫持前端邏輯
  4. 發送請求
  5. 偷取網站任意數據
  6. 偷取用戶資料
  7. 偷取用戶密碼和登錄態
  8. 欺騙用戶

XSS攻擊分類

反射型

經過url參數直接注入。java

發出請求時,XSS代碼出如今URL中,做爲輸入提交到服務器端,服務端解析後返回,XSS代碼隨響應內容一塊兒傳回給瀏覽器,最後瀏覽器執行XSS代碼。這個過程像一次反射,故叫作反射型XSS。git

舉個例子github

一個連接,裏面的query字段中包含一個script標籤,這個標籤的src就是惡意代碼,用戶點擊了這個連接後會先向服務器發送請求,服務器返回時也攜帶了這個XSS代碼,而後瀏覽器將查詢的結果寫入Html,這時惡意代碼就被執行了。web

並非在url中沒有包含script標籤的網址都是安全的,可使用短網址來讓網址變得很短。sql

存儲型

存儲型XSS會被保存到數據庫,在其餘用戶訪問(前端)到這條數據時,這個代碼會在訪問用戶的瀏覽器端執行。數據庫

舉個例子npm

好比攻擊者在一篇文章的評論中寫入了script標籤,這個評論被保存數據庫,當其餘用戶看到這篇文章時就會執行這個腳本。

XSS攻擊注入點

  • HTML節點內容
    • 若是一個節點內容是動態生成的,而這個內容中包含用戶輸入。
  • HTML屬性
    • 某些節點屬性值是由用戶輸入的內容生成的。那麼可能會被封閉標籤後添加script標籤。
<img src="${image}"/>
<img src="1" onerror="alert(1)" />複製代碼
  • Javascript代碼
    • JS中包含由後臺注入的變量或用戶輸入的信息。
var data = "#{data}";
var data = "hello"; alert(1);"";複製代碼
  • 富文本

XSS 防護

對於 XSS 攻擊來講,一般有兩種方式能夠用來防護。

  • 轉義字符
  • CSP 內容安全策略

轉義字符

  • 普通的輸入 - 編碼

    • 對用戶輸入數據進行HTML Entity編碼(使用轉義字符)
    • "
    • &
    • <
    • >
    • 空格
  • 富文本 - 過濾(黑名單、白名單)

    • 移除上傳的DOM屬性,如onerror等
    • 移除用戶上傳的style節點、script節點、iframe節點等
  • 較正

    • 避免直接對HTML Entity解碼
    • 使用DOM Parse轉換,校訂不配對的DOM標籤和屬性

對於會在DOM中出現的字符串(用戶數據):

< 轉義爲 &lt;

轉義爲 &gt;

對於可能出如今DOM元素屬性上的數據

" 轉義爲 &quot; ' 轉義爲 &9039; 空格轉義爲 &nbsp; 但這可能形成多個連續的空格,也能夠不對空格轉義,可是必定要爲屬性加雙引號

& 這個字符若是要轉義,那麼必定要放在轉移函數的第一個來作

避免JS中的插入

var data = "#{data}";
var data = "hello"; alert(1);"";複製代碼

由於是用引號將變量包裹起來的,並且被攻擊也由於引號被提早結束,因此要作的就是將引號轉義

先 \\ -> \\\\
再 " -> \\"
複製代碼

富文本

按照黑名單過濾: script等 可是html標籤中能執行html代碼的屬性太多了,好比onclick, onhover,onerror,

function xssFilter = function (html) {
  html = html.replace(/<\s*\/?script\s*>/g, '');
  html = html.repalce(/javascript:[^'"]/g, ''); html = html.replace(/onerror\s*=\s*['"]?[^'"]*['"]?/g, ''); //.... return html; }複製代碼

按照白名單過濾: 只容許某些標籤和屬性存在

作法:將HTML解析成樹狀結構,對於這個DOM樹,一個一個的去看是否存在合法的標籤和屬性,若是不是就去掉。

使用cheerio就能夠快速的解析DOM

function xssFilter (html) {

  const cheerio = require('cheerio');
  const $ = cheerio.load(html);

  //白名單
  const whiteList = {'img': ['src']}

  $('*').each((index, elem) => {
    if(!whiteList[elem.name]) {
      $(elem).remove();
      return;
    }
    for(let attr in elem.attribs) {
      if(whiteList[elem.name].indexOf(attr) === -1) {
        $(elem).attr(attr, null);
      }
    }
  })
  return html;
}複製代碼

使用npm包來簡化操做

xss文檔

CSP 內容安全策略

CSP 本質上就是創建白名單,開發者明確告訴瀏覽器哪些外部資源能夠加載和執行。咱們只須要配置規則,如何攔截是由瀏覽器本身實現的。咱們能夠經過這種方式來儘可能減小 XSS 攻擊。

一般能夠經過兩種方式來開啓 CSP:

  • 設置 HTTP Header 中的 Content-Security-Policy
  • 設置 meta 標籤的方式 <meta http-equiv="Content-Security-Policy">

以設置 HTTP Header 來舉例

  • 只容許加載本站資源
Content-Security-Policy: default-src ‘self’
複製代碼
  • 圖片只容許加載 HTTPS 協議
Content-Security-Policy: img-src https://*
複製代碼
  • 容許加載任何來源框架
Content-Security-Policy: child-src 'none'
複製代碼

CSP ( Content Security Policy )


CSRF 跨站請求僞造

(Cross Site Request Forgy) 打開同一瀏覽器時其餘的網站對本網站形成的影響。原理就是攻擊者構造出一個後端請求地址,誘導用戶點擊或者經過某些途徑自動發起請求。若是用戶是在登陸狀態下的話,後端就覺得是用戶在操做,從而進行相應的邏輯。 原理

舉個例子,用戶同時打開了A網站和釣魚網站。 假設A網站中有一個經過 GET 請求提交用戶評論的接口,那麼攻擊者就能夠在釣魚網站中加入一個圖片,圖片的地址就是評論接口。

<img src="http://www.domain.com/xxx?comment='attack'"/>複製代碼

CSRF攻擊原理

  1. 用戶登陸A網站
  2. A網站確認身份(給客戶端cookie)
  3. B網站頁面向A網站發起請求(帶上A網站身份)

CSRF防護

  1. Get 請求不對數據進行修改
  2. 不讓第三方網站訪問到用戶 Cookie
  3. 阻止第三方網站請求接口
  4. 請求時附帶驗證信息,好比驗證碼或者 Token
  • SameSite
    • 能夠對 Cookie 設置 SameSite 屬性。該屬性表示 Cookie 不隨着跨域請求發送,能夠很大程度減小 CSRF 的攻擊,可是該屬性目前並非全部瀏覽器都兼容。
  • Token驗證
    • cookie是發送時自動帶上的,而不會主動帶上Token,因此在每次發送時主動發送Token
  • Referer驗證
    • 對於須要防範 CSRF 的請求,咱們能夠經過驗證 Referer 來判斷該請求是否爲第三方網站發起的。
  • 隱藏令牌
    • 主動在HTTP頭部中添加令牌信息

禁止第三方網站帶cookies

same-site屬性。 設置只有同一站點的請求才能攜帶cookie

CSRF蠕蟲

若是某個用戶打開了被攻擊網頁,而且用戶同時訪問了攻擊者的網頁。 那麼攻擊者的網頁就會使用用戶的身份發送一些請求,而且經常使用用戶的身份發佈一些評論或文章,裏面包含攻擊者的網頁連接。若是其餘用戶看到了這個用戶的這條評論,都甚至能夠不點擊,其餘用戶也會被盜用身份發送一些惡意請求。這樣病毒的傳播就會愈來愈快,影響愈來愈大。

CSRF攻擊危害

  • 利用用戶登陸態
  • 用戶不知情
  • 完成業務請求
  • 盜取用戶資金
  • 冒充用戶發帖背鍋
  • 損壞網站名譽


SQL 注入

所謂SQL注入,就是經過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,後臺執行SQL語句時直接把前端傳入的字段拿來作SQL查詢。

防護

  • 永遠不要信任用戶的輸入
  • 永遠不要使用動態拼裝sql
  • 不要把機密信息直接存放


點擊劫持

點擊劫持是一種視覺欺騙的攻擊手段。攻擊者將須要攻擊的網站經過 iframe 嵌套的方式嵌入本身的網頁中,並將 iframe 設置爲透明,在頁面中透出一個按鈕誘導用戶點擊。

對於這種攻擊方式,推薦防護的方法有兩種。

  • X-FRAME-OPTIONS
  • JS 防護

X-FRAME-OPTIONS

X-FRAME-OPTIONS 是一個 HTTP 響應頭,在現代瀏覽器有一個很好的支持。這個 HTTP 響應頭 就是爲了防護用 iframe 嵌套的點擊劫持攻擊。

該響應頭有三個值可選,分別是

  • DENY,表示頁面不容許經過iframe的方式展現
  • SAMEORIGIN,表示頁面能夠在相同域名下經過iframe的方式展現
  • ALLOW-FROM,表示頁面能夠在指定來源的iframe中展現

JS防護

對於某些低版本瀏覽器來講,並不能支持上面的這種方式,那咱們只有經過 JS 的方式來防護點擊劫持了。

<head>
  <style id="click-jack">
    html {
      display: none !important;
    }
  </style>
</head>
<body>
  <script>
    if (self == top) {
      var style = document.getElementById('click-jack')
      document.body.removeChild(style)
    } else {
      top.location = self.location
    }
  </script>
</body>複製代碼


中間人攻擊

中間人攻擊是攻擊方同時與服務端和客戶端創建起了鏈接,並讓對方認爲鏈接是安全的,可是實際上整個通訊過程都被攻擊者控制了。攻擊者不只能得到雙方的通訊信息,還能修改通訊信息。

一般來講不建議使用公共的 Wi-Fi,由於極可能就會發生中間人攻擊的狀況。若是你在通訊的過程當中涉及到了某些敏感信息,就徹底暴露給攻擊方了。

固然防護中間人攻擊其實並不難,只須要增長一個安全通道來傳輸信息。HTTPS 就能夠用來防護中間人攻擊,可是並非說使用了 HTTPS 就能夠高枕無憂了,由於若是你沒有徹底關閉 HTTP 訪問的話,攻擊方能夠經過某些方式將 HTTPS 降級爲 HTTP 從而實現中間人攻擊。

你的點贊是我持續輸出的動力 但願能幫助到你們 互相學習 有任何問題下面留言 必定回覆 

相關文章
相關標籤/搜索