孟清 路賀俊 劉對 高雨
摘 要
Web掃描器是提高網(wǎng)站安全性,讓滲透效率快速提升不可或缺的一部分,現(xiàn)有的優(yōu)秀掃描器的掃描功能都很強大,但是代理功能卻并不強。本文開發(fā)了一款基于Python的自動代理Web漏洞掃描器,利用爬蟲和asyncio技術(shù)維護一個動態(tài)的免費代理池,通過隨機調(diào)用代理池里的有效代理進行Web掃描。因為測試全程可以使用隨機代理,所以即使出現(xiàn)多個代理被安全設(shè)備發(fā)現(xiàn)的情況下也能繼續(xù)進行有效的測試,這將大大提高授權(quán)情況下的黑盒測試下的效率。同時爬蟲還使用了多進程,布爾去重,廣度優(yōu)先爬取等技術(shù)進一步減少測試所需要的時間。
關(guān)鍵詞
代理掃描;滲透測試;Web安全;爬蟲
中圖分類號: TP393.08 ? ? ? ? ? ? ? ? 文獻標識碼: A
DOI:10.19694/j.cnki.issn2095-2457 . 2020 . 17 . 14
Abstract
Web scanners are an integral part of Web site security and penetration efficiency, and the best existing scanners have powerful scanning capabilities, but not as powerful proxies.This paper develops a python-based automated proxy Web vulnerability scanner, which USES crawler and asyncio technology to maintain a dynamic free proxy pool, and randomly invokes effective proxies in the proxy pool for Web scanning.Because random agents can be used throughout the testing process, effective testing can continue even if multiple agents are discovered by security devices, which will greatly improve the efficiency of black box testing under authorization.The crawler also USES multi-process, Boolean de-weighting, breadth-first crawling and other techniques to further reduce the time required for testing.
Key Words
Proxy scanner; Penetration testing; Crawler
0 引言
互聯(lián)網(wǎng)的不斷發(fā)展,日新月異的計算機技術(shù)使得Web產(chǎn)品的不斷發(fā)展,各個領(lǐng)域?qū)τ诨ヂ?lián)網(wǎng)的需求也突顯了出來。自十八大以來,習(xí)總書記對我國的網(wǎng)絡(luò)安全問題十分看重[1]隨著在2016年《中華人民共和國網(wǎng)絡(luò)安全法》法案正式通過,并且該法案將于次年6月起開始施行[2],社會各界對于網(wǎng)絡(luò)安全也重視了起來,可如何保障Web產(chǎn)品的安全已經(jīng)成了一大難題。
在網(wǎng)絡(luò)安全測試中滲透測試是一個十分重要的測試方法,這項技術(shù)已經(jīng)存在數(shù)十年[3]?,F(xiàn)如今雖然市面上有了幾款較為成熟的漏洞掃描檢查工具可以幫助開發(fā)人員和網(wǎng)站維護人員完成大部分的安全防護工作,但是幾乎所有的工具的Web代理功能都非常的弱,甚至有些都沒有代理功能。這就導(dǎo)致大部分掃描器對于防護弱的網(wǎng)站時可以肆無忌憚的亂掃,但是面對安全防護不錯的網(wǎng)站就無能為力了,為了保護好測試者,降低測試者在授權(quán)的黑盒測試中被現(xiàn)有的安全防護措施和設(shè)備所發(fā)現(xiàn)的概率,一款可以自動代理的Web掃描器就非常重要了。
1 軟件設(shè)計
1.1 軟件需求分析
此次要設(shè)計的漏洞掃描器是一個可以自動代理的Web掃描器,掃描器要實現(xiàn)自動代理功能一個可自行維護的Web代理池就非常重要,其次作為一款掃描器基本的Web掃描功能是產(chǎn)品的核心,最后要實現(xiàn)對掃描的信息進行有效的存儲和輸出。需求分析流程圖如圖1。
1.1.1 代理池模塊需求分析
在互聯(lián)網(wǎng)高度發(fā)達的今天,網(wǎng)絡(luò)爬蟲已經(jīng)成為在重復(fù)采集數(shù)據(jù)中不可或缺的一部分[4]。代理池的作用也就越來越大了,為了維護一個可用的高質(zhì)量的代理池一般需要大量的時間和金錢,如果把錢花在維護代理池,這對于大部分的滲透測試來說可謂是本末倒置,所以本軟件所設(shè)想的是一個可積累,免費,實用的代理池模。要實現(xiàn)這些功能就需要從互聯(lián)網(wǎng)上的免費代理網(wǎng)站爬取代理并進行測試、打分,最后存儲起來,下一次使用時可以在原來的基礎(chǔ)上進行再次的測試從而提高代理池的效率,當然為了使用這一模塊用戶在滲透測試之前都必須花一定的時間進行代理池的維護。
1.1.2 自動爬取需求分析
有了一個可用的代理池之后自動爬取功能的實現(xiàn)也就非常簡單了,只需要在每次爬取時獲取一個隨機的代理并在爬取時使用即可。爬蟲爬取目標網(wǎng)站時使用的是廣度優(yōu)先爬取,這樣在爬取網(wǎng)站時就可以設(shè)置要爬取的網(wǎng)站最大深度。當然為了提高爬取的效率,多進程是必不可少的,爬取時要對爬取出來的url進行規(guī)范化和去重處理這樣就可以減少大量非必要的測試。
1.1.3 漏洞檢測功能需求分析
Web漏洞種類繁多,本掃描器暫時只支持最常見的漏洞:Sql注入漏洞和Xss注入漏洞。Sql注入是在Web前端同后臺數(shù)據(jù)庫之間發(fā)生數(shù)據(jù)交互時產(chǎn)生的安全漏洞[5]。Xss攻擊指攻擊者將惡意腳本寫入到Web網(wǎng)頁當中,通常這些腳本能夠利用用戶的瀏覽器中的Javascript來執(zhí)行惡意代碼,來獲取用戶的隱私信息以及其他一-些惡意操作[6]。不同的漏洞通過調(diào)用不同的漏洞檢測模塊,模塊之間不存在相互調(diào)度關(guān)系,在檢測過程中Sql和Xss注入漏洞都是通過自動填充表單并提交的方法獲取對應(yīng)的含注入點的url。
1.1.4 報告生成需求分析
對于掃描的結(jié)果一定要有一個清晰明確的輸出,不然掃描等于沒有掃描,對于不方便直接顯示的數(shù)據(jù)也要指明文件輸出的詳細位置,提供多種輸出格式。
2 系統(tǒng)實現(xiàn)
經(jīng)過軟件的需求分析我們可以得知Web掃描器應(yīng)該分為四個大模塊,分別是代理池模塊,自動爬取模塊,漏洞檢測模塊和生成報告模塊。
2.1 代理池模塊實現(xiàn)
代理池通過proxy_pool_run.py進行代理池的運行和控制包括獲取要爬取的有效免費ip數(shù)量,并判斷現(xiàn)有的IP數(shù)量是否滿足,從而控制爬蟲的爬取。爬取時通過crawalers文件下的daili66.py,ip3366.py,kuaidaili.py和xici.py爬取網(wǎng)站的免費代理,每次爬取時都會隨即產(chǎn)生隨機值填充到要爬取的網(wǎng)站url中防止重復(fù)爬取,對爬取的代理進行布爾去重后存儲到指定的文件,存儲初時默認代理的分數(shù)為0。在proxy_test.py中進行代理的檢測,每次成功后代理分數(shù)加一,滿9分后分數(shù)不再上升但是依然要檢測,對于檢測失敗的代理將從代理池中刪除。代理測試時為提高測試效率使用異步協(xié)程的方式,每次測試100個代理,當然本項目也支持你在代理池存儲文件中按規(guī)范添加自己的代理。代理池模塊流程圖如圖2。
2.2 爬蟲模塊實現(xiàn)
爬蟲模塊是本項目的核心,如何從用戶提交的一個有效url中高效的爬取出url是最重要的。爬蟲模塊的文件在Scan目錄下的,Craw.py將對爬取的url鏈接進行判斷除去空鏈接,如果不是規(guī)范的url則會利用urllib庫的parse模塊獲取絕對路徑的地址,在使用pybloom_live庫的BloomFilter模塊對爬取的url進行布爾去重。
Queue_manager.py會獲取和判斷用戶要求爬取的網(wǎng)站深度,再使用廣度優(yōu)先爬取的技術(shù)進行爬取。如果你要使用本項目的自動代理功能,則會調(diào)用crawlers目錄下的proxy_pool_run.py文件中的getproxy_url()函數(shù)從代理池中隨機選取一個代理進行使用,通過多進程的方式來大幅提高爬蟲模塊的執(zhí)行效率。之所以選擇多進程而不是多線程是因為“在多核下, 如果想做并行執(zhí)行提升程序效率, 比較常用有效的方法是使用多進程[7]。”爬蟲模塊流程圖如圖3。
2.3 漏洞檢測模塊實現(xiàn)
漏洞檢測模塊在Attack目錄下,每個模塊之間功能分離不重復(fù)。
2.3.1 Sql注入檢測模塊實現(xiàn)
Sql注入的自動化判斷難在如何獲取注入點,本掃描器通過提煉網(wǎng)頁中的form表單并進行自動填充提交在獲取對應(yīng)的url從而獲得可能存在注入點的url。Url測試時craw_url()函數(shù)對爬取的頁面進行form表單的自動填充并拼接上我們所測試的多個playload。 _craw()函數(shù)從隊列中獲取要測試的url,先提交一個含有單個單引號的playload的url看是否存在報錯,如果不報錯則說明可能使用了雙引號,則進行雙引號的字符型Sql注入測試和搜索型的Sql注入測試;如果報錯則再提交一個含有單個雙引號playload的url看是否報錯,如果在報錯則可能是數(shù)字型的Sql注入漏洞,則利用對應(yīng)的playload進行測試,如果提交一個含有單個雙引號playload的url不報錯則可能是單引號的字符型Sql注入測試和搜索型的Sql注入;如果按對應(yīng)的playload測試后不報錯,則可能含有Sql注入漏洞,將對應(yīng)的url存儲起來然后判斷是否測試完所有的url,有則取出下一個url,沒有模塊結(jié)束。Sql檢測模塊流程圖如圖4。
2.3.2 Xss漏洞檢測模塊實現(xiàn)
Xss和Sql注入一樣注入點都是通過自動提交form表單的形式獲取可能含有注入點的url,Xss漏洞檢測時先檢測是否存在dom型Xss,再檢測是否存在反射型或存儲型Xss注入。
Dom型的Xss檢測時會根據(jù)正則表達式去掉含有playload的響應(yīng)包中的內(nèi)容,接著在剩余的內(nèi)容中查找注入點,如果存在相吻合的數(shù)據(jù),則可能存在dom型Xss注入。
反射型Xss和存儲型Xss是通過九個核心的正則表達式(正則表達式常用來按用戶所定義的規(guī)則來檢索或替換符合的文本,從而達到用戶所預(yù)期的一串特殊字符[8]。)檢測時首先是發(fā)送一個設(shè)定好的特殊payload,在確定pladload在url中的輸出點所對應(yīng)的dom結(jié)點的位置,比如:注釋內(nèi)、雙引號內(nèi)、<>內(nèi)……其次再看這個輸出點對應(yīng)核心正則表達式中所描述的哪個位置。找到pladload所在的位置后就需要查看在這個位置要利用成功有哪些字符不能被轉(zhuǎn)義,然后在看響應(yīng)中的payload,從此時顯示payload的表現(xiàn)形式判斷那些‘不可被轉(zhuǎn)義的特殊字符前要被加上轉(zhuǎn)義符重新發(fā)送修改后的playload,直到每個不可被轉(zhuǎn)義的字符都成功的繞過一次才會認為存在Xss漏洞。當然不同的dom位置的攻擊方法也不同。Xss注入漏洞檢測模塊流程圖如5。
2.4 報告生成模塊實現(xiàn)
報告生成模塊實現(xiàn)的腳本是Output文件下的out_web.py,此腳本有add_list()函數(shù)以列表的形式添加到對應(yīng)的字典中,在通過build_html()函數(shù)進行輸出,一般情況下add_list()函數(shù)所獲取的列表全部來源于掃描出來的各類.txt文件,最后把這些數(shù)據(jù)全部整合起來輸出為一個頁面。
3 項目展示
3.1 項目主界面展示
本軟件是使用的是pyhton3.7版本,啟動時直接在命令行下運行主程序即可。程序啟動的提示中會顯示是否要使用免費代理功能,如果輸入No,則會顯示出本軟件的命令行參數(shù),如果選擇Yes,則會先進行代理池的初始化,初始化結(jié)束后會顯示本軟件的命令行參數(shù)。
3.2 基礎(chǔ)功能演示
3.2.1 代理池功能演示
在直接運行主程序Hugh.py,即輸入“python Hugh.py”都會提醒是否使用免費代理功能如果需要在命令行中輸入Yes即可。
3.2.2 網(wǎng)頁爬取功能演示
假如我們僅需要爬取的網(wǎng)站是“http://192.168.111.141:8081/”在命令行輸入命令“python Hugh.py -u http://192.168.111.141:8081/”就可以進行網(wǎng)頁爬取,爬取時默認爬取深度為 3,如果需要更改爬取深度請在命令中加入depth選項,假設(shè)要修改的深度為4,則此時完整的的命令為“python Hugh.py -u http://192.168.111.141:8081/ --depth=4”。
3.2.3 漏洞檢測模塊功能演示
(1)Sql注入檢測模塊演示
如果我們要對爬取的網(wǎng)站進行Sql注入檢測時,假設(shè)要爬取的網(wǎng)站是“http://192.168.111.141:8081/”,默認爬取深度,則爬取的命令是“python Hugh.py -u http://192.168.111.141:8081/--sql=1”,即可對整個網(wǎng)站進行Sql注入檢測。
(2)Xss注入檢測模塊演示
如果我們要對爬取的網(wǎng)站進行Xss注入檢測時,假設(shè)要爬取的網(wǎng)站是“http://192.168.111.141:8081/”,默認爬取深度,則爬取的命令是“python Hugh.py -u http://192.168.111.141:8081/--xss=1”,即可對整個網(wǎng)站進行Xss注入檢檢測。
(3)Sql注入和Xss注入同時檢測模塊演示
如果我們要對爬取的網(wǎng)站進行Xss和Sql注入檢測時,假設(shè)要爬取的網(wǎng)站是“http://192.168.111.141:8081/”,默認爬取深度,則爬取的命令是“python Hugh.py -u http://192.168.111.141:8081/--xss=1 ?--sql=1”,即可對整個網(wǎng)站進行檢測,如圖6。
3.2.4 掃描報告結(jié)果展示
在爬取網(wǎng)站后打開掃描結(jié)果所在的文件夾即可看到各種掃描結(jié)果,其中.html文件就是所有掃描結(jié)果的匯總,如圖7所示。如果要修改輸出文件的位置,請在lib.config.py中更改。
4 結(jié)束語
本項目實現(xiàn)了一個基于Python的自動代理Web漏洞掃描器,成功維護了一個簡易的代理池,讓自動化代理功能成功地加入到了Web掃描器中,而且能成功檢測出網(wǎng)站的安全漏洞,讓黑盒測試有了更大的隱蔽性,具有一定的實用價值。當然本掃描器還是有許多不足之處,比如支持檢測的漏洞不夠多,支持的代理協(xié)議不夠多,掃描報告頁面相對簡陋等,需要繼續(xù)改進。
參考文獻
[1]張?zhí)N昭.中國特色治網(wǎng)之道: 理念與成就——十八大以來我國網(wǎng)絡(luò)空間治理的回顧與思考[J].中國行政管理,2019,1:28.
[2]鄧若伊.以法制保障網(wǎng)絡(luò)空間安全構(gòu)筑網(wǎng)絡(luò)強國—— 《網(wǎng)絡(luò)安全法》和《國家網(wǎng)絡(luò)空間安全戰(zhàn)略》解讀[J].電子政務(wù),2017,2:2-35.
[3]牛詠梅.面向Web應(yīng)用的漏洞掃描器的設(shè)計與實現(xiàn)[J].南陽理工學(xué)院學(xué)報,2018,10(06):66-69.
[4]王佳鵬,徐海蛟,許培宇,何佳蕾,林冠成.面向網(wǎng)絡(luò)爬蟲的高可用動態(tài)池系統(tǒng)設(shè)計與實現(xiàn)[J].福建電腦,2019,35(06):8-11.
[5]李鑫.基于Web滲透測試的SQL注入研究[J].信息與電腦(理論版),2020,32(03):164-166.
[6]谷家騰. 基于動態(tài)分析的XSS漏洞檢測方法研究[D].北京郵電大學(xué),2019.
[7]唐琳,董依萌,何天宇.基于Python的網(wǎng)絡(luò)爬蟲技術(shù)的關(guān)鍵性問題探索[J].電子世界,2018(14):32-33.
[8]苻玲美.正則表達式在python爬蟲中的應(yīng)用[J].電腦知識與技術(shù),2019,15(25):253-254.