云南網(wǎng)站建設(shè)企業(yè)個(gè)人網(wǎng)站模板
文章目錄
- XSS簡介
- 什么是XSS?
- 分類
- 反射型
- 存儲(chǔ)型
- XSS(cross site script)跨站腳本攻擊攻擊場景
- 解決方案
XSS簡介
跨站腳本( cross site script )為了避免與樣式css(Cascading Style Sheets層疊樣式表)混淆,所以簡稱為XSS。
XSS是一種經(jīng)常出現(xiàn)在web應(yīng)用中的計(jì)算機(jī)安全漏洞 ,也是web中最主流的攻擊方式。
什么是XSS?
XSS是指惡意攻擊者利用網(wǎng)站沒有對(duì)用戶提交數(shù)據(jù)進(jìn)行轉(zhuǎn)義處理或者過濾不足的缺點(diǎn),進(jìn)而添加一些代碼,嵌入到web頁面中去。使別的用戶訪問都會(huì)執(zhí)行相應(yīng)的嵌入代碼。
從而盜取用戶資料、利用用戶身份進(jìn)行某種動(dòng)作或者對(duì)訪問者進(jìn)行病毒侵害的一種攻擊方式。
分類
反射型
反射型xss攻擊( Reflected XSS)又稱為非持久性跨站點(diǎn)腳本攻擊,它是最常見的類型的XSS。漏洞產(chǎn)生的原因是攻
擊者注入的數(shù)據(jù)反映在響應(yīng)中。一個(gè)典型的非持久性XSS包含一個(gè)帶XSS攻擊向量的鏈接( 即每次攻擊需要用戶的點(diǎn)擊)。
存儲(chǔ)型
存儲(chǔ)型XSS (Stored XSS)又稱為持久型跨站點(diǎn)腳本,它一般發(fā)生在XSS攻擊向量 (一般指XSS攻擊代碼)存儲(chǔ)在網(wǎng)站數(shù)據(jù)庫,當(dāng)一個(gè)頁面被用戶打開的時(shí)候執(zhí)行。每當(dāng)用戶打開瀏覽器,腳本執(zhí)行。持久的XSS相比非持久性XSS攻擊危害性更大,因?yàn)槊慨?dāng)用戶打開頁面,查看內(nèi)容時(shí)腳本將自動(dòng)執(zhí)行。谷歌的orkut 曾經(jīng)就遭受到XSS。
兩種類型實(shí)現(xiàn)的結(jié)果完全相同,不同的是前者需要點(diǎn)擊,后者存在于網(wǎng)頁的數(shù)據(jù)庫內(nèi)
XSS(cross site script)跨站腳本攻擊攻擊場景
攻擊者可以通過構(gòu)造URL注入JavaScript、VBScript、ActiveX、HTML或者Flash的手段,利用跨站腳本漏洞欺騙用戶,收集Cookie等相關(guān)數(shù)據(jù)并冒充其他用戶。通過精心構(gòu)造的惡意代碼,可以讓訪問者訪問非法網(wǎng)站或下載惡意木馬,如果再結(jié)合其他攻擊手段(如社會(huì)工程學(xué)、提權(quán)等),甚至可以獲取系統(tǒng)的管理權(quán)限。
舉例說明
例如:在項(xiàng)目看板里待材料初審存儲(chǔ)下面代碼,點(diǎn)擊A項(xiàng)目會(huì)彈出框
Payload: <iframe οnlοad=alert("xss");></iframe>
例如 全部階段結(jié)果標(biāo)準(zhǔn)-存儲(chǔ)下面代碼,點(diǎn)擊20200927測試-2
Payload: <textarea οnfοcus=alert("xss"); autofocus>
解決方案
找到項(xiàng)目已有的filter過濾器,在過濾HttpServletRequest參數(shù)時(shí),進(jìn)行參數(shù)的處理,使用轉(zhuǎn)義,將 < 轉(zhuǎn)義為 & lt , > 轉(zhuǎn)義為 & gt
public PaasHttpRequestWrapper(HttpServletRequest request) {super(request);StringBuilder stringBuilder = new StringBuilder();InputStream inputStream = null;try {inputStream = request.getInputStream();} catch (IOException e) {throw new RuntimeException(e);}if (inputStream != null) {try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {char[] charBuffer = new char[CHAR_BUFFER_LENGTH];int bytesRead;while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {stringBuilder.append(charBuffer, BUFFER_START_POSITION, bytesRead);}} catch (IOException e) {e.printStackTrace();}} else {stringBuilder.append("");}body = stringBuilder.toString();// 解決xss攻擊問題if (body.contains("<")) {body = body.replace("<", "<");}if (body.contains(">")) {body = body.replace(">", ">");}initParameterMap();}