自上一篇博客介紹瀏覽器通信以來已經(jīng)過去將近兩個月了,兜兜轉(zhuǎn)轉(zhuǎn)挖了不少坑,也走了很多彎路。期間研究saml2.0和單點登錄等技術(shù)都最后無疾而終。
只有xss框架這部分堅持了下來,這個框架還有很多事情需要完善,不過總算是有了一點小成果,很開心~~~
代碼放到了這里對照著看效果更好
https://github.com/littleworldwar/pybeef

0x00web服務器設計

(1)tornado處理請求和Application類
要編寫一個Tornado應用中最多的工作是定義類繼承Tornado的RequestHandler類,主要用于將特定的url對應到不同的類。
通過在類中定義get和post函數(shù)處理對應的請求,self.write()用于將內(nèi)容輸出到返回流中。
self.render()將特定的文件內(nèi)容渲染后作為輸出,指定文件名即可。
self.get_argument()獲取請求的參數(shù)
self.set_header()設置HTTP返回頭
如果碰到復雜的服務器需求需要重寫Application類,在__init__函數(shù)中定義handlers和setting。Handlers主要是將所有的url路徑和對應的handler類對應起來,Setting中設置了template_path 設置模板路徑主要用于self.render()函數(shù)查找文件路徑。

(2)控制臺登錄設計
為了處理登錄表單和配置文件中的用戶名密碼進行校驗,先要定義一個LoginPageHandler類,處理登錄的post請求取出用戶名密碼等參數(shù),將參數(shù)與用configparser解析配置文件的數(shù)據(jù)進行對比,一致則通過認證。
同時還有cookie的設計為了在已經(jīng)登錄過的情況下直接使用get方法就能進入控制臺頁面。

(3)提供給受害瀏覽器執(zhí)行的js文件
處理xss漏洞產(chǎn)生的get請求,將hook.js作為請求的響應。同時生成32位隨機數(shù),在hook瀏覽器中設置cookie,設置hook_id作為hook瀏覽器的唯一標識。

(4)控制臺請求hook瀏覽器的數(shù)據(jù)
連接數(shù)據(jù)庫查詢?yōu)g覽器的數(shù)據(jù),使用pymongo模塊連接本地數(shù)據(jù)庫。
將信息組織成json結(jié)構(gòu),由于mongodb默認插入的_id值屬于Object不能放到輸入流中,我們刪除了_id這一項。并將這些信息按照順序標好。
由于控制臺使用AJAX跨域請求,需要設置返回頭Access-Control-Allow-Orign,將其設置為通配符* 也就是匹配一切地址。否則瀏覽器不能讀取返回的數(shù)據(jù)。

(5)hook瀏覽器的輪詢處理
Hook瀏覽器執(zhí)行了hook.js后臺post方法發(fā)送瀏覽器信息,同時要帶上在cookie中設置的hook_id來標識瀏覽器。要讓AJAX請求同時攜帶cookie,在后臺設置返回頭 Access-Control-Allow-Credentials為true。
將收集的信息存入數(shù)據(jù)庫,如果hook_id存在不會重復插入數(shù)據(jù)。

0x01hook瀏覽器的信息收集設計

(1)收集瀏覽器的user-agent(用戶代理)
瀏覽器的user-agent是瀏覽器的身份標識,簡稱UA。每次向服務器發(fā)出請求的時候都會在請求頭中帶上UA參數(shù)。例如 Mozilla/5.0 (X11; Linux x86_64;) Gecko/20100101 Firefox/45.0。包含了瀏覽器的版本,操作系統(tǒng)的類型,瀏覽器的渲染引擎等信息

(2)收集瀏覽器版本
即便在UA中可以獲取到部分瀏覽器的版本,但是UA是可以人為修改的,判斷瀏覽器版本不能全依賴UA。而且例如IE edge瀏覽器的UA是 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393??梢钥闯銎渲型瑯影薈hrome和Safari瀏覽器的信息,依靠UA并不能準確判斷瀏覽器版本。瀏覽器中一般擴展了自己獨特的方法,例如window.chrome wind

網(wǎng)友評論