分類  >  Web前端 >

XSS跨站腳本攻打原理及防護方法

tags:    時間:2013-12-10 21:59:44
【轉】XSS跨站腳本攻擊原理及防護方法

摘要


XSS(Cross Site Script)跨站腳本攻擊。它指的是惡意攻擊者往Web 頁面里插入惡
意html 代碼,當用戶瀏覽該頁之時,嵌入其中Web 裡面的html 代碼會被執行,從而
達到惡意用戶的特殊目的。本文介紹了該攻擊方式,並給出了一些防範措施。


原理


XSS 屬於被動式的攻擊。攻擊者先構造一個跨站頁面,利用script、<IMG>、
<IFRAME>等各種方式使得用戶瀏覽這個頁面時,觸發對被攻擊站點的http 請求。此時,
如果被攻擊者如果已經在被攻擊站點登錄,就會持有該站點cookie。這樣該站點會認為
被攻擊者發起了一個http 請求。而實際上這個請求是在被攻擊者不知情的情況下發起
的,由此攻擊者在一定程度上達到了冒充被攻擊者的目的。精心的構造這個攻擊請求,
可以達到冒充發文,奪取許可權等等多個攻擊目的。在常見的攻擊實例中,這個請求是通
過script 來發起的,因此被稱為Cross Site Script。
攻擊Yahoo Mail 的Yamanner 蠕蟲是一個著名的XSS 攻擊實例。Yahoo Mail 系統
有一個漏洞,當用戶在web 上察看信件時,有可能執行到信件內的javascript 代碼。病
毒可以利用這個漏洞使被攻擊用戶運行病毒的script。同時Yahoo Mail 系統使用了Ajax
技術,這樣病毒的script 可以很容易的向Yahoo Mail 系統發起ajax 請求,從而得到用
戶的地址簿,併發送病毒給他人。
XSS 攻擊主要分為兩類:一類是來自內部的攻擊,主要指的是利用WEB 程序自身
的漏洞,提交特殊的字元串,從而使得跨站頁面直接存在於被攻擊站點上,這個字元串
被稱為跨站語句。這一類攻擊所利用的漏洞非常類似於SQL Injection 漏洞,都是WEB
程序沒有對用戶輸入作充分的檢查和過濾。上文的Yamanner 就是一例。
另一類則是來來自外部的攻擊,主要指的自己構造XSS 跨站漏洞網頁或者尋找非目
標機以外的有跨站漏洞的網頁。如當我們要滲透一個站點,我們自己構造一個跨站網頁
放在自己的伺服器上,然後通過結合其它技術,如社會工程學等,欺騙目標伺服器的管
理員打開。這一類攻擊的威脅相對較低,至少ajax 要發起跨站調用是非常困難的。

實戰


我們來看一個簡單的攻擊實例,下表給出了一個簡單的網站
http://10.10.67.25:8080/testxss,該網站的密碼和用戶名相同,普通用戶可以修改user
value,當以admin 身份登陸時可以通過向doadmin.jsp 發起請求來修改admin value。

   
index.jsp
<html>
<body>
<textarea rows="3" cols="100" readonly="on">
Current User: ${username}
Admin Value: ${adminvalue}
User Value: ${uservalue}
</textarea>
<br>
<a href="login.jsp"/>logout</a><br>
Login:<br>
<form action="login.jsp" method="post">
username: <input type="text" name="u"></input> <br>
password: <input type="text" name="p"></input> <br>
<input type="submit" /> password == username :-)
</form>
<form action="doadmin.jsp" method="post">
adminvalue: <input type="text" name="v"></input> <br>
<input type="submit" />
</form>
<form action="doadmin.jsp" method="post">
uservalue: <input type="text" name="v2"></input> <br>
<input type="submit" />
</form>
</body>
 
login.jsp
<%
String u = request.getParameter("u");
String p = request.getParameter("p");
if (u != null && p != null && u.equals(p)) {
session.setAttribute("username", u);
} else {
session.removeAttribute("username");
}
response.sendRedirect("index.jsp");
%>
 
doadmin.jsp
<%
String u = (String)session.getAttribute("username");
String v = request.getParameter("v");
String v2 = request.getParameter("v2");
if (u != null && u.equals("admin")) {
if (v != null)
application.setAttribute("adminvalue", v);
搜狐公司研發中心版權所有,僅供技術交流,轉載請保留上述文字
}
if (u != null && v2 != null)
application.setAttribute("uservalue", v2);
response.sendRedirect("index.jsp");
%>

容易想到,只要誘騙admin 用戶發起一個到
http://10.10.67.25:8080/testxss/doadmin.jsp 的http 請求,就能成功攻擊。因此我們設
計跨站語句如下:
hello </textarea> <img src="
http://tinyurldd.com/2xwfed" style="display:none"> </img>
hello </textarea> <form id="shit" action="
http://10.10.67.25:8080/testxss/doadmin.jsp" metho
nd="post" target="myframe"/> <input type="hidden" name="v" value="hacked3"/> </form> <iframe
style="display:none" name="myframe"> </iframe><script>document.forms[0].submit()</script>
hello </textarea> <script language="jscript">v = new ActiveXObject("MSXML2.XMLHTTP.3.0"); v.
open("GET","
http://10.10.67.25:8080/testxss/doadmin.jsp?v=hacked4"); v.send();alert(v.status
Text);</script>

 

