TA的每日心情 | 无聊 3 天前 |
---|
签到天数: 1050 天 连续签到: 1 天 [LV.10]测试总司令
|
在平时工作当中会用到漏洞扫描工具,用户只需要输入待检测网址,点击一下按钮就可以等待网站的安全检测报告了。作为刚入门的安全小白,对其工作原理产生了浓厚的兴趣,逐渐深层剥离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、请求方法以及请求参数这些关键信息来说简直不谋而合。
参考文档:
https://segmentfault.com/a/1190000022470322
https://www.zhihu.com/question/278723746
|
|