web 安全主題

👺 XSS(Cross Site Scripting)跨站腳本攻擊

Scripting能幹什麼(危害)javascript

  • 獲取頁面數據
  • 獲取cookies
  • 劫持前端邏輯
  • 發送請求
  • 偷取網站任意數據
  • 偷取用戶資料
  • 偷取用戶密碼和登入態
  • 欺騙用戶

分類html

  • 反射型

url參數直接注入的方式攻擊前端

  • 存儲型

存儲到數據庫後讀取後攻擊java

XSS攻擊的注入點算法

  • HTML節點內容
<div>
	#{content}
</div>

這種是經過往HTML標籤之間插入script標籤的方式進行邏輯操縱從而引發的攻擊方式。 防護:能夠經過轉譯標籤標記進行防護。轉義<&lt;>&gt;sql

  • HTML屬性
<img src="#{image}"/>
<img src="1" onerror="alert(1)"/>

如上代碼,經過提早關閉元素屬性的方式進行的XSS攻擊。chrome

  • Javascript富文本
<script>
	var data = "#{data}";
	var data = "hello"; alert(1);"";
</script>

如上代碼,經過在js代碼中插入代碼的方式進行的XSS攻擊。 防護:能夠經過轉譯標籤標記進行防護。轉義\或者轉換成json(推薦)。數據庫

  • 富文本

黑名單進行過濾,就是用正則去匹配不合法的html標籤,而後進行內容過濾,優勢是開發簡單,缺點是可能過濾不全存在隱患。 白名單進行過濾,就是規定全部容許的標籤及屬性的範圍域,優勢是內容過濾可靠,安全,但因爲事先須要將內容構建成DOM樹(推薦cheerio庫),所以效率可能會有必定影響。(第三方過濾模塊:js-xss)json

防護小結:後端

  • 經過設置響應頭的方式觸發瀏覽器的自動防護策略.set('X-XSS-Protection', 1),但這種策略防護有限。
  • 經過上述的轉譯策略。
var escapeHtml = function (str) {
    if (!str) return '';
    str = str.replace(/</g, '&lt;');
    str = str.replace(/>/g, '&gt;');
    return str;
};

