手把手教你寫網絡爬蟲:Web應用的漏洞檢測實戰篇!

2020-12-22 51Testing軟體測試網

關注我,每周分享軟體測試技術乾貨、面試經驗,想要進入軟體測試學習交流群的可以直接私信我哦~~

在平時工作當中會用到漏洞掃描工具,用戶只需要輸入待檢測網址,點擊一下按鈕就可以等待網站的安全檢測報告了。作為剛入門的安全小白,對其工作原理產生了濃厚的興趣,逐漸深層剝離Web應用漏洞檢測的本質是網絡爬蟲技術與漏洞檢測技術的結合,網絡爬蟲主要爬取網站結構並收集可能存在的攻擊面,漏洞檢測技術則是在爬蟲結果的基礎上進行針對性的修改並重放,根據伺服器響應進行判斷。

在本篇文章中,我們將重點介紹爬蟲技術方面的知識。

1、應用場景

通常我們看到的網頁內容是通過瀏覽器呈現的,Web站點的頁面渲染方式對用戶是透明的,然而不同的Web站點渲染方式對爬蟲的影響是巨大的。對於Web站點來說,其頁面渲染方式主要分為兩個類型,即服務端渲染和客戶端渲染。

其中,服務端渲染是指頁面呈現的內容是由伺服器端完成渲染後再返回至瀏覽器的,有效的信息全部包含在HTML頁面中,爬蟲通過頁面解析即可獲取關鍵數據;而客戶端渲染是指頁面的內容主要由JavaScript操作DOM渲染頁面,其生成邏輯、數據獲取、路由跳轉全部由瀏覽器控制,沒有JavaScript運行環境的爬蟲是無法獲取數據的。

在Web2.0背景下,Web應用的數據交互變得更加複雜,為滿足用戶的交互需求,通常採用服務端和客戶端結合的方式渲染,這就使得爬蟲獲取的關鍵信息非常有限。

圖1 服務端渲染
圖2 客戶端渲染

2、探索爬蟲

通常我們根據是否可以加載JavaScript腳本以及解析Ajax請求將爬蟲分為靜態爬蟲和動態爬蟲。靜態爬蟲對服務端渲染的數據進行下載並解析,獲取所需的數據。靜態爬蟲的邏輯比較簡單,使用Python的requests等庫即可實現頁面下載拿到網頁源碼,再通過Xpath、BeautifulSoup或正則表達式對頁面進行解析之後按照一定的格式進行存儲即可。如我們以中國知網專利數據為例,對頁面表格中的數據進行爬取。

我們需要獲取表格中專利的申請號、公開號、申請人、發明人等關鍵信息進行存儲,具體信息如圖3所示。

圖3 中國知網專利數據

針對上述需求,我們可以使用Python的requests模塊對URL進行請求,使用Xpath對頁面進行解析獲取表格中的數據。代碼如下所示:

import requests

from lxml import etree

url = "http://dbpub.cnki.net/grid2008/dbpub/detail.aspx?dbcode=SCPD&dbname=SCPD2020&filename=CN110637524A"

ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"

headers={'User-agent': ua}

res = requests.get(url,headers = headers)

content = res.text # 獲取HTML的內容

html = etree.HTML(content)

tds = []

for item in html.xpath("//td"):

if item.text:

tds.append(item.text)

print(tds)

然而,隨著前端技術的發展,用戶面前的數據不單純從服務端獲取,用戶的滑鼠點擊、滾動、表單的輸入等行為與瀏覽器產生交互進而觸發事件發起Ajax請求,瀏覽器在不刷新URL的情況下異步的獲取從伺服器端傳來的數據並通過JavaScript操縱DOM對數據進行渲染更新,這部分數據靜態爬蟲是拿不到的。具備Ajax解析能力的動態爬蟲就可以解決這類問題。

通常情況下,動態爬蟲通過模擬瀏覽器的方式對待爬取的URL進行渲染,這樣爬取的原始碼就是真正的網頁代碼,數據提取自然更加全面。目前動態爬蟲技術主要有Selenium和pyppeteer。

Selenium作為一個自動化測試工具,對各種語言都能很好地支持,所以自2014年問世以來,很長一段時間,它一直是瀏覽器自動化的首選。Selenium提供了WebDriver驅動程序,可以直接與瀏覽器通信來控制瀏覽器。

