1、XSS:跨站腳本攻擊
就是攻擊者想盡一切辦法將可以執行的代碼注入到網頁中。攻擊者在web頁面惡意插入HTML或script標簽,當用戶瀏覽該頁面時,惡意代碼就會被執行,從而達到攻擊的目的。XSS利用的是用戶對指定網站的信任。
比如:攻擊者在qq中發送一個看似安全的鏈接,騙取用戶點擊之后,竊取cookie中的用戶私密信息;或者攻擊者在論壇中加一個惡意表單,當用戶提交表單的時候,卻把信息傳送到攻擊者的服務器中,而不是用戶原本以為信任的站點。
1.類型
- 反射型(非持久 服務端):攻擊者事先制作好攻擊鏈接,需要欺騙用戶自己去點擊鏈接才能觸發XSS代碼,所謂反射型XSS就是將惡意用戶輸入的js腳本,反射到瀏覽器執行。
- 儲存型(持久型 服務端):會把攻擊者的數據儲存到服務端,攻擊行為將伴隨攻擊數據一直存在,每當用戶訪問該頁面就會觸發代碼執行。
- DOM型(瀏覽器端):基于文檔對象模型的漏洞。取出和執行惡意代碼由瀏覽器端完成,屬于前端 JavaScript 自身的安全漏洞,而其他兩種 XSS 都屬于服務端的安全漏洞。
2.危害
盜取網頁瀏覽中的cookie值,盜用cookie實現無密碼登錄,盜取用戶信息。
劫持訪問,實現惡意跳轉。
配合CSRF攻擊完成惡意請求。
3.防御方法
- 標簽過濾,如<script>、<img>、<a>標簽等
- 對數據進行嚴格的輸出編碼,對字符< 、>、&、" 、' 、+、/等進行轉義。
- 開啟瀏覽器XSS防御:Http Only cookie,禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入后也無法竊取此 Cookie。
- 純前端渲染,明確innerText、setAttribute、style,將代碼與數據分隔開。
- 避免拼接HTML;Vue/React 技術棧,避免使用 v-html / dangerouslySetInnerHTML
盡量采用post而非get提交表單
2、CSRF:跨站請求偽造
攻擊者誘導受害者進入第三方網站,在第三方網站中,向被攻擊網站發送跨站請求。利用受害者在被攻擊網站已經獲取的注冊憑證,繞過后臺的用戶驗證,達到冒充用戶對被攻擊的網站執行某項操作的目的。(通過偽造連接請求,在用戶不知情的情況下,讓用戶以自己的身份來完成非本意操作的攻擊方法。CSRF利用的是網站對瀏覽器的信任。)
攻擊類型
- i)GET型:如在頁面的某個 img 中發起一個 get 請求
- ii)POST型:通過自動提交表單到惡意網站
- iii)鏈接型:需要誘導用戶點擊鏈接
預防方案:
CSRF通常從第三方網站發起,被攻擊的網站無法防止攻擊發生,只能通過增強自己網站針對CSRF的防護能力來提升安全性。)
- 驗證碼:對敏感操作加入驗證碼,強制用戶與網站進行交互
- 對Cookie設置SameSite屬性。該屬性表示Cookie不隨著跨域請求發送,可以很大程度減少CSRF的攻擊,但是該屬性目前并不是所有瀏覽器都兼容。
- 使用POST請求,避免使用GET,降低攻擊風險,post請求攻擊方需要構造一個form表單才可以發起請求,比get請求(img的src,a標簽的href等等)的攻擊方式復雜了一些,相對來說能降低風險,但不能阻止。
- 只允許GET請求檢索數據,但是不允許它修改服務器上的任何數據
- 檢查HTTP中的referer字段,該字段記錄了HTTP請求的來源地址
- 可以在 HTTP 請求中以參數的形式加入一個隨機產生的 token,并在服務器端建立一個攔截器來驗證這個 token,如果請求中沒有 token 或者 token 內容不正確,則認為可能是 CSRF 攻擊而拒絕該請求。
- 在http中自定義屬性并驗證。
- 為頁面增加隨機數
當用戶訪問站點時,該站點應該生成一個(密碼上很強壯的)偽隨機值,并在用戶的計算機上將其設為cookie。站點應該要求每個表單都包含該偽隨機 值(作為表單值和cookie值)。當一個POST請求被發給站點時,只有表單值和cookie值相同時,該請求才會被認為是有效的。
.XSS與CSRF有什么區別嗎?
XSS是獲取信息,不需要提前知道其他用戶頁面的代碼和數據包。CSRF是代替用戶完成指定的動作,需要知道其他用戶頁面的代碼和數據包。
要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
登錄受信任網站A,并在本地生成cookie。
在不登出A的情況下,訪問危險網站B。
3、點擊挾持
ClickJacking點擊劫持
當訪問某網站時,利用CSS將攻擊者實際想讓你點擊的頁面進行透明化隱藏,然后在頁面后顯示 一些東西誘導讓你點擊,點擊后則會在用戶毫不知情的情況下做了某些操作,這就是點擊劫持ClickJacking。
案例:當我們點擊彈窗右上角的"X"想關閉彈窗事,跳轉到其他頁面。
iframe覆蓋
第三方網站通過iframe內嵌某一個網站,并且將iframe設置為透明不可見,將其覆蓋在其他經過偽裝的DOM上,偽裝的可點擊DOM(按鈕等)與實際內嵌網站的可點擊DOM位置相同,當用戶點擊偽裝的DOM時,實際上點擊的是iframe中內嵌的網頁的DOM從而觸發請求操作。
以下是幾種預防點擊劫持的方法:
1.X-Frame-Options HTTP 響應頭
可以使用 X-Frame-Options 響應頭,限制特定頁面在 iframe 中打開。可以使用以下響應頭:
SAMEORIGIN:允許頁面在相同域名下的任何 iframe 中打開。
DENY:不允許頁面在任何 iframe 中打開。
ALLOW-FROM uri:允許頁面在指定來源的 iframe 中打開。
2.JavaScript 防御腳本
可以使用 JavaScript 腳本來防止 iframe 的釣魚攻擊。該方法的實現原理是檢查當前的頁面是否在頂層窗口中運行,或者在特定的 frame 中運行。
3.CSP(Content-Security-Policy)
CSP 是一種響應頭,通過指定允許在頁面中運行的可信源列表來限制頁面使用的內容和資源。通過配置CSP,可以防止惡意攻擊者插入惡意腳本的能力。不過在實際實現中,需要進行不少工作,包括了解承載應用程序的網絡拓撲,掌握應用程序的功能,了解如何針對現有攻擊使用 CSP。
4.HTML5 中添加 Sandox 屬性
在 HTML5 中,可以通過添加Sandox屬性來設置同源策略。該屬性防止 iframe 中的內容訪問父窗口的 Cookies、localStorage 和其他數據,從而防止攻擊者訪問受害者的會話 ID 以及其他敏感信息。
4、URL漏洞跳轉
定義:借助未驗證的URL跳轉,將應用程序引導到不安全的第三方區域,從而導致的安全問題。
原理:黑客構建惡意鏈接(鏈接需要進行偽裝,盡可能迷惑),發在QQ群或者是瀏覽量多的貼吧/論壇中。安全意識低的用戶點擊后,經過服務器或者瀏覽器解析后,跳到惡意的網站中。
繞過URL跳轉限制:
1.利用?號繞過限制
2.利用反斜杠和正斜杠繞過限制
3.利用@繞過URL限制
4.利用#號繞過
5、SQL注入
SQL注入是一種常見的Web安全漏洞,攻擊者利用這個漏洞,可以訪問或修改數據,或者利用潛在的數據庫漏洞進行攻擊。
就是通過把sql命令插入到web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
web 應用程序對用戶輸入的數據合法性沒有過濾或者是判斷,前端傳入的參數是攻擊者可以控制,并且參數帶入數據庫的查詢,攻擊者可以通過構造惡意的 sql 語句來實現對數據庫的任意操作。
預防 SQL 注入的方法如下:
- 參數化查詢:使用預處理語句或參數化查詢來避免 SQL 注入。
- 驗證用戶輸入:驗證用戶輸入的數據,確保其符合預期格式,避免非法字符等。
- 轉義特殊字符:在使用用戶輸入的數據構造 SQL 語句時,對特殊字符進行轉義,以防止注入。
- 限制權限:限制用戶的權限,使其不能執行不安全的 SQL 操作。
- 白名單驗證:白名單驗證是指確保用戶輸入的數據只能是允許的值,避免非法數據的輸入。
- 審核代碼:定期審核代碼,以確保代碼的安全性,特別是對于數據庫連接和查詢部分的代碼。