隨著網際網路的高速發展,安全問題已成為企業最關注的焦點之一。而前端又是容易引發安全問題的“視窗”,作為開發人員的我們,更需要充分了解如何預防和修復安全漏洞。本文將列舉常見的前端安全問題,希望對你有所幫助。
本文將從以下幾種安全問題展開介紹:
- XSS攻擊
- CSRF攻擊
- SQL隱碼攻擊
- XXE漏洞
- JSON劫持
- XST攻擊
- 暴力破解
- 資訊洩露
- 其他漏洞
1. XSS攻擊
XSS攻擊全稱跨站指令碼攻擊(Cross-Site Scripting),為區別CSS,在安全領域叫做XSS。攻擊者通過在目標網站上注入惡意指令碼並執行,獲取使用者的敏感資訊如 Cookie、SessionID等,影響網站與使用者資料安全。
開始這種攻擊的案例是跨域的,所以叫做“跨站指令碼”。但是發展到今天,由於JS的強大以及網站前端應用的複雜化,是否跨域已經不再重要。但由於歷史原因,XSS這個名字卻一直保留下來。
本質是惡意程式碼未經過濾,與網站正常的程式碼混在一起,瀏覽器無法分辨哪些指令碼是可信的,導致惡意指令碼執行。
XSS攻擊要素
- 攻擊者提交惡意程式碼
- 瀏覽器執行惡意程式碼
XSS攻擊分類
型別 | 儲存區 | 插入點 |
---|---|---|
反射型XSS | URL | HTML |
儲存型XSS | 後端資料庫 | HTML |
DOM型XSS | 後端資料庫/前端儲存/URL | 前端JS |
反射型XSS攻擊
反射型XSS只是把使用者輸入的資料“反射”給瀏覽器,攻擊者往往需要誘使使用者操作一個惡意連結,才能攻擊成功。反射型XSS也叫做“非持久型XSS”(Non-persistent XSS)
儲存型XSS攻擊
儲存型XSS會把使用者輸入的資料“儲存”在伺服器端,這種XSS具有很強的穩定性
比較常見的一個場景就是,黑客寫下一篇包含有惡意JS程式碼的部落格文章,發表後,所有訪問該部落格文章的使用者都會在他們的瀏覽器中執行這段惡意的JS程式碼。黑客把惡意的指令碼儲存到伺服器端,所以這種XSS攻擊就叫做“儲存型XSS”
儲存型XSS通常也叫做“持久型XSS”(Persistent XSS)
DOM型XSS攻擊
DOM型XSS從效果上來說也是反射型XSS,通過修改頁面的DOM節點形成XSS,稱之為DOM型XSS
實際上,這種型別的XSS並非按照“資料是否儲存在伺服器端”來劃分,單獨劃分出來,是因為DOM型XSS的形成原因比較特別,發現它的安全專家專門提出了這種型別的XSS。出於歷史原因,也就把它單獨作為一個分類了。
XSS攻擊型別區別
-
儲存型XSS的惡意程式碼存在資料庫裡,反射型XSS的惡意程式碼存在URL裡
-
DOM型XSS攻擊中,取出和執行惡意程式碼由瀏覽器端完成,屬於前端JS自身的安全漏洞,而其他兩種XSS都屬於服務端的安全漏洞
XSS攻擊檢測
-
使用XSS攻擊字串手動檢測XSS漏洞 github.com/0xsobky/Hac…
-
使用掃描工具自動檢測XSS漏洞 例如Arachni、Mozilla HTTP Observatory、w3af等
XSS攻擊防禦
- 輸入輸出檢查
- 避免內聯事件
- 富文字類使用標籤白名單
- 增加攻擊難度,降低攻擊後果
- 增加驗證碼,防止指令碼冒充使用者提交危險操作
- 通過CSP、輸入長度配置、介面安全措施等方法
- 主動檢測發現
針對以上總結的XSS攻擊的防禦方法,我們再來針對CSP與HttpOnly進行進一步的瞭解與分析:
-
CSP (Content Security Policy)
- 禁止載入外域程式碼,防止複雜的攻擊邏輯
- 禁止外域提交,網站被攻擊後,使用者的資料不會洩露到外域
- 禁止內聯指令碼執行
- 禁止未授權的指令碼執行
- 合理使用上報可以及時發現XSS,利於儘快修復問題
-
HttpOnly Cookie
禁止JS讀取敏感Cookie,攻擊者完成XSS注入後也無法竊取Cookie
XSS攻擊帶來的不光是Cookie劫持問題,還有竊取使用者資訊、模擬使用者身份執行操作 攻擊者利用AJAX構造HTTP請求,以使用者身份完成的操作,就是在不知道使用者Cookie的情況下進行的。
2. CSRF攻擊
CSRF(Cross-site request forgery)跨站請求偽造,攻擊者盜用受害人身份,以受害人的名義傳送惡意請求。 其本質是重要操作的所有引數都是可以被攻擊者猜測到的,攻擊者只有預測出URL的所有引數與引數值,才能成功地構造一個偽造的請求;反之,攻擊者將無法攻擊成功。
CSRF攻擊要素
- 攻擊一般發起在第三方網站,被攻擊的網站無法防止攻擊發生
- 攻擊利用受害者在被攻擊網站的登入憑證,冒充受害者提交操作,而不是直接竊取資料
- 整個過程攻擊者並不能獲取受害者登入憑證,只是冒用
- 跨站請求可以是圖片URL、超連結、CORS、Form提交等
CSRF攻擊防禦
-
阻止不明外域的訪問
- 同源檢測
- 如何判斷請求是否來自外域?HTTP協議中,每一個非同步請求都會攜帶兩個Header,用於標記來源域名:Origin Header、Referer Header,這兩個Header在瀏覽器發起請求時,大多數情況會自動帶上,並且不能由前端自定義內容。伺服器可以通過解析這兩個Header中的域名,確定請求的來源域。
- Samesite Cookie
- SameSite-cookies 是Google起草的一份草案來改進HTTP協議,就是為Set-Cookie響應頭新增Samesite屬性,用來標明這個Cookie是個“同站 Cookie”,同站Cookie只能作為第一方Cookie,不能作為第三方Cookie,Samesite 有兩個屬性值,分別是Strict和Lax:
- Samesite=Strict:嚴格模式,表明這個 Cookie 在任何情況下都不可能作為第三方 Cookie,絕無例外
- Samesite=Lax:寬鬆模式
- SameSite-cookies 是Google起草的一份草案來改進HTTP協議,就是為Set-Cookie響應頭新增Samesite屬性,用來標明這個Cookie是個“同站 Cookie”,同站Cookie只能作為第一方Cookie,不能作為第三方Cookie,Samesite 有兩個屬性值,分別是Strict和Lax:
- 同源檢測
-
提交時要求附加本域才能獲取的資訊
- CSRF Token
- 將CSRF Token輸出到頁面中
- 頁面提交的請求攜帶這個Token
- 伺服器驗證Token是否正確
- 雙重Cookie驗證
- 使用者訪問網站頁面時,向請求域名注入一個Cookie,前端向後端發起請求時,取出Cookie,新增到URL的引數中,後端介面驗證Cookie中的欄位與URL引數中的欄位是否一致,不一致則拒絕。
- 優點:無需使用Session,適用面更廣,易於實施。Token儲存於客戶端中,不會給伺服器帶來壓力。相對於Token,實施成本更低,可以在前後端統一攔截校驗,而不需要一個個介面和頁面新增。
- 缺點:Cookie中增加了額外的欄位;如果有其他漏洞(例如XSS),攻擊者可以注入Cookie,那麼該防禦方式失效。難以做到子域名的隔離。為了確保Cookie傳輸安全,採用這種防禦方式的最好確保用整站HTTPS的方式,如果還沒切HTTPS的使用這種方式也會有風險。
- CSRF Token
CSRF測試
- 設定瀏覽器代理
- 使用合法賬戶訪問網站開始測試
- 通過CSRF修改並偽造請求
- 拿到結果如有漏洞進行修復
3. SQL隱碼攻擊
通過Web應用介面注入SQL語法,破壞原有SQL結構,達到攻擊行為。 如果網站存在注入漏洞,相當於將資料庫直接暴露在攻擊者面前 根據注入位置及方式不同分分為POST注入、GET注入、cookie注入、盲注、延時注入、搜尋注入、base64注入等
SQL隱碼攻擊要素
- 跳過賬戶許可權驗證達到越權
- 獲取資料庫關鍵資訊從而進行脫庫
- 特別情況下還可以修改資料庫內容,如果資料庫許可權分配存在問題,攻擊者可以通過SQL隱碼攻擊漏洞直接獲取webshell或者伺服器系統許可權
SQL隱碼攻擊防禦
- 資料校驗
- 檢查資料格式
- 使用資料庫特定的敏感字元轉義函式把使用者提交資料進行轉義
- 許可權限制
- 日誌處理
- 資料庫操作失敗的時,儘量不將原始錯誤日誌返回,如型別錯誤、欄位不匹配等,把程式碼裡的SQL語句暴露出來,以防止攻擊者利用錯誤資訊進行SQL隱碼攻擊
4. XXE漏洞
XXE (XML External Entity)外部實體漏洞,當應用程式解析XML輸入時,如果沒有禁止外部實體的載入,導致可載入惡意外部檔案和程式碼,造成任意檔案讀取、命令執行、內網埠掃描等攻擊。只在能夠接收XML格式引數的介面才會出現
XXE漏洞防禦
- 禁用外部實體
- 過濾使用者提交的XML資料
5. JSON劫持
JSON劫持(JSON Hijacking)是用於獲取敏感資料的一種攻擊方式,屬於CSRF攻擊的範疇
JSON劫持防禦
- X-Requested-With標識
- 瀏覽器JSON資料識別
- 禁止JS執行JSON資料
6. XST攻擊
XST攻擊(cross-site tracing)當Web伺服器啟用TRACE時,提交的請求頭會在伺服器響應Body中完整返回,其中HTTP頭很可能包括Session Token、Cookies或其它認證資訊,攻擊者可以利用漏洞獲取使用者資訊
XST攻擊防禦
禁用HTTP TRACE方法
7. 暴力破解
弱密碼(Weak Password)被他人猜到或被破解工具暴力破解
暴力破解防禦
- 增加密碼複雜度
- 限制嘗試次數
8. 資訊洩漏
Web伺服器或應用程式沒有正確處理一些特殊請求,洩露 敏感資訊,如使用者名稱、密碼、原始碼、伺服器資訊、配置資訊等
資訊洩漏防禦
- 應用程式報錯時,不對外產生除錯資訊
- 過濾使用者提交的資料與特殊字元
- 保證原始碼、伺服器配置安全
9. 其他漏洞
- 目錄遍歷漏洞
- 命令執行漏洞
- 檔案上傳漏洞
- 業務漏洞
- 框架或應用漏洞
參考資料
- 《白帽子講Web安全》
- 《Web前端黑客技術揭祕》
- 美團技術團隊前端安全系列文章
- web 應用常見安全漏洞一覽