var escapeHtmlProperty = function (str) {
    if (!str) return '';
    str = str.replace(/"/g, '&quto;');
    str = str.replace(/'/g, '&#39;');
    str = str.replace(/ /g,'&#32;');
    return str;
};

CSP(Content Security Policy)

  • 內容安全策略
  • 用於指定哪些內容能夠執行
child-src connect-src default-src --> <host-source> <scheme-source> 'self'
font-src frame-src img-src --> 'unsafe-inline' 'unsafe-eval" 'none'
manifest-src media-src object-src --> 'nonce-<base64-value>' <hash-source>
script-src style-src worker-src 'strict-dynamic'

具體參見MDN上CSP的文檔信息

👺 CSRF(Cross Site Request Forgy)跨站請求僞造

XSS與CSRF的區別

  • XSS:用戶知情的情的狀況下,在本網站運行腳本的攻擊方式。
  • CSRF:用戶不知情的狀況下,從其餘網站對目標服務器網站運行腳本攻擊的方式。

CSRF攻擊的原理

graph LR; www.a.com後端 -->|2| www.a.com前端 www.a.com前端 -->|1| www.a.com後端 www.b.com前端 -->|3| www.a.com後端
  1. 用戶登入a網站
  2. a網站確認身份
  3. bwz向a網站發起請求(帶a網站身份

CSRF的危害

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

CSRF的防護

  • 利用same-site響應頭
  • 驗證碼
  • token
  • referer請求頭防護

經過驗證 referer 請求頭是否來自可信任網站或本網站,從而禁止來自第三方網站的請求。

PS:referer 應該是referrer,這個單詞是爲數很少的單詞錯誤。

cookie特徵

  • 前端數據存儲
  • 後端經過http頭設置
  • 請求時經過http頭傳給後端
  • 前端可讀寫
  • 遵照同源策略: 協議,域名和端口都同樣
  • 域名
  • 有效期
  • 路徑
  • http-only:只容許http的方式使用,好比不容許js操做cookie
  • secure:只容許在https的請求中使用

以上特徵對應chrome中的cookie的各類參數

cookie的做用

  • 存儲個性化設置
  • 存儲未登陸時用戶的惟一標識
  • 存儲已登入用戶的憑證
  • 存儲其餘業務信息

cookie - 登陸用戶憑證管理(判斷用戶是不是在登陸態)

  • 方案一:cookie存儲用戶id

這種方案就是當用戶登入成功以後在cookie中存儲用戶id,當用戶在以後的請求中判斷當前用戶。可是這種方案容易被篡改用戶I。

  • 方案二:cookie存儲用ID和簽名

這種方案不只在cookie存儲用戶id,而且另外存儲一個由服務端根據密鑰和用戶id生成的惟一用戶簽名。於這種簽名都是不可逆的,當用戶在以後的請求中都帶上這兩個信息,由服務端根據用戶id從新生成簽名並與請求帶過來的簽名作對比來判斷用戶是否合法。因爲密鑰只有服務端有,所以這種方法是安全的。

  • 方案三:存儲sessionID

這種方案只在cookie中存儲當前登入用戶的惟一session,這種方案是安全的,所以想要作非法操做的用戶只拿到sessionID是沒有任何意義的。

👺 點擊劫持安全問題

點擊劫持的特色

  • 用戶親手操做
  • 盜取用戶資金(轉帳、消費)
  • 用戶不知情
  • 獲取用戶敏感信息
  • 其餘

總結來講,點擊劫持就是在用戶點擊網站時,使得劫持者在用戶在不知情的狀況下引導用戶作一些操做。其技術原理是在正常的網站上內嵌iframe框架,而且iframe框架的透明度爲0,這樣用戶在點擊頁面的時候,由於是在點擊看的見內容,實際上在點擊看不見的iframe框架的內容,從而使掉進劫持者的trap。

點擊劫持的防護

  • javascript禁止內嵌

其原理在於當頁面中有iframe框架時,top對象和window對象是不同的,從而top.location對象 window.location對象也是不同的,所以能夠用下面代碼來進行禁用。

if(top.location != window.location){
	top.location = window.location;
}
  • X-FRAME-OPTIONS禁止內嵌

能夠經過設置http response頭的方式進行禁用,X-FRAME-OPTIONS:DENY。PS:這個頭的其餘選項參考官方文檔。

  • 其餘輔助手段

好比加上驗證碼之類的防護措施。

👺 傳輸安全

傳輸鏈路竊聽篡改 以下圖

graph LR; 瀏覽器-->代理服務器 代理服務器-->瀏覽器 subgraph 中間服務器 鏈路-->代理服務器 代理服務器-->鏈路 end 鏈路-->服務器 服務器-->鏈路

在上圖瀏覽器和服務器之間全部的節點都有能力竊聽篡改要轉發的信息。

PS:在mac和Linux上能夠經過命令traceroute來追蹤請求從發起到目標服務器通過了哪些中間服務器,好比DNS服務器,路由轉發服務器等。

http竊聽

  • 竊聽用戶密碼
  • 竊聽傳輸敏感信息
  • 非法獲取用戶我的資料

http篡改

  • 插入廣告
  • 重定向網站
  • 沒法防護的XSS和CSRF攻擊

https進行加密傳輸。 PS:https使用的是TLS(SSL)加密。TSL是SSL的改進算法。

可是雖然是加密傳輸,中間服務器無法竊聽數據,可是存在中間人卻能夠進行數據盜取,以下圖:

graph LR; 瀏覽器-->|加密|中間人 中間人-->|加密|服務器 服務器-->|加密|中間人 中間人-->|加密|瀏覽器

這樣,中間人能夠僞造服務器,在用戶和服務器之間進行信息交互,從而盜取用戶信息。所以引入證書機制,證書必須由受信任的的機構(CA)簽發。以下入過程:

graph LR; CA-->|2.驗證域名 頒發證書|服務器 服務器-->|4.出具證書|瀏覽器 瀏覽器-->|0.內置信任列表|CA 瀏覽器-->|3.發起請求|服務器 瀏覽器-->|5.驗證經過|服務器 服務器-->|1.申請證書|CA
  • 證書沒法僞造
  • 證書私鑰不能泄露
  • 域名管理權不泄漏
  • CA堅持原則

本身往系統中添加證書是很危險的,由於簽發此證書的CA並無被瀏覽器及其其餘機構信任,也就是說此CA不受信任,若是你信任/本身添加了此證書到系統中後,若是此CA又給一個有問題的服務器簽發證書後,這樣信任這個機構簽發證書的機器就有了能面臨風險。

SUMMARY:https沒有證書也能夠正常使用,只是顯示不安全。

如何啓動https服務器:
申請證書 --> 配置https服務器

👺 密碼安全

  • 密碼的做用

證實你是你!

  • 密碼的存儲
  • 密碼的傳輸
  • 密碼的替代方案
  • 生物特徵密碼的問題

指紋解鎖,虹膜識別,人臉識別等

密碼 - 泄漏渠道

  • 數據庫被偷
  • 服務器被入侵
  • 通信被竊聽
  • 內部人員泄漏數據
  • 其餘網站(撞庫)

若是一個網站的用戶數據泄露,不少用戶可能用同一個帳號密碼去註冊不一樣的網站,這就叫撞庫。

密碼 - 存儲

  • 嚴禁明文存儲(防泄露)
  • 單向變換(防泄露)

在存儲密碼的時候,只能由明文向密文變換,反之不能夠。

  • 變換複雜度要求(防猜想)
  • 密碼複雜度要求(防猜想)
  • 加鹽(防猜想)

這是防止用戶密碼設置的過於簡單,在密碼進行加密的時候在密碼上再增長一串數字,使得加密後的密碼更加安全。

哈希算法

  • 明文 - 密文一一對應
  • 雪崩效應

當明文有一點變換的時候,密文不是改變一點,而是全盤變化。

  • 密文 - 明文沒法反推

hash算法是一種信息摘要算法,咱們無法經過一段信息摘要計算出原始明文。

  • 密文固定長度

通常hash算法的結果都是32位字符串

  • 常見哈希算法:md5 sha1 sha256

彩虹表破解哈希算法

因爲哈希算法是不可逆的,所以網絡上能夠創建窮舉數據庫來破解哈希算法,而這種數據庫叫作彩虹表。

因爲單層哈希加密容易破解(容易被彩虹表窮舉),所以能夠採用多重哈希增大破解難度。

md5(明文)=密文
md5(md5(明文))=密文
md5(sh1(明文))=密文
md5(sh1(sh256(明文)))=密文

密碼 - 變化次數越多越安全

  • 加密成本幾乎不變(生成密碼時速度慢一些)
  • 彩虹表失效(數量太大,沒法創建通用性)
  • 解密成本增大N倍

增大密碼傳輸的安全性

  • https傳輸
  • 頻率限制

驗證碼策略限制用戶每分鐘只能登錄幾回,防止窮舉破解。

  • 前端加密意義有限

首先前端加密並不能保證傳輸的安全性,竊聽者拿到傳輸的密文後也能夠模擬用戶請求,從而進行進一步信息盜取,可是前端加密能夠保證竊聽者不能拿到明文,對撞庫效應有必定安全保證,覺得每一個網站的加密算法是不同的。

生物特徵密碼

  • 指紋(脣紋)
  • 聲紋
  • 虹膜
  • 人臉

生物特徵密碼的安全性

  • 私密性 - 容易泄露

指紋,人臉容易在照片中出現,容易泄露。

  • 安全性 - 碰撞

生物特徵密碼都是經過類似度匹配,並不能徹底保證兩個很類似的人臉或其餘生物特徵不會出現碰撞。

  • 惟一性 終身惟一 - 沒法修改

因爲咱們的生物特徵通常都是惟一的,好比指紋,若是被泄漏,就沒法更改。

👺 接入層注入問題(sql注入問題)

值得一提的是,sql注入遠遠比看到的簡單實例複雜的多,幾乎均可以做爲一門學科學習,而且其衍生分支不少。因此其危害是很大的。

一些神奇的 SQL 語法

  • select * from table where id="10" and 1=0
  • select * from table where id="10" or 1=1
  • select * from table where id="10" and mid(version(),1,1)=5

檢測服務器環境信息,從而根據環境信息來進行一些非法操做。

  • select 1,2,3 from table

檢查一個表有多少列。

  • select id,1,2,3 from table
  • select* from table union select 1,2,3 from table2
  • select * from table where mid(username,1,1)="t"

用於猜解用戶名密碼,咱們知道,若是用戶名密碼特別複雜的狀況下,進行窮舉破解的成本會很是高,可是若是一位一位的破解的話,則會簡單不少,上面的sql則提供了這種功能。

SQL 注入危害

  • 猜解密碼
  • 獲取數據
  • 刪庫刪表
  • 拖庫

SQL 注入防護

  • 關閉錯誤輸出
  • 檢查數據類型
  • 對數據進行轉義

這個方法相似於XSS的黑名單和白名單過濾功能,可是基於sql注入的變種等因素,這種方法並不能很好的防治sql注入。因策功能有限。

  • 使用參數化查詢

這是sql注入最主要的防護手段,基於數據庫提供的參數化查詢的功能,其主要原理爲:對於一條查詢,先將預查詢語句給到數據庫,好比select * from table where id=?,以後再把所缺的參數給到數據庫,這樣全部注入內容都是簡單的參數,也就沒有注入執行的危害了。

  • 使用 ORM(對象關係映射)

通常ORM框架都會解決注入問題,不管用上面哪一種方法。

👺 接入層上傳問題

上傳問題

  • 上傳文件
  • 再次訪問上傳的文件
  • 上傳的文件被當成程序解析

上傳問題防護

  • 限制上傳後綴
  • 文件類型檢查
  • 文件內容檢查
  • 程序輸出

以上三種防護功能比較有限,而程序輸出是指,當用戶再次讀取上傳的文件的時候,服務器已二進制碼的方式給用戶,這樣就算是可執行文件也無法執行了。

  • 權限控制-可寫可執行互斥

這種相似Linux下的目錄下文件權限,只有讀寫權限,沒有執行權限。

👺 信息泄露

特徵

  • 泄露系統敏感信息
  • 泄露用戶敏感信息
  • 泄露用戶密碼

信息泄露的途徑

  • 錯誤信息失控

當系統報錯的時候,因爲沒有控制好錯誤堆棧的打印控制,使得一些敏感信息在錯誤堆棧中暴露,如連接字符串等。

  • SQL注入
  • 水平權限控制不當

注意和垂直權限控制作區分,垂直權限指的是咱們熟悉的管理員/普通用戶的區別。而水平權限控制則指的是同一權限的人在進行操做的時候可能出現的信息泄露問題。

  • XSS/CSRF

社會工程學

  • 你的身份由你掌握的資料肯定
  • 別人掌握了你的資料
  • 別人假裝成你的身份
  • 利用你的身份幹壞事

其實對於互聯網上「誰是我」這個話題,當愈來愈多的咱們方方面面的資料被別人掌握時,攻擊者就約可能模擬「真我」去實施一些噁心行爲或是盜取「真我」的一些有價值的東西。

利用oAuth思想防止資料泄露

graph LR 敏感資料-->|5. 返回票據對應數據|業務; 業務-->|4. 帶票據請求|敏感資料; 業務-->|3. 帶票據請求|用戶; 用戶-->|6. 返回數據|業務; 用戶-->|1. 登入|敏感資料; 敏感資料-->|2. 派發票據|用戶;
  • 用戶受權讀取資料

當用戶未受權的狀況下誰也不容許讀取資料,這樣能更好的方式業務開發人員不當的操做也不軌的行爲。由於業務開發人員大大高於用戶資料服務的開發人員。

  • 無受權的資料不可讀取
  • 不容許批量獲取數據

不容許批量獲取資料能更有效的控制大量用戶資料被盜的狀況。

  • 數據接口可風控申紀

當若是真的有用戶資料出現丟失的狀況下,能夠有效的進行過後追蹤,肯定問題出現的緣由。

👺 其餘安全問題

  • 拒絕服務DOS
  • 重放攻擊
第一個:拒絕服務攻擊DOS
  • 模擬正經常使用戶
  • 佔用大量服務器
  • 沒法服務正經常使用戶

攻擊者經過模擬用戶的請求並大量去請求目標服務器使得服務器的負載很是大或者大量佔用服務器的帶寬,使得正經常使用戶無法進行正常訪問。而且若是當大量帶寬被佔用的時候,寬帶提供商爲了保證網絡信道的通暢,只能將受攻擊的服務器下線,所以受攻擊的服務器無法爲用戶提供正常服務。 其攻擊形式主要有:

  1. TCP半鏈接:就是在三次握手的時候,只是作一次請求連接操做,不作後續的對服務器的響應,致使服務器覺得有請求要真的連接它,形成服務器沒必要要的等待從而進行的攻擊。
  2. HTTP連接:這種就是模擬正常的請求鏈接進行大連服務請求的形式。
  3. DNS攻擊,DNS服務器的負載能力每每比正常大型服務器低,當大量攻擊請求致使DNS服務器無法爲正經常使用戶服務的時候,致使無法進行域名解析服務,也就形成DOS的真正攻擊出現。

大規模分佈式拒絕服務攻擊DDOS

  • 流量可達幾十到上百G
  • 分佈式(肉雞,代理)
  • 極難防護

這種攻擊是攻擊者可能經過病毒的方式控制了別人的機器,所以攻擊發起地點多是從不一樣的地方進行攻擊,每一個地點的攻擊流量可能不大,可是總和卻很巨大。這些被控制的機器就叫作「肉雞」,還有可能經過代理服務器的方式進行攻擊。

DOS攻擊防護

  • 防火牆
  • 交換機、路由器
  • 流量清洗
  • 高防IP

購買雲計算廠商的服務,讓其做爲代理,這樣在遇到這種狀況的時候,高防IP服務器會預先對請求進行流量清晰等防護操做,以後再將正常的請求分發給本身的服務器。

  • 避免重邏輯業務
  • 快速失敗快速返回
  • 防止雪崩機制

儘可能避免失敗重試,形成惡性滾雪球事件的發生

  • 有損服務

這種就是在收到攻擊的時候能及時的停掉有問題的服務,保證核心服務能正常運行。

  • CDN

經過CDN來減輕服務器的負載,將一部分負載轉移到CDN上來完成

第二個:重放攻擊
  • 用戶被屢次消費
  • 用戶登陸態被盜取
  • 屢次抽獎

這種攻擊就是當有有問題的請求被攻擊者拿取到以後,從而進行重複這種請求的一種攻擊。還有就是在消費、抽獎等活動中用戶重複這種過程致使異常訂單的出現等惡性結果。

重放攻擊防護

  • 加密(HTTPS)
  • 時間戳限定請求的有效期
  • token(session)

一個請求只能發送一次,當第二次發送token尚未變化,則標記這次請求無效

  • nonce:相似token
  • 數字簽名
相關文章
相關標籤/搜索