常見web攻擊

xss

XSS (Cross-Site Scripting),跨站指令碼攻擊,因為縮寫和 CSS重疊,所以只能叫 XSS。

「跨站指令碼攻擊」

是指透過存在安全漏洞的Web⽹站註冊⽤戶的瀏覽器內運⾏⾮法的HTML標籤或JavaScript 進⾏的⼀種攻擊。

跨站指令碼攻擊有可能造成以下影響:

利⽤虛假輸⼊表單騙取⽤戶個⼈資訊。

利⽤指令碼竊取⽤戶的Cookie值,被害者在不知情的情況下,幫助攻擊者傳送惡意請求。

顯示偽造的⽂章或圖⽚。

xss攻擊分類

反射型 - url引數直接注⼊

// 普通http://localhost:3000/?from=china// alert嘗試http://localhost:3000/?from=// 獲取Cookiehttp://localhost:3000/?from=// 短域名偽造 https://dwz。cn/// 偽造cookie⼊入侵 chromedocument。cookie=“kaikeba:sess=eyJ1c2VybmFtZSI6Imxhb3dhbmciLCJfZXhwaXJlIjoxNTUzNTY1MDAxODYxLCJfbWF4QWdlIjo4NjQwMDAwMH0=

儲存型 - 儲存到DB後讀取時注⼊

// 評論// 跨站指令碼注⼊入我來了了XSS攻擊的危害 - Scripting能⼲啥就能⼲啥

XSS攻擊的危害 - Scripting能⼲啥就能⼲啥

獲取⻚⾯資料

獲取Cookies

劫持前端邏輯

傳送請求

偷取⽹站的任意資料

偷取⽤戶的資料

偷取⽤戶的秘密和登入態

欺騙⽤戶

防範⼿段

ejs轉義⼩知識

<% code %>⽤用於執行其中javascript程式碼;<%= code %>會對code進行html轉義;<%- code %>將不會行轉義

HEAD

ctx。set(‘X-XSS-Protection’, 0) // 禁止XSS過濾// http://localhost:3000/?from= 可以攔截 但偽一下就不行了

0代表禁⽌XSS過濾。

啟⽤XSS過濾(通常瀏覽器是預設的)。 如果檢測到跨站指令碼攻擊,瀏覽器將清除⻚⾯(刪除 不安全的部分)。

mode=block 啟⽤XSS過濾。 如果檢測到攻擊,瀏覽器將不會清除⻚⾯,⽽是阻⽌⻚⾯載入。

report= (Chromium only)

啟⽤XSS過濾。 如果檢測到跨站指令碼攻擊,瀏覽器將清除⻚⾯並使⽤CSP report-uri 指令的 功能傳送違規報告。

CSP

「內容安全策略」

(CSP, Content Security Policy) 是⼀個附加的安全層,⽤於幫助檢測和緩解 某些型別的攻擊,包括跨站指令碼 (XSS) 和資料注⼊等攻擊。 這些攻擊可⽤於實現從資料竊 取到⽹站破壞或作為惡意軟體分發版本等⽤途。

CSP 本質上就是建⽴⽩名單,開發者明確告訴瀏覽器哪些外部資源可以載入和執⾏。我們 只需要配置規則,如何攔截是由瀏覽器⾃⼰實現的。我們可以透過這種⽅式來儘量減少 XSS 攻擊。

跳脫字元

⿊名單

⽤戶的輸⼊永遠不可信任的,最普遍的做法就是轉義輸⼊輸出的內容,對於引號、尖括號、斜 槓進⾏轉義,對於富⽂本來說,顯然不能透過上⾯的辦法來轉義所有字元,因為這樣會把需要的格式也過濾掉。 對於這種情況,通常採⽤⽩名單過濾的辦法,當然也可以透過⿊名單過濾,但是考慮到需要過 濾的標籤和標籤屬性實在太多,更加推薦使⽤⽩名單的⽅式。

⽩名單

HttpOnly Cookie

這是預防XSS攻擊竊取⽤戶cookie最有效的防禦⼿段。Web應 ⽤程式在設定cookie時,將 其屬性設為HttpOnly,就可以避免該⽹⻚的cookie被客戶端惡意JavaScript竊取,保護⽤ 戶cookie資訊。

response。addHeader(”Set-Cookie“, ”uid=112; Path=/; HttpOnly“)

CSRF

CSRF(Cross Site Request Forgery),即跨站請求偽造,是⼀種常⻅的Web攻擊,它利⽤⽤戶已 登入的身份,在⽤戶毫不知情的情況下,以⽤戶的名義完成⾮法操作。

⽤戶已經登入了站點 A,並在本地記錄了 cookie

在⽤戶沒有登出站點 A 的情況下(也就是 cookie ⽣效的情況下),訪問了惡意攻擊者提供的引 誘危險站點 B (B 站點要求訪問站點A)。

站點 A 沒有做任何 CSRF 防禦

登入 http://localhost:4000/csrf。html

CSRF攻擊危害

利⽤⽤戶登入態

⽤戶不知情

完成業務請求

盜取⽤戶資⾦(轉賬,消費)

冒充⽤戶發帖背鍋

