什么是xss芽隆?
- 定義
- cross site script垮站腳本攻擊
- demo:
<script>alert('alert')</script>
- cross site script垮站腳本攻擊
- 類型
- 反射型XSS(訪問鏈接時)
- 存儲型XSS(服務器上)
- DOM形(客戶端解析錯誤)
- 我們遇到的就是這樣碴裙,頁面有很多可以直接寫入的地方,沒有進行代碼的轉譯雷酪。講一些特殊符號轉譯成特殊字符泽西。
- alert,input,localstroage,cookie,document.write等等都可以注入
- 一般的防范措施
- 前端 htmlEnCode
- 進行必要的轉譯九串,替換囤官,檢查特殊符號生棍,>,',<,&颤霎,\等等
- 輸入輸出的過濾和數(shù)據(jù)轉義
- URL校正
- 使用更加安全的Https
- HTML Attribute
- 前端 htmlEnCode
-
現(xiàn)實的解決方法
- 1 可以在站點頁面加上主動監(jiān)測代碼,通過瀏覽器的performance來檢測頁面是否發(fā)出不在白名單的網(wǎng)絡請求,主要是腳本文件…
- 2 可以重寫docmentwrite防止頁面被篡改捷绑,
- 3 可以在頁面模板變量加包裝函數(shù),如果發(fā)現(xiàn)非法內容主動上報
- 4 使用更加安全的https://
- 你知道CRSF嗎氢妈?
CSRF是偽造客戶端請求的一種攻擊粹污,CSRF的英文全稱是Cross Site Request Forgery,字面上的意思是跨站點偽造請求首量。
CSRF的定義是強迫受害者的瀏覽器向一個易受攻擊的Web應用程序發(fā)送請求,最后達到攻擊者所需要的操作行為壮吩。CSRF漏洞的攻擊一般分為站內和站外兩種類型:
CSRF站內類型的漏洞在一定程度上是由于程序員濫用$_REQUEST類變量造成的,一些敏感的操作本來是要求用戶從表單提交發(fā)起POST請求傳參給程 序加缘,但是由于使用了$_REQUEST等變量鸭叙,程序也接收GET請求傳參,這樣就給攻擊者使用CSRF攻擊創(chuàng)造了條件拣宏,一般攻擊者只要把預測好的請求參數(shù) 放在站內一個貼子或者留言的圖片鏈接里沈贝,受害者瀏覽了這樣的頁面就會被強迫發(fā)起請求。
CSRF站外類型的漏洞其實就是傳統(tǒng)意義上的外部提交數(shù)據(jù)問題勋乾,一般程序員會考慮給一些留言評論等的表單加上水印以防止SPAM問題宋下,但是為了用戶的體驗 性,一些操作可能沒有做任何限制辑莫,所以攻擊者可以先預測好請求的參數(shù)学歧,在站外的Web頁面里編寫javascript腳本偽造文件請求或和自動提交的表單 來實現(xiàn)GET、POST請求各吨,用戶在會話狀態(tài)下點擊鏈接訪問站外的Web頁面枝笨,客戶端就被強迫發(fā)起請求。
-
==javascriptCode代碼實現(xiàn)==
//使用“\”對特殊字符進行轉義揭蜒,除數(shù)字字母之外横浑,小于127使用16進制“\xHH”的方式進行編碼,大于用unicode(非常嚴格模式)忌锯。
var JavaScriptEncode = function(str){
var hex=new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
function changeTo16Hex(charCode){
return "\\x" + charCode.charCodeAt(0).toString(16);
}
function encodeCharx(original) {
var found = true;
var thecharchar = original.charAt(0);
var thechar = original.charCodeAt(0);
switch(thecharchar) {
case '\n': return "\\n"; break; //newline
case '\r': return "\\r"; break; //Carriage return
case '\'': return "\\'"; break;
case '"': return "\\\""; break;
case '\&': return "\\&"; break;
case '\\': return "\\\\"; break;
case '\t': return "\\t"; break;
case '\b': return "\\b"; break;
case '\f': return "\\f"; break;
case '/': return "\\x2F"; break;
case '<': return "\\x3C"; break;
case '>': return "\\x3E"; break;
default:
found=false;
break;
}
if(!found){
if(thechar > 47 && thechar < 58){ //數(shù)字
return original;
}
if(thechar > 64 && thechar < 91){ //大寫字母
return original;
}
if(thechar > 96 && thechar < 123){ //小寫字母
return original;
}
if(thechar>127) { //大于127用unicode
var c = thechar;
var a4 = c%16;
c = Math.floor(c/16);
var a3 = c%16;
c = Math.floor(c/16);
var a2 = c%16;
c = Math.floor(c/16);
var a1 = c%16;
return "\\u"+hex[a1]+hex[a2]+hex[a3]+hex[a4]+"";
}
else {
return changeTo16Hex(original);
}
}
}
var preescape = str;
var escaped = "";
var i=0;
for(i=0; i < preescape.length; i++){
escaped = escaped + encodeCharx(preescape.charAt(i));
}
return escaped;
}
-
==htmlCode代碼實現(xiàn)==
var HtmlUtil = {
htmlEncode:function (html){
var temp = document.createElement ("div");
(temp.textContent != undefined ) ? (temp.textContent = html) : (temp.innerText = html);
var output = temp.innerHTML;
temp = null;
return output;
},
htmlDecode:function (text){
var temp = document.createElement("div");
temp.innerHTML = text;
var output = temp.innerText || temp.textContent;
temp = null;
return output;
},
htmlEncodeByRegExp:function (str){
var s = "";
if(str.length == 0) return "";
s = str.replace(/&/g,"&");
s = s.replace(/</g,"<");
s = s.replace(/>/g,">");
s = s.replace(/ /g," ");
s = s.replace(/\'/g,"'");
s = s.replace(/\"/g,""");
return s;
},
htmlDecodeByRegExp:function (str){
var s = "";
if(str.length == 0) return "";
s = str.replace(/&/g,"&");
s = s.replace(/</g,"<");
s = s.replace(/>/g,">");
s = s.replace(/ /g," ");
s = s.replace(/'/g,"\'");
s = s.replace(/"/g,"\"");
return s;
}
};
Test 代碼
<button onclick='alert("1\x29\x3balert\x282\u54c8\u54c8\x29")'>測試JavaScriptEncode值</button>
<div><script>alert('1哈哈' /);</script></div>
參考: