1. 程式人生 > >【XSS技巧拓展】————5、跨站的藝術-XSS入門與介紹

【XSS技巧拓展】————5、跨站的藝術-XSS入門與介紹

什麼是XSS?

XSS全稱跨站指令碼(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故縮寫為XSS,比較合適的方式應該叫做跨站指令碼攻擊。

跨站指令碼攻擊是一種常見的web安全漏洞,它主要是指攻擊者可以在頁面中插入惡意指令碼程式碼,當受害者訪問這些頁面時,瀏覽器會解析並執行這些惡意程式碼,從而達到竊取使用者身份/釣魚/傳播惡意程式碼等行為。

上圖就是一個典型的儲存型XSS。

什麼是Payload?

Payload是一個專業術語,中文翻譯過來是是有效荷載,可能經常會從搞安全的口裡說出,那麼什麼是Payload?什麼又是Exp?什麼又是PoC?

先介紹PoC,PoC的全稱是Proof of Concept,意思為概念驗證,通俗的可以理解為漏洞驗證指令碼;而Exp是Exploit的簡寫,意思為漏洞利用,兩者的區別即使一個僅限於驗證,而一個是攻擊利用。那麼Payload呢?Payload是組成PoC和Exp的必要部分,也可以理解為驗證程式碼。

打個比喻,假如某個窗戶存在問題,任何鑰匙都可以開,那麼這個比喻為一個漏洞,那麼用鑰匙開啟窗戶,看下是否可以開啟,這是PoC做的事,而開啟窗戶後進去偷東西,這是Exp做的事,而那把鑰匙就可以理解為Payload,Payload不區分是否攻擊利用。

比如剛才上圖中的那個XSS漏洞的Payload 如下:

<img src=0 onerror=alert(5)>

XSS是怎麼產生的?

經常也會聽到一個詞,注入點,或者說專業術語是向量,指的是黑客可控內容的提交的位置,比如下圖中,搜尋框,黑客可以控制輸入的內容,然後進行提交,那麼實際在測試漏洞的時候,就可以把注入點的內容替換為Payload進行驗證。

1、GET 請求引數
2、POST請求引數
3、UA
4、Referer
5、URI
...
 
一切可以提交資料到頁面的點都稱作向量

而XSS或者說Web漏洞是怎麼產生的?對非預期輸入的信任!

安全的本質是信任的問題,在上圖中,搜尋框的設定對於開發者來說,理論上應該輸入的是正常的字串,進行搜尋,這是一種對輸入的信任,並且這種信任對於開發者來說是有預期的,在他的預期裡輸入是正常的字串,而漏洞的產生就在於出現了非預期的情況,開發者沒有針對性的做處理。

這是以前挖的一個聯想商城的XSS。

test //預期無害的輸入
XSStest" onmouseover=alert(4438) x="  //非預期輸入

XSS分類

接下來來看看不同的XSS分類。

  • 反射型(非持久型)
  • 儲存型(持久型)
  • DOM型

這是最常見的三種分類:

儲存型

儲存型XSS也叫持久型XSS,儲存的意思就是Payload是有經過儲存的,當一個頁面存在儲存型XSS的時候,XSS注入成功後,那麼每次訪問該頁面都將觸發XSS,典型的例子是:

如留言板

1、插入留言=>內容儲存到資料庫
2、檢視留言=>內容從資料庫提取出來
3、內容在頁面顯示

如果這裡存在XSS,Payload可以通過留言內容提交,然後顯示在頁面的時候可以生效,那麼就是典型的儲存型XSS。

開頭的那個就是儲存型XSS,而這個也是之前微信網頁版存在的另外一個儲存型XSS,暱稱中包含XSS 的Payload,在點開檢視群成員列表的時候就可以觸發XSS。

反射型

反射型XSS也叫非持久型XSS,最常見的是Payload是構造在網址的某個GET引數的值裡。

比如這樣的:

http://www.xx.com/company/search.html?key_pro="><script>confirm(1501)</script>

與儲存型相反,反射型XSS的是通過提交內容,然後不經過資料庫,直接反射回顯在頁面上,比如說以下程式碼就存在反射想的XSS,通過引數get的值提交Payload:

echo $_GET['get'];

這是之前微信朋友圈的一個活動,一個很常見的形式,通過微信點選進入,授權登入,自動獲取微信暱稱,然後生成邀請函,而實際上讀取的暱稱是構造在網址上的,由於沒有過濾,於是存在反射型XSS,點選的話就會跳轉我的部落格。

http://tdf.qq.com/mobile/index2.html?name=<a href="http://www.fooying.com">點選抽獎</a>&type=share&from=timeline&isappinstalled=1

DOM 型

其實DOM型也屬於反射型的一種,不過比較特殊,所以一般也當做一種單獨型別。
比如之前挖過的一個wechat.com的DOM型XSS,最終構造完網址地址是這樣的:

http://wechat.com/en/features.html#<img src=0 onerror='alert(0)'>

而其背後程式碼生效大概是這樣的:

<script>
var name = location.hash;
document.write(name);
</script>

上圖是以前挖的一個qq.com子域名的一個注入點存在於Referer的DOM型XSS,在頁面地址為http://www.0xsafe.com" onerror="alert(0)  的頁面點選連結跳轉到 datalib.ent.qq.com/tv/3362/detail.shtml,就可以觸發XSS,頁面中存在JS語句獲取Referer,然後通過頁面加入img標籤的的方式發起了一個GET請求,應該是一個訪問來源記錄的東西,而對於Referer的值沒有做處理,於是就存在DOM型XSS。

其他型別XSS

上面是大家經常聽到的XSS型別,其實細分下來還有其他的XSS型別:

  • mXSS 突變型XSS
  • UXSS 通用型XSS
  • Flash XSS
  • UTF-7 XSS
  • MHTML XSS
  • CSS XSS
  • VBScript XSS

其中UTF-7、MHTML XSS、CSS XSS、VBScript XSS 只在低版本的IE中可以生效,現在應該基本不可見了,不過還是給大家介紹下。

mXSS

mXSS中文是突變型XSS,指的是原先的Payload提交是無害不會產生XSS,而由於一些特殊原因,如反編碼等,導致Payload發生變異,導致的XSS。下面的漏洞是存在於以前版本的PC的QQ客戶端的頁面預覽功能。

這是部落格園提交的一篇文章,可以看到,提交的XSS Payload已經被轉義了,不產生危害。

上圖是在QQ客戶端裡分享上面的部落格園那篇文章的連結,而QQ存在網址預覽功能,於是點選網址可以在右側顯示出優化後的頁面的內容,就導致了XSS的產生;這個預覽功能實際上是QQ客戶端內嵌了一個網頁,這個頁面對原網頁內容進行提取和處理的過程中,將原本無害的XSS Payload進行了轉碼操作,於是導致了Payload 變異而產生了XSS,我記得這個XSS,我前後一共繞過了三四次,然後提交給了TSRC。

實際上,頁面預覽這個功能不是針對所有網址都可以預覽,對於一些大型的網站,估計是有白名單機制或者是認證的網站,才能進行預覽,隨便一個網址是不可以的,這本身也是一種信任的限制在裡面,如果是隨意的網站,那就更好控制內容了,所以對於域名是有限制的;這裡也存在一個信任的問題,理論上,這些大站的內容應該是沒問題的,但實際情況是可被控制而導致產生XSS。

UXSS

UXSS全稱Universal Cross-Site Scripting,翻譯過來就是通用型XSS,也叫Universal  XSS。UXSS是一種利用瀏覽器或者瀏覽器擴充套件漏洞來製造產生XSS的條件並執行程式碼的一種攻擊型別。UXSS 可以理解為Bypass 同源策略。

同源策略:不同域的客戶端指令碼在沒明確授權的情況下,不能讀寫對方的資源

上圖就是一個安卓核心瀏覽器存在的UXSS,訪問www.0xsafe.org/x.html,頁面巢狀TSRC的頁面,然後可以讀取到TSRC站點的Cookie,具體的介紹我之前有寫過一篇文章:http://www.fooying.com/uxss/

Flash XSS

var a:String = root.loaderInfo.parameters.par
if(ExternalInterface.available){
    ExternalInterface.call("alert",a)
} else {
    trace(100)
}
stop()
var a:String = root.loaderInfo.parameters.par
if(ExternalInterface.available){
    ExternalInterface.call("alert",a)
} else {
    trace(100)
}
stop()

Flash 產生的XSS主要來源於:

  • getURL/navigateToURL  訪問跳轉
  • ExternalInterface.call 呼叫js函式

前者是訪問跳轉到指定URL,後者則是呼叫頁面中JS函式,比如上面的程式碼就會導致彈框。

http://img.xiami.net/res/kuang/xiamikuang5tab.swf?rname=%E6%96%B0%E6%AD%8C%3C%3E&dataUrl=http://www.0xsafe.org/0

這是之前蝦米的一個播放器頁面,然後分享功能可以通過網址裡的引數直接控制一些值,於是就存在了可控的注入點,通過構造Payload可以觸發,當點選進行分享的時候就會觸發XSS。

這裡也有篇介紹Flash XSS的文章:https://www.secpulse.com/archives/44299.html,大家感興趣的也可以看下。

UTF-7 XSS

在以下兩種場景可以在低版本IE瀏覽器觸發UTF-7 XSS:

  • meta未指定編碼,特定版本IE發現內容存在UTF-7編碼內容,則自動以UTF-7解碼處理
  • 指定編碼為UTF-7

UTF-7 XSS與普通XSS的區別就在於構造的Payload是UTF-7編碼的,而基於上面兩個場景的特性,低版本IE瀏覽器會自動解碼,於是就可以產生XSS。

上圖中,a變數的值就是UTF-7 XSS 的Payload,實際上是正常Payload UTF-7編碼後的結果。

MHTML XSS

MHTML XSS 同樣只存在於低版本的IE中,MHTML是MIME HTML (Multipurpose Internet Mail Extension HTML,聚合超文字標記語言)的縮寫,把一個多附件(如圖片,flash動畫等)的網頁內容都儲存到單一檔案的標準,是類似HTTP的協議,在IE中,當嵌入資源的URL的協議為MHTML 時,IE將呼叫MHTML Protocol Handler,把該資源當作MHTML格式檔案解析處理。

Content-Type:multipart/related;boundary="x"
--x
Content-Location:xss
Content-Transfer-Encoding:base64
PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
--x--

其中

PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg== BASE64解碼:<script>alert(1)</script>

通過特定的訪問方式:

mhtml:www.x.com/a.html!xss

就可以觸發XSS,具體更多內容大家也可以自己搜尋看看。

CSS XSS

<style>
    body {width:expression(alert(1));: red;}
</style>
<style>
    body {width:expression(alert(1));: red;}
</style>

CSS XSS 是緣於IE8 Beta2以前版本支援使用expression在CSS中定義表示式(公式)來達到建立元素間屬性之間的聯絡等作用,於是就可以通過以上程式碼的方式觸發XSS。

VBScript XSS

VBScript XSS 同上面幾種XSS一樣,也是微軟的產物,也可以觸發XSS。

<input type ="button" onClick="VBScript:Document.Write 'hello mr. Fooying'
MsgBox 'xss'">
<input type ="button" onClick="VBScript:Document.Write 'hello mr. Fooying'
 MsgBox 'xss'">

XSS防禦

XSS的防禦我就不多說了,之前有翻譯過OWASP Xenotix XSS 漏洞利用框架作者Ajin Abranham寫的一個《給開發者的終極XSS防禦備忘錄》,已經放在附件裡,大家可以自己看看。

其他

其實關於XSS,有很多東西可以深入,包括說學習XSS需要了解各種編碼轉義,各種繞過,這篇文章主要是進行入門的介紹,然後附件裡還附了一個附件是介紹XSS蠕蟲的,以前翻譯的,大家也可以自己看看,下面是是一些學習資源。

一些線上XSS遊戲

地址1:http://prompt.ml/ 
答案1:https://github.com/cure53/xss-challenge-wiki/wiki/prompt.ml

地址2:http://escape.alf.nu/ 
答案2:http://blog.163.com/[email protected]/blog/static/17029212320149385547765/

地址3:https://xss-game.appspot.com/ 
答案3:http://www.freebuf.com/articles/web/36072.html

地址4:http://xss-quiz.int21h.jp/ 
答案4:http://blog.163.com/[email protected]/blog/static/1702921232013112542728566/

一些學習網址