而Phantomjs是一個可編程的無頭瀏覽器,包含了完整的瀏覽器內核,可以解析並渲染JS、處理請求信息等。通常將這兩個工具進行結合,Phantomjs負責提供JavaScript腳本執行環境,Selenium負責驅動Phantomjs無頭瀏覽器渲染、提取頁面並處理請求信息。

但是2017年Selenium宣布不再提供Phantomjs支持,並且Phantomjs停止更新並宣布不再進行維護,取而代之的是其他的無頭瀏覽器,如Chrome、Firefox等。

使用Selenium爬取中國知網專利數據的代碼如下:

from?selenium?import?webdriver # 啟動瀏覽器需要用到

from?lxml?import?etree

driver = webdriver.Chrome(executable_path="chromedriver驅動程序路徑")

url = "http://dbpub.cnki.net/grid2008/dbpub/detail.aspx?dbcode=SCPD&dbname=SCPD2020&filename=CN110637524A"

driver.get(url)

content = driver.page_source

html = etree.HTML(content)

tds = []

for item in html.xpath("//td"):

if item.text:

tds.append(item.text)

print(tds)

Selenium不再支持Phantomjs的幾個月後,Google公司發布了Puppeteer。Puppeteer是Google官方發布的一個通過DevTools協議控制headless Chrome的Node庫。可以通過Puppeteer的提供的API直接控制Chrome模擬大部分用戶操作來進行界面測試或者作為爬蟲訪問頁面來收集數據。而Pyperteer是puppeteer的Python實現,相比於Selenium具有異步加載、速度快的特點。

import asyncio

from lxml import etree

from pyppeteer import launch

async def main():

browser = await launch(

ignoreHTTPSErrors=True,

args=['--no-sandbox'"--disable-gpu",

"--disable-web-security",

"--disable-xss-auditor",# 關閉 XSS Auditor

"--no-sandbox",

"--disable-setuid-sandbox",

"--allow-running-insecure-content",# 允許不安全內容

"--disable-webgl",

"--disable-popup-blocking"],

headless=False,

userDataDir="F:\\pyppeteer"

)

page = await browser.newPage()

await page.setUserAgent('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Mobile Safari/537.36')

url = 'http://dbpub.cnki.net/grid2008/dbpub/detail.aspx?dbcode=SCPD&dbname=SCPD2020&filename=CN110637524A'

await page.goto(url, options={'waitUtil': 'networkidle2','timeout': 10000})

content = page.content()

html = etree.HTML(content)

tds = []

for item in html.xpath("//td"):

if item.text:

tds.append(item.text)

print(tds)

asyncio.get_event_loop().run_until_complete(main())

3、從漏洞檢測的角度看爬蟲技術

基於Web應用的漏洞檢測效果在很大程度上取決於爬蟲結果的覆蓋面,發現有效的URL越多,就越有可能覆蓋到隱藏的注入點。傳統的爬蟲獲取網站隱藏注入點的方式通常是通過正則表達式去提取頁面中已有的URL信息,而這種爬取的方式是片面的、低效的,因為隱藏在Ajax請求URL信息,傳統爬蟲根本無法獲得;在當前URL地址不變的情況下,異步地更新頁面內容使得靜態爬蟲更加雞肋。

在當前Web2.0環境下,用戶與瀏覽器交互頻繁,爬蟲更多關注的是綁定在HTML標籤中的可以觸發的事件信息,這也更加符合人工滲透測試的基本流程和操作模式。就目前模擬瀏覽器的動態爬蟲而言,Selenium相比Pyppeteer更加厚重,從其底層上來說都是通過DevTools Protocol來操縱Chrome,而Selenium本質上來說是WebDriver客戶端,是對DevTool Protocol的二次封裝,相比於Pyppeteer直接實現DevTool Protocol而言在效率上略遜一籌。

需要特殊說明的是,Pyppeteer提供一種網絡攔截的功能,可以對HTTP/S請求進行記錄、修改和攔截,對於漏洞檢測所需要的URL、請求方法以及請求參數這些關鍵信息來說簡直不謀而合。