損害⽹站聲譽

防禦

禁⽌第三⽅⽹站帶Cookie - 有相容性問題

Referer Check - Https不傳送referer

驗證碼

點選劫持 - clickjacking

點選劫持是⼀種視覺欺騙的攻擊⼿段。攻擊者將需要攻擊的⽹站透過 iframe 巢狀的⽅式嵌⼊⾃ ⼰的⽹⻚中,並將 iframe 設定為透明,在⻚⾯中透出⼀個按鈕誘導⽤戶點選。

// 登入http://localhost:4000/clickjacking。html

防禦

X-FRAME-OPTIONS

X-FRAME-OPTIONS 是⼀個 HTTP 響應頭,在現代瀏覽器有⼀個很好的⽀持。這個 HTTP 響應頭 就是為了防禦⽤ iframe 巢狀的點選劫持攻擊。

該響應頭有三個值可選,分別是

DENY,表示⻚⾯不允許透過 iframe 的⽅式展示

SAMEORIGIN,表示⻚⾯可以在相同域名下透過 iframe 的⽅式展示

ALLOW-FROM,表示⻚⾯可以在指定來源的 iframe 中展示

ctx。set(‘X-FRAME-OPTIONS’, ‘DENY’)

JS⽅式

以上程式碼的作⽤就是當透過 iframe 的⽅式載入⻚⾯時,攻擊者的⽹⻚直接不顯示所有內容了。

SQL注⼊

// 填⼊入特殊密碼1‘or’1‘=’1// 拼接後的SQLSELECT *FROM test。userWHERE username = ‘laowang’AND password = ‘1’or‘1’=‘1’

防禦

所有的查詢語句建議使⽤資料庫提供的引數化查詢接⼝**,引數化的語句使⽤引數⽽不是將⽤戶 輸⼊變數嵌⼊到 SQL 語句中,即不要直接拼接 SQL 語句。例如 Node。js 中的 mysqljs 庫的 query ⽅法中的 ? 佔位引數。

嚴格限制Web應⽤的資料庫的操作許可權**,給此⽤戶提供僅僅能夠滿⾜其⼯作的最低許可權,從⽽ 最⼤限度的減少注⼊攻擊對資料庫的危害

後端程式碼檢查輸⼊的資料是否符合預期**,嚴格限制變數的型別,例如使⽤正則表示式進⾏⼀些 匹配處理。

對進⼊資料庫的特殊字元(‘,”,\,<,>,&,*,; 等)進⾏轉義處理,或編碼轉換**。基本上 所有的後端語⾔都有對字串進⾏轉義處理的⽅法,⽐如 lodash 的 lodash。_escapehtmlchar 庫。

OS命令注⼊

// 以 Node。js 為例,假如在介面中需要從 github 下載使用者指定的 repoconst exec = require(’mz/child_process‘)。exec;let params = {/* ⽤使用者輸入的引數 */};exec(`git clone ${params。repo} /some/path`);

// 以 Node。js 為例,假如在介面中需要從 github 下載使用者指定的 repoconst exec = require(’mz/child_process‘)。exec;let params = {/* ⽤使用者輸入的引數 */};exec(`git clone ${params。repo} /some/path`);

如果傳⼊的引數是會怎樣

https://github。com/xx/xx。git && rm -rf /* &&

請求劫持

DNS劫持

顧名思義,DNS伺服器(DNS解析各個步驟)被篡改,修改了域名解析的結果,使得訪問到的不是預期 的ip

HTTP劫持 運營商劫持,此時⼤概只能升級HTTPS了

DDOS

http://www。ruanyifeng。com/blog/2018/06/ddos。html 阮⼀峰

DDOS (distributed denial of service)不是⼀種攻擊,⽽是⼀⼤類攻擊的總稱。它有⼏⼗種類型,新的攻擊⽅法還在不斷髮明出來。 ⽹站運⾏的各個環節,都可以是攻擊⽬標。只要把⼀個環節攻破,使得整個流程跑不起來,就達到了 癱瘓服務的⽬的。

其中,⽐較常⻅的⼀種攻擊是 cc 攻擊。它就是簡單粗暴地送來⼤量正常的請求,超出伺服器的最⼤承 受量,導致宕機。我遭遇的就是 cc 攻擊,最多的時候全世界⼤概20多個 IP 地址輪流發出請求,每個 地址的請求量在每秒200次~300次。我看訪問⽇志的時候,就覺得那些請求像洪⽔⼀樣湧來,⼀眨眼 就是⼀⼤堆,⼏分鐘的時間,⽇志⽂件的體積就⼤了100MB。說實話,這隻能算⼩攻擊,但是我的個 ⼈⽹站沒有任何防護,伺服器還是跟其他⼈共享的,這種流量⼀來⽴刻就下線了。

防禦⼿段

- 備份⽹站 備份⽹站不⼀定是全功能的,如果能做到全靜態瀏覽,就能滿⾜需求。最低限度應該可以顯示公告,告訴⽤戶,⽹站出了問題,正在全⼒搶修。 - HTTP 請求的攔截 硬體 伺服器 防⽕牆 - 頻寬擴容 + CDN 提⾼犯罪成本