記一次爬蟲批量爬取exp

 最近需要收集一些exp,因此逛了逛exploit-db、國內exp搜索大全、seebug等幾個exp收集的網站。由於需要批量獲取漏洞信息以及對應的exp內容,因此心想有必要寫一款爬蟲去自動化收集漏洞exp。

選個target

  前面三個網站都有豐富的exp資源,但是我並不打算從它們身上去爬取,這裡介紹另外一個更牛逼的網站:0day.today(需要翻牆)。選取它的原因是exp更新的更快更豐富,且反爬蟲策略做的比較一般。

分析URL結構

選好目標後,先嘗試分析下網頁結構,比如需要判斷是動態還是靜態頁面等特徵。此網站算是動態的,其漏洞列表URL結構如下:

  • cn.0day.today/webapps/1(web漏洞列表第一頁)
  • cn.0day.today/webapps/2(web漏洞列表第二頁)
  • cn.0day.today/remote/1(遠程利用漏洞列表第一頁)
  • cn.0day.today/local/1(本地利用漏洞列表第一頁)
  • ……

每個漏洞列表頁面內有30個漏洞列表,每個漏洞列表對應一個漏洞URL,結構如下:

  • cn.0day.today/exploit/30029
  • cn.0day.today/exploit/30030

說明:此URL內容便是某個漏洞的exp,粗略算一下,web漏洞有600頁,每頁30個,總數是18000個漏洞exp。

分析網頁內容

  分析完URL結構,大致可以得出爬蟲思路:遍歷漏洞列表頁數獲取全部漏洞URL–>爬取漏洞URL獲取漏洞exp。

  那麼如何通過爬取漏洞列表頁面獲取漏洞對應的URL,以及如何爬取漏洞信息頁面獲取exp?,這裡需要分析一下頁面結構,可以嘗試寫正則或者摘取網頁元素內容的方式獲取目標內容。

獲取漏洞URL

頁面結構:

對於此頁面我沒有使用正則,而是使用了BeautifulSoup模塊來獲取網頁元素內容,代碼如下

soup=BeautifulSoup(content,"html.parser")n=soup.find_all("div",{"class":"ExploitTableContent"})if n: for i in n: m=i.find_all("div",{"class":"td allow_tip "}) for j in m: y=j.find_all("a") for x in y: vul_name=x.text # 漏洞名稱 vul_url=x.attrs.get("href") # 漏洞url

獲取漏洞EXP

頁面結構:

對於此頁面我也沒有使用正則,而是使用了BeautifulSoup模塊來獲取網頁元素內容,代碼如下:

soup=BeautifulSoup(content,"html.parser")m=soup.find_all("div",{"class":"container"})n=m[0].find_all("div")exp_info=""for i in n: exp_info+=i.text+"
"

反爬蟲策略

我在連續訪問n次網站後,發現此站有一些反爬蟲的策略。而我必須研究解決它,才能進一步獲取exp內容。

cdn防ddos策略

  首先我發現此網站用了cloudflare加速器,且在用戶持續訪問一段時間後(應該是基於ip+headers認證),會出現防ddos頁面。如果此時用普通的爬蟲去訪問,獲取到的頁面源碼是防ddos的源碼,即:

解決方案

  當我們打開瀏覽器訪問漏洞頁面時,會在防ddos頁面上等待幾秒後,自動跳轉到目標漏洞頁面。基於這一特性,我決定使用無頭瀏覽器去訪問,設置等待時間即可。這裡我選用phantomjs做此試驗,其他headless同理。

d=webdriver.PhantomJS()d.get(vul_api)time.sleep(5) # 等待5sprint d.page_source # 輸出源碼

在訪問網頁5s後,輸出的網頁源碼,便是目標漏洞exp頁面的源碼。

用戶點擊確認

  在繞過了防ddos策略後,發現網站自身也有一個反爬蟲的策略,即需要用戶點擊確認按鈕後,才能繼續訪問原目標。如果此時用普通的爬蟲去訪問,獲取到的頁面源碼是用戶確認網頁的源碼,即:

解決方案

  此網頁需要用戶點擊「確定」按鈕後,會跳轉到目標頁面,因此可以使用無頭瀏覽器訪問,操作頁面元素,即模擬點擊確定按鈕。

d=webdriver.PhantomJS()d.get(vul_api)time.sleep(5) # 等待5s(繞過防ddos策略)d.find_element_by_name("agree").click() # 點擊確定按鈕(繞過用戶點擊確認策略)time.sleep(5) # 等待5scontent=d.page_source # 輸出網頁源碼d.quit()

總結

  想要爬取一個網站的內容,必須要分析此網站的URL結構、網頁內容、反爬蟲策略等。針對此網站而言,複雜點在於如何繞過反爬蟲策略,這裡用到了無頭瀏覽器去模擬人訪問。總之編寫爬蟲是需要耐心跟細心的,如何一步步去分析整個訪問流程,有時候比如何去編程更重要。也許,這就是所謂的:「磨刀不誤砍柴工」吧!

本文內容來自個人博客:記一次爬蟲批量爬取exp,轉載請說明出處!

更多內容可關注個人公眾號:

weixin.qq.com/r/AD-v97f (二維碼自動識別)


推薦閱讀:

vBulletin 爆出遠程代碼執行漏洞
HTTPS 和 OpenSSL 是什麼關係?
Adobe ColdFusion 任意命令執行漏洞(CVE–2017–11283, CVE–2017–11284)預警
反病毒還是留後門?卡巴斯基反病毒伺服器被爆多個漏洞

TAG:黑客Hacker | 安全漏洞 | python爬蟲 |