相關焦點

  • 手把手教你寫網絡爬蟲(5):PhantomJS實戰
    本系列:《手把手教你寫網絡爬蟲(1):網易雲音樂歌單》《手把手教你寫網絡爬蟲(2):迷你爬蟲架構》
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    ,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐 總目錄 零基礎全能篇(4套課程) 實用編程技巧進價(1套課程) 數據分析與挖掘(8套課程) 辦公自動化(3套課程) 機器學習與人工智慧(7套課程) 開發實戰篇(4套課程) 量化投資(2套課程) 網絡爬蟲(
  • 從零開始的 Python 爬蟲速成指南,10篇 Python 技術熱文
    其中有基礎知識,爬蟲項目實戰,資料庫,web開發等。註:以下文章,點擊標題即可閱讀《從零開始的 Python 爬蟲速成指南》本文主要內容為以最短的時間寫一個最簡單的爬蟲,可以抓取論壇的帖子標題和帖子內容等。
  • 如何快速學會Python爬蟲(入門篇)
    Python爬蟲實戰二之爬取百度貼吧帖子3. Python爬蟲實戰三之實現山東大學無線網絡掉線自動重連4. Python爬蟲實戰四之抓取淘寶MM照片5. Python爬蟲實戰五之模擬登錄淘寶並獲取所有訂單6.
  • 如何解析 web 應用程式
    應用的站點地圖,也就是網站的所有頁面和功能,我們可以對其測試的攻擊面,主要分幾種:主動式爬蟲、被動式抓取、隱藏頁面獲取、頁面參數擴展。主動式爬蟲:這個很好理解,就是爬蟲,通過頁面之間的超連結關聯來一層一層獲取頁面內容,然後從內容中匹配頁面連結,逐步將網站的所有連結完整爬取,對於從來沒有在其他網頁設置超連結的頁面是無法通過這種方式獲取到的,工具的話,可以用自實現的爬蟲工具,用 python 寫的居多,如今的網站好多架構前端都是 nodejs 框架,數據的獲取通過普通的爬蟲已經無法實現,可以藉助無頭瀏覽器來對頁面進行解析
  • 2020重磅升級「Python數據科學入門與網絡爬蟲案例實戰研討會」
    2020重磅升級的Python數據科學入門與網絡爬蟲案例實戰研討會開始報名啦!  原來數據的獲取不是我們想的那樣,教您玩轉Python爬蟲入門+進階+實戰 。  § 學習基礎Python  § 重視遞歸思維求解能力與訓練  § 你可能不知道而你應該知道的Python知識  § 編程的藝術  § Python網絡爬蟲介紹  § 網絡爬蟲的流程  § 網頁結構和網絡協議  § 利用requests和BeautifulSoup模塊抓取靜態網頁
  • 資料|精通 Python 網絡爬蟲:核心技術、框架與項目實戰
    from=leiphonecolumn_res0731為什麼寫這本書 · · · · · ·網絡爬蟲其實很早就出現了,最開始網絡爬蟲主要應用在各種搜尋引擎中。在搜尋引擎中,主要使用通用網絡爬蟲對網頁進行爬取及存儲。
  • 匯總版|最全數據分析資料匯總(趣味Python、商業數據分析、爬蟲等等)
    •Python入門到進階•Python趣味篇•Python可視化•Python自動化辦公•高效工具•商業數據分析(方法論、實戰)•Python爬蟲•機器學習•大數據(待補充)•資料工具(待補充)•常用網站(新增)Python入門到進階•必須要掌握的Python代碼,短小精悍,非常實用•英偉達小姐姐的7大Python技巧合集,Github點讚量高達2500+•提升Python
  • 《Python3網絡爬蟲開發實戰》:0基礎小白的入門級別教科書
    但其實,Python在生活中應用還挺廣泛的。假如你要學習Python,那你可以從以下6個方向如入手。1、Web開發方向2、數據分析方向3、科學計算方向4、AI的機器學習方向5、AI的計算機視覺方向6、網絡爬蟲方向對於不從事編程、AI崗位的職場人士,我個人比較推薦大家學習一下數據分析跟網絡爬蟲。主要是學習網絡爬蟲,等你學完這部分,還有興趣再繼續學數據分析,是一個很不錯的選擇。
  • 爬蟲教程千千萬,一到實戰全完蛋?
    由此產生的巨大需求,催生並養肥了幾大數據採集軟體公司(火車頭、八爪魚等),各個出版社也順勢推出了各自的網絡爬蟲相關書籍,網上的教程更是滿天飛。其中實戰類的書籍和教程,由於生動形象有案例可尋,閱讀起來不枯燥,使得很受歡迎。
  • 手把手教你寫Modbus-RTU協議(實戰篇)
    好了,下面開始進入我們今天的主題,今天為大家帶來Modbus-RTU協議的實現,作者前面發布過兩篇modbus的理論篇《手把手教你寫Modbus-RTU協議(理論篇)》和《向Modbus協議說"So Easy"!》(可在文末推薦閱讀中跳轉),大家可以先閱讀這兩篇文章掌握一些基本理論。
  • 玩大數據一定用得到的19款 Java 開源 Web 爬蟲
    所以我選擇了用這個爬蟲開始我的研究。如果只是做要求不高的應用,也可試試。如果想找一款功能強大,就別在WebLech上浪費時間了。四、AraleArale主要為個人使用而設計,而沒有像其它爬蟲一樣是關注於頁面索引。Arale能夠下載整個web站點或來自web站點的某些資源。Arale還能夠把動態頁面映射成靜態頁面。
  • web團隊:一群專找移動信息安全漏洞的專家
    原標題:web團隊:一群專找移動信息安全漏洞的專家  ■團隊組參賽案例   行動支付、網上購票、網絡雲盤……這些移動平臺上的應用軟體正逐漸成為我們生活的一部分。但看似安全的他們其實背後隱藏著很大的信息安全隱患。
  • 從零開始的python爬蟲速成指南
    所以我把這篇文章同步更新到知乎上去了,在知乎上可以直接點擊標題跳轉到相應的文章。大家翻到文末,點擊左下角「閱讀原文」就可以找到知乎上的這篇內容了。本文一共整理了126篇爬蟲相關的文章,大家可以通過這個目錄系統的學習爬蟲,也可以收藏起來,當做字典查詢。建議先點擊「閱讀原文」,打開知乎上的這篇文章,然後再收藏。
  • 如何爬取全網1200本Python書|爬蟲實戰篇
    這是菜鳥學Python的第98篇原創文章閱讀本文大概需要3分鐘    前面寫了一篇文章關於爬取市面上所有的Python書思路,這也算是我們數據分析系列講座裡面的一個小的實戰項目。原始數據採集的過程中有很多不一致的數據:有的書的日期是:'September 2007','October 22, 2007','2017-9','2017-8-25'
  • 用程式語言編寫web爬蟲,不得不提Python的簡單、高效
    畢竟這關係到你以後的就業,實際收入,甚至決定了你的職業發展方向。所以,問題來了。Python行業前景如何?主要使用領域有哪些?本文中,小科從以下幾個方面給你解答!1.網頁開發-讓世界看到你的作品Python常用於Web開發。比如Apache可以通過mod_wsgi模塊運行Python編寫的Web程序。Python定義了WSGI標準應用接口,協調Http伺服器和基於Python的Web程序之間的通信。
  • 教你如何編寫第一個爬蟲
    隨著資訊時代的迭代更新,人工智慧的興起,Python程式語言也隨之被人們廣泛學習,Python數據分析、Python web全棧、Python自動化運維等等都很受歡迎,其中還包括了Python爬蟲。但是很對人覺得Python爬蟲是違法的行為,也在懷疑自己到底要不要學爬蟲,之前有一篇文章特別火,就是《 只因寫了一段爬蟲,公司200多人被抓!》
  • 網絡爬蟲違法?扯!繼續學習我的第一個爬蟲
    隨著資訊時代的迭代更新,人工智慧的興起,Python程式語言也隨之被人們廣泛學習,Python數據分析、Python web全棧、Python自動化運維等等都很受歡迎,其中還包括了Python爬蟲。但是很對人覺得Python爬蟲是違法的行為,也在懷疑自己到底要不要學爬蟲,之前有一篇文章特別火,就是《 只因寫了一段爬蟲,公司200多人被抓!》
  • Python爬蟲與文本分析應用案例研討會
    會議主題Python爬蟲與文本分析應用案例研討會   會議目標   本課程將主要講解Python爬蟲技術採集數據,並使用文本分析的技術來解決一些市場研究,尤其是產品研究中的一些具體問題,比如產品提及、產品評價、品牌形象等。
  • Python新手學習網絡爬蟲要做什麼?
    Python網絡爬蟲學習,不需要你深入學習html,只要知道掌握它常用的簡單標籤跟知識點就行。re正則表達式庫可以幫助你高效的從頁面中分離要的內容,正則表達式要略知一二。四、scrapy多去了解下scrapy是應用最廣泛的爬蟲框架,沒有之一,而且是成熟度最高的框架,可利用成熟產品,避免重複「造輪子」,可以更快速的構建項目。