發現 XSS 漏洞的一般做法有哪些?

如果沒事幹,專門就是為了找xss漏洞,運氣好發現一個要多少時間?


謝 @quininer kel 邀請:)

關於發現時間,要具體到是檢測什麼目標了。找google的,和找騰訊的時間肯定不會一樣。 至於「你們一般都是如何發現xss漏洞的?」 不同類型的XSS漏洞,可能不盡相同。

1. 對於反射型XSS以及一些DOM XSS,一般建議是開發一些自動化的掃描工具進行掃描,並輔以手工分析。 另外一方面,搜索引擎也是快速尋找具有缺陷參數的好辦法。 如何進行具體分析,見之前我發烏雲上的系列:白帽子信息_心傷的瘦子 ,雖然不盡全面,但是靈活運用,應能直面慘淡的人生。

2. 對於存儲型XSS,

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

2)對於富文本,則需要對過濾器進行fuzz測試(人腦+自動化)了,正好烏雲drops上有烏烏髮了一篇:fuzzing XSS filter

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

其實吧,有時候專門去找漏洞會很累的,大什麼怡情,小什麼傷身,因此,我們還不如開心的敲敲代碼,聽聽歌,靜待生命中那些意外的收穫。 這些收穫經常來自身邊的人發給你的一些事物(如鏈接),譬如:

QQ空間禮物功能XSS可以攻擊任意指定QQ號碼用戶 (這個漏洞的發現是因為那天是我生日,別人給我QQ送了禮物)

[騰訊實例教程] 那些年我們一起學XSS (這個漏洞則是因為群里的妹子自己錄了一小段歌發到群中)

最後,不論如何,基礎很重要吧,內力不足,招式再多也沒用,反之,草木竹石皆可為劍。


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

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

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

XSS的Fuzzing流程

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

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

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

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

標籤屬性中:如&test&,Payload:">&&alert(0)&&, Payload:alert(0)

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

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

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

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

此文摘自《跨站的藝術-XSS Fuzzing 的技巧》,更具體的xss的挖掘技巧分享,大家可以到這裡看看哦~


我是弱菜,所以方法很一般。先看看文字內容在html代碼中的位置而後構造,如果被轉義了,再看javascript代碼想其他辦法,比如有沒有ajax,不標準的json生成方法(如php,如果不通過json_encode而是自行輸出)可以在json中xss。

我記得前幾天有某大牛發了一篇關於找騰訊xss的文章,建議去找來看看,思路十分新穎。


瀉藥。匿了。

萬事都要靠直覺,直覺=經驗。

只要有時間,漏洞分分鐘。

Only if time available,Vuls will be exploited in minute.


Xss都是工具自動掃描,還有用人工的?


主要還是直覺吧……


推薦閱讀:

TAG:網路安全 | 黑客Hacker | XSS |