一、SQL注入
解釋
Web服務器執行攻擊者期望的SQL語句,以便得到數據庫中的感興趣的數據或對數據庫進行增刪改查操作。
如何產生
SQL注入的常規套路在於將SQL語句放置於Form表單或請求參數之中提交到后端服務器,后端服務器如果未做輸入安全校驗,直接將變量取出進行數據庫查詢,則極易中招。
舉例
案例1:據用戶ID獲取用戶信息的接口
- 后端的SQL語句一般是這樣:
select name,[...] from t_user whereid=$id
- 前端的請求是這樣:
GET xx/userinfo?id=1%20or%201=1
其中請求參數id轉義后就是1 or 1=1,如果后端不做安全過濾直接提交數據庫查詢, - SQL語句就變成了:
select name,[...] from t_user whereid=1or1=1
其結果是把用戶表中的所有數據全部查出,達到了黑客泄露數據的目的。
案例2:無限制登錄
- 登陸頁面輸入用戶名:admin' --,密碼隨意輸入
- 后台的SQL語句會由原來的SELECT * FROM user WHERE username='admin' AND psw='password';就會變為SELECT * FROM user WHERE username='admin' --' AND psw='xxxx';
- 這就相當於密碼部分被注釋了,成了萬能不需要密碼登陸了。
如何防御
- 嚴格限制Web應用的數據庫操作權限,如權限僅夠滿足工作即可
- 后端代碼檢查輸入的數據是否安全合規,如正則匹配
- 對入庫的特殊字符進行轉義處理或者編碼轉換
- 所有的查詢語句建議是同數據庫提供的參數化查詢接口
二、XSS 攻擊(跨站腳本攻擊)
解釋
將可執行的前端腳本代碼(js/ts等)植入到網頁中,也就是說攻擊者讓你的瀏覽器執行他寫的JS代碼。當用戶瀏覽該頁之時,嵌入其中Web里面的腳本代碼會被執行,從而可以達到攻擊者盜取用戶信息或者其他侵犯用戶安全隱私的目的。
如何產生
利用虛假輸入表單騙取用戶個人信息;利用腳本切取用戶的Cookie值,被害者在不知情的情況下,幫助攻擊者發送惡意請求;顯示偽造的文章或圖片。XSS攻擊可分為持久型(存儲型XSS)和非持久型(反射型XSS)
舉例
- 反射型
- 攻擊者將JS代碼作為請求參數放置URL中,誘導用戶點擊
- 用戶點擊后,該JS作為請求參數傳給Web服務器后端
- 后端服務器沒有檢查過濾,簡單處理后放入網頁正文中返回給瀏覽器
- 瀏覽器解析返回的網頁,中招!
- alert嘗試 http://localhost8080/?form=
slert(1) 如果有彈出,說明網站有漏洞,黑客就可以對網站發送攻擊
- 攻擊者將JS代碼作為請求參數放置URL中,誘導用戶點擊
- 存儲型
能夠將攻擊腳本入庫存儲,在后面進行查詢時,再將攻擊腳本渲染進網頁,返回給瀏覽器觸發執行- 攻擊者網頁回帖,帖子中包含JS腳本
- 回帖提交服務器后,存儲至數據庫
- 其他網友查看帖子,后台查詢該帖子的回帖內容,構建完整網頁,返回瀏覽器
- 該網友瀏覽器渲染返回的網頁,中招!
如何防御
- 轉義字符:用戶的輸入永遠不可信任,對引號、尖括號、斜杠、進行轉義
function escape(str) {
str = str.replace(/&/g, '&');
str = str.replace(/</g, '<');
str = str.replace(/>/g, '>');
str = str.replace(/"/g, '&quto;');
str = str.replace(/'/g, "'");
str = str.replace(/`/g, '`');
str = str.replace(/\//g, '/');
str = str.replace(/<\/script>/,'')
return str
}
- CSP內容安全策略(CSP,Content Security Policy):本質上就是建立白名單,配置規則告訴瀏覽器那些資源可以加載和執行
我們可以通過這種方式來盡量減少XSS攻擊
Content-Security-Policy: default-src 'self' 只允許加載本站資源
Content-security-Policy: img-src https: 只允許加載https協議圖片
Content-security-Policy:child-src 'none' 不允許加載任何來源框架
- HttpOnly Cookie:預防XSS攻擊竊取用戶cookie最有效的防御手段,Web應用程序在設置cookie時,將其屬性設為HttpOnly,就可以避免該網頁的cookie被客戶端javaScript竊取,保護用戶cookie信息
設置方法:response.addHeader('Set-Cookie','uid=12;path=/; HttpOnly')
- HEAD ctx.set('X-XSS-Protection',0) //禁止XSS過濾
- 0:禁止XSS過濾
- 1:啟用XSS過濾(通常瀏覽器是默認的)
三、CSRF 攻擊
解釋
利用用戶登錄狀態,完成其他網站的業務請求,盜取用戶資金(轉賬,消費),冒充用戶發帖背鍋,損害網站聲譽。
如何產生
CSRF,跨站請求偽造,在打開A網站的情況下,另開Tab頁面打開惡意網站B,此時在B頁面的“唆使”下,瀏覽器發起一個對網站A的HTTP請求。
- 二個條件
- 受害者已經登錄到了目標網站並且沒有退出(保持登錄狀態)
- 受害者訪問了攻擊者發布的鏈接或者表單
如何防御
- 禁止第三方網站帶cookie,IOS目前已經默認阻止了
Referer Check ----Https不發送referer
app.use(async(ctx,next)=>{ koa中間件實現
await next()
const referer = ctx.request.header.referer
})
- Same Site:對Cookie設置Same Site屬性,不隨着跨域請求發送;
- Referer Check:通過檢查HTTP包頭Referer的值是不是這個頁面的,來判斷是不是CSRF攻擊;
- Anti CSRF Token:比較完善的解決方案,即在發送請求時在HTTP請求總以參數的形式加入一個隨機產生的Token,並在服務器建立一個攔截器來驗證這個Token,服務器讀取瀏覽器當前域cookie中這個token值,進行校驗。
- 驗證碼:應用程序和用戶交互過程中,特別是賬戶交易這種核心步驟,強制用戶輸入驗證碼,才能完成最終的請求,這樣能夠很好的遏制CSRF攻擊
四、DDoS 攻擊
解釋
DDOS(分布式拒絕服務攻擊)拒絕攻擊服務顧名思義,讓服務不可用,常用於攻擊對外提供服務的服務器。
如何產生
攻擊者不斷地提出服務請求,讓合法用戶的請求無法及時處理,這就是 DoS 攻擊。攻擊者使用多台計算機或者計算機集群進行 DoS 攻擊,就是 DDo。S 攻擊是一大類攻擊的總稱,它有幾十個類型,新的攻擊方法還不斷發明出來,網站運行各個環節,都可以是攻擊目標,只要把一個環節攻破,使得整個流程、跑不起來,就得到癱瘓服務的目的。
現在的服務器早已不是一台服務器那么簡單,你訪問一個www.baidu.com的域名,背后是數不清的CDN節點,數不清的Web服務器。這種情況下,還想靠單台計算機去試圖讓一個網絡服務滿載,兼職異想天開。
常見的攻擊方式
- SYN Flood
- 此攻擊通過目標發送具有欺騙性源ip地址的大量TCP 初始鏈接請求SYN數據包來利用TCP握手,目標機器相應每個鏈請求,然后等待握手中的最后一步,這一步從未發生過,耗盡了過程中的目標資源
- HTTP Flood
- 此攻擊類似於同時在多個不同計算機上反復按web瀏覽器中的刷新,大量HTTP請求泛濫服務器,導致拒接服務
如何防御
- 備份網站:備份網站不一定是全功能的,如果能做到全靜態瀏覽,就能滿足需求,最低限度應該可以顯示公告,告訴用戶,網站出看問題,正在全力搶修
- HTTP請求攔截:硬件,服務器,防火牆,帶寬擴容,CDN ,提高犯罪成本
五、DNS劫持
解釋
顧名思義,DNS服務器(DNS解析各個步驟)被篡改,修改了域名解析的結果,使得訪問的不是預期的ip。
DNS劫持方法
- 利用DNS服務器進行DDOS攻擊
- DNS緩存感染
- DNS信息劫持
- DNS重定向
- ARP欺騙
- 本機劫持
如何防御
- 互聯網公司准備兩個以上的域名,一旦黑客進行DNS攻擊,用戶還可以訪問另一個域名。
- 手動修改DNS
- 修改路由器密碼
六、JSON 劫持
解釋
JSON是一種輕量級的數據交換格式,而劫持就是對數據進行竊取(或者應該稱為打劫、攔截比較合適)。惡意攻擊者通過某些特定的手段,將本應該返回給用戶的JSON數據進行攔截,轉而將數據發送回給惡意攻擊者,這就是JSON劫持的大概含義。一般來說進行劫持的JSON數據都是包含敏感信息或者有價值的數據。
如何產生
一些web應用會把一些敏感數據以json的形式返回到前端,如果僅僅通過cookie來判斷請求是否合法,那么就可以利用類似csrf的手段,向目標服務器發送請求,以獲得敏感數據。
比如下面的鏈接在已登錄的情況下會返回json格式的用戶信息:
攻擊者可以在自己的虛假頁面中,加入如下標簽:
<script src="http://www.test.com/userinfo"></script>
如果當前瀏覽器已經登錄了www.test.com,並且cookie未過期,然后訪問了攻擊者的虛假頁面,那么該頁面就可以拿到json形式的用戶敏感信息,因為script標簽會自動解析json數據,生成對應的js對象。然后再通過
Object.prototype.__defineSetter__
這個函數來觸發自己的惡意代碼。
但是這個函數在當前的新版本chrome和firefox中都已經失效了。
七、點擊劫持
解釋
點擊劫持是一種視覺欺騙的攻擊手段,攻擊者將需要攻擊的網站通過iframe嵌套方式嵌入自己的網頁中,並將iframe設置為透明的,在頁面中透露出一個按鈕誘導用戶點擊 通過用於各種網站,使用iframe技術,圖片點幾進入一個其他網址,導致用戶信息泄密
如何產生
用戶在登陸A網站的系統后,,被攻擊者誘惑打開第三方網站,而第三方網站通過iframe引入了A網站的頁面內容,用戶在第三方網站中點擊某個存在點擊劫持的按鈕,實際上就是點擊了A網站的按鈕。
點擊劫持的特點:隱蔽性較高,騙取用戶操作;“UI-覆蓋攻擊”;利用iframe或者其它標簽的屬性。
如何防御
- X-FRAME-OPTIONS:X-FRAME-OPTIONS 是一個HTTP響應頭,在現代瀏覽器有一個很好的支持。
參數:- DENY:表示頁面不允許通過iframe的方式展示;
- SAMEORIGIN:表示頁面可以在相同域名下通過iframe的方式展示;
- ALLOW-FROM:表示頁面可以在指定來源的iframe中展示。
- JavaScript防御:當通過ifrmae的方式加載頁面時,攻擊者的網頁直接不顯示所有內容了。
<style id="click-jack">
html{
display: none;
}
</style>
<script>
if(self == top) {
var style = document.getElementById('click-jack')
document.body.removeChild(style)
} else {
top.location = self.location
}
</script>
八、OS命令注入
解釋
- 與sql注入類似,只是OS命令是針對操作系統的。
- OS命令注入攻擊指通過Web應用,執行非法的操作系統命令達到攻擊的目的。
如何產生
- 主要在能調用shell函數的地方就存在被攻擊的風險。
- OS命令注入攻擊可以向shell發送命令,讓操作系統的命令行啟動程序、安裝程序等。
舉例
以node.js為例,假如在接口中需要從github下載用戶指定的repo
const exec = require('mz/child_process').exec;
let params = {/*用戶輸入的參數*/}
exec(`git clone ${params.repo} /some/path`)
如果傳入參數是會怎么樣
https://github.com/xx/xx.git && rm -fr /* &&
如何防御
- 后端對前端提交的內容進行規則限定,如正則表達式
- 點調用系統命令前對所有傳入參數進行命令行參數轉義過濾
- 不要直接拼接命令語句,最好借助一些工作做拼接、轉義處理,如Node.js的shell-escape npm包
九、URL跳轉漏洞
解釋
URL跳轉漏洞是指借助未驗證的URL跳轉,將應用程序引導到不安全的第三方區域,從而導致的安全問題。
如何產生
黑客利用URL跳轉漏洞來誘導安全意識低的用戶點擊,導致用戶信息泄露或者資金流失。其原理是黑客構建惡意鏈接,發送到QQ群、微信群或者貼吧/論壇中,安全意識低的用戶點擊后,經過服務器或瀏覽器解析后后,跳轉到惡意的網站中,簡單來說就是釣魚網站。
實現方式:Header跳轉、JavaScript跳轉、meta標簽跳轉。
如何防御
Referer的限制
加入有效性驗證Token
其他
暴力破解
這個一般針對密碼而言,弱密碼(Weak Password)很容易被別人(對你很了解的人等)猜到或被破解工具暴力破解。
解決方案
密碼復雜度要足夠大,也要足夠隱蔽 限制嘗試次數
HTTP 報頭追蹤漏洞
HTTP/1.1(RFC2616)規范定義了 HTTP TRACE 方法,主要是用於客戶端通過向 Web 服務器提交 TRACE 請求來進行測試或獲得診斷信息。
當 Web 服務器啟用 TRACE 時,提交的請求頭會在服務器響應的內容(Body)中完整的返回,其中 HTTP 頭很可能包括 Session Token、Cookies 或其它認證信息。攻擊者可以利用此漏洞來欺騙合法用戶並得到他們的私人信息。
解決方案
禁用 HTTP TRACE 方法。
信息泄露
由於 Web 服務器或應用程序沒有正確處理一些特殊請求,泄露 Web 服務器的一些敏感信息,如用戶名、密碼、源代碼、服務器信息、配置信息等。
解決方案
應用程序報錯時,不對外產生調試信息 過濾用戶提交的數據與特殊字符 保證源代碼、服務器配置的安全
目錄遍歷漏洞
攻擊者向 Web 服務器發送請求,通過在 URL 中或在有特殊意義的目錄中附加 ../、或者附加 ../ 的一些變形(如 ..\ 或 ..// 甚至其編碼),導致攻擊者能夠訪問未授權的目錄,以及在 Web 服務器的根目錄以外執行命令。
命令執行漏洞
命令執行漏洞是通過 URL 發起請求,在 Web 服務器端執行未授權的命令,獲取系統信息、篡改系統配置、控制整個系統、使系統癱瘓等。
文件上傳漏洞
如果對文件上傳路徑變量過濾不嚴,並且對用戶上傳的文件后綴以及文件類型限制不嚴,攻擊者可通過 Web 訪問的目錄上傳任意文件,包括網站后門文件(webshell),進而遠程控制網站服務器。
解決方案
在開發網站及應用程序過程中,需嚴格限制和校驗上傳的文件,禁止上傳惡意代碼的文件 限制相關目錄的執行權限,防范 webshell 攻擊
其他漏洞
SSLStrip 攻擊
OpenSSL Heartbleed 安全漏洞
CCS 注入漏洞
證書有效性驗證漏洞
業務漏洞
一般業務漏洞是跟具體的應用程序相關,比如參數篡改(連續編號 ID / 訂單、1 元支付)、重放攻擊(偽裝支付)、權限控制(越權操作)等。