關注我,每周分享軟體測試技術乾貨、面試經驗,想要進入軟體測試學習交流群的可以直接私信我哦~~
在平時工作當中會用到漏洞掃描工具,用戶只需要輸入待檢測網址,點擊一下按鈕就可以等待網站的安全檢測報告了。作為剛入門的安全小白,對其工作原理產生了濃厚的興趣,逐漸深層剝離Web應用漏洞檢測的本質是網絡爬蟲技術與漏洞檢測技術的結合,網絡爬蟲主要爬取網站結構並收集可能存在的攻擊面,漏洞檢測技術則是在爬蟲結果的基礎上進行針對性的修改並重放,根據伺服器響應進行判斷。
在本篇文章中,我們將重點介紹爬蟲技術方面的知識。
1、應用場景
通常我們看到的網頁內容是通過瀏覽器呈現的,Web站點的頁面渲染方式對用戶是透明的,然而不同的Web站點渲染方式對爬蟲的影響是巨大的。對於Web站點來說,其頁面渲染方式主要分為兩個類型,即服務端渲染和客戶端渲染。
其中,服務端渲染是指頁面呈現的內容是由伺服器端完成渲染後再返回至瀏覽器的,有效的信息全部包含在HTML頁面中,爬蟲通過頁面解析即可獲取關鍵數據;而客戶端渲染是指頁面的內容主要由JavaScript操作DOM渲染頁面,其生成邏輯、數據獲取、路由跳轉全部由瀏覽器控制,沒有JavaScript運行環境的爬蟲是無法獲取數據的。
在Web2.0背景下,Web應用的數據交互變得更加複雜,為滿足用戶的交互需求,通常採用服務端和客戶端結合的方式渲染,這就使得爬蟲獲取的關鍵信息非常有限。
2、探索爬蟲
通常我們根據是否可以加載JavaScript腳本以及解析Ajax請求將爬蟲分為靜態爬蟲和動態爬蟲。靜態爬蟲對服務端渲染的數據進行下載並解析,獲取所需的數據。靜態爬蟲的邏輯比較簡單,使用Python的requests等庫即可實現頁面下載拿到網頁源碼,再通過Xpath、BeautifulSoup或正則表達式對頁面進行解析之後按照一定的格式進行存儲即可。如我們以中國知網專利數據為例,對頁面表格中的數據進行爬取。
我們需要獲取表格中專利的申請號、公開號、申請人、發明人等關鍵信息進行存儲,具體信息如圖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、請求方法以及請求參數這些關鍵信息來說簡直不謀而合。