以普通用戶身份修改user value 為以上任何一個,當admin 瀏覽index.jsp 時,即
可悄無聲息的修改admin value
這裡演示了3 種跨站手法,1 是利用img、iframe 等tag 直接發起請求,這適用於
無法直接出script 的情況,其中
http://tinyurldd.com/2xwfed 是一個redirect,指向
http://10.10.67.25:8080/testxss/doadmin.jsp?v=hacked2 ;2 是用script 提交post 表
單;3 是ajax 技術。

以上攻擊能夠成功有2 個原因:1. 應用程序沒有對user value 做足夠多的過濾,導
致用戶有機會構造一個複雜的跨站語句來觸發admin 的非預期行為;2. 應用程序在響
應admin value 修改請求時沒有防範措施來識別這是不是出於用戶主動。
漏洞1 很容易修復,只要像防止SQL Injection 那樣對用戶輸入的所有內容都過濾即
可。漏洞2 才是問題的根源,即便我們修補了漏洞1,只要誘使admin 用戶訪問包含<img
src="http://tinyurldd.com/2xwfed"> </img>的頁面,仍然能達到目的,而這是一件極容易
做到的事。

 

防範措施


這裡給出一些防範XSS 攻擊的措施。必須說明的是,對於XSS 攻擊,並不像SQL
Injection 那樣可以有一勞永逸的解決方案——只需要grep 一下所有的sql 調用。這是一
場長期的鬥爭,而且往往需要我們採取修改業務流程、產品設計等看似削足適履的手段。
先總結一下常見的攻擊手法:
1. 依賴跨站漏洞,需要在被攻擊網站的頁面種入腳本的手法
1.1. Cookie 盜取,通過javascript 獲取被攻擊網站種下的cookie,併發送給攻擊者。
1.1.1. 從cookie 中提取密碼等隱私
1.1.2. 利用cookie 偽造session,發起重放攻擊
1.2. Ajex 信息盜取,通過javascript 發起ajex 請求。
1.2.1. 從ajex 結果中獲取隱私。
1.2.2. 模擬用戶完成多頁表單。
2. 不依賴跨站漏洞的手法
搜狐公司研發中心版權所有,僅供技術交流,轉載請保留上述文字
2.1. 單向HTTP 動作,通過img.src 等方法發起跨站訪問,冒充被攻擊者執行特權操作。
但是很難拿到伺服器的返回值。
2.2. 雙向HTTP 動作,如果伺服器產生一段動態的script,那麼可以用script.src 的方法
發起跨站訪問並拿到伺服器的返回值。
防範手法如下:
1. 防堵跨站漏洞,阻止攻擊者利用在被攻擊網站上發布跨站攻擊語句
不可以信任用戶提交的任何內容,首先代碼里對用戶輸入的地方和變數都需要仔細
檢查長度和對」<」,」>」,」;」,」』」等字元做過濾;其次任何內容寫到頁面之前都必須加以
encode,避免不小心把html tag 弄出來。
這一個層面做好,至少可以堵住超過一半的XSS 攻擊。
2. Cookie 防盜
首先避免直接在cookie 中泄露用戶隱私,例如email、密碼等等。
其次通過使cookie 和系統ip 綁定來降低cookie 泄露后的危險。這樣攻擊者得到的
cookie 沒有實際價值,不可能拿來重放。
3. 盡量採用POST 而非GET 提交表單
POST 操作不可能繞開javascript 的使用,這會給攻擊者增加難度,減少可利用的
跨站漏洞。
4. 嚴格檢查refer
檢查http refer 是否來自預料中的url。這可以阻止第2 類攻擊手法發起的http 請求,
也能防止大部分第1 類攻擊手法,除非正好在特權操作的引用頁上種了跨站訪問。
5. 將單步流程改為多步,在多步流程中引入效驗碼
多步流程中每一步都產生一個驗證碼作為hidden 表單元素嵌在中間頁面,下一步操
作時這個驗證碼被提交到伺服器,伺服器檢查這個驗證碼是否匹配。首先這為第1 類攻
擊者大大增加了麻煩。其次攻擊者必須在多步流程中拿到上一步產生的效驗碼才有可能
發起下一步請求,這在第2 類攻擊中是幾乎無法做到的。
6. 引入用戶交互
簡單的一個看圖識數可以堵住幾乎所有的非預期特權操作。
7. 只在允許anonymous 訪問的地方使用動態的javascript。
8. 對於用戶提交信息的中的img 等link,檢查是否有重定向回本站、不是真的圖片等
可疑操作。
9. 內部管理網站的問題
很多時候,內部管理網站往往疏於關注安全問題,只是簡單的限制訪問來源。這種
網站往往對XSS 攻擊毫無抵抗力,需要多加註意。
安全問題需要長期的關注,從來不是一鎚子買賣。XSS 攻擊相對其他攻擊手段更加
隱蔽和多變,和業務流程、代碼實現都有關係,不存在什麼一勞永逸的解決方案。此外,
面對XSS,往往要犧牲產品的便利性才能保證完全的安全,如何在安全和便利之間平衡
也是一件需要考慮的事情。

推薦閱讀文章

Bookmark the permalink ,來源:互聯網