在平时工作当中会用到漏洞扫描工具,用户只需要输入待检测网址,点击一下按钮就可以等待网站的安全检测报告了。作为刚入门的安全小白,对其工作原理产生了浓厚的兴趣,逐渐深层剥离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 requestsfrom lxml import etreeurl = "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?etreedriver = 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_sourcehtml = 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 asynciofrom lxml import etreefrom pyppeteer import launchasync 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、请求方法以及请求参数这些关键信息来说简直不谋而合。
下面是我近几年的收集和整理,整体是围绕着【软件测试】来进行整理的,主体内容包含:python自动化测试专属视频、Python自动化详细资料、全套面试题等知识内容。

对于软件测试的的朋友来说应该是最全面最完整的面试备战仓库,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。

关注微信公众号:程序员二黑,即可获取Python自动化测试资源啦

手把手教你写网络爬虫:Web应用的漏洞检测实战篇!相关推荐

  1. [原创]手把手教你写网络爬虫(2):迷你爬虫架构

    手把手教你写网络爬虫(2) 作者:拓海 (https://github.com/tuohai666) 摘要:从零开始写爬虫,初学者的速成指南! 封面: 介绍 大家好!回顾上一期,我们在介绍了爬虫的基本 ...

  2. python网络爬虫网易云音乐_手把手教你写网络爬虫(1):网易云音乐歌单

    大家好,<手把手教你写网络爬虫>连载开始了!在笔者的职业生涯中,几乎没有发现像网络爬虫这样的编程实践,可以同时吸引程序员和门外汉的注意.本文由浅入深的把爬虫技术和盘托出,为初学者提供一种轻 ...

  3. 手把手教你写网络爬虫(1)

    介绍 什么是爬虫? 先看看百度百科的定义: 简单的说网络爬虫(Web crawler)也叫做网络铲(Web scraper).网络蜘蛛(Web spider),其行为一般是先"爬" ...

  4. 手把手教你写网络爬虫(1):网易云音乐歌单

    介绍 什么是爬虫? 先看看百度百科的定义: 简单的说网络爬虫(Web crawler)也叫做网络铲(Web scraper).网络蜘蛛(Web spider),其行为一般是先"爬" ...

  5. 手把手教你写网络爬虫(2):迷你爬虫架构

    介绍 大家好!回顾上一期,我们在介绍了爬虫的基本概念之后,就利用各种工具横冲直撞的完成了一个小爬虫,目的就是猛.糙.快,方便初学者上手,建立信心.对于有一定基础的读者,请不要着急,以后我们会学习主流的 ...

  6. 【爬虫】手把手教你写网络爬虫(2)

    介绍 大家好!回顾上一期,我们在介绍了爬虫的基本概念之后,就利用各种工具横冲直撞的完成了一个小爬虫,目的就是猛.糙.快,方便初学者上手,建立信心.对于有一定基础的读者,请不要着急,以后我们会学习主流的 ...

  7. 手把手教你写网络爬虫(4)Scrapy入门

    上期我们理性的分析了为什么要学习Scrapy,理由只有一个,那就是免费,一分钱都不用花! 咦?怎么有人扔西红柿?好吧,我承认电视看多了.不过今天是没得看了,为了赶稿,又是一个不眠夜...言归正传,我们 ...

  8. 网易教程python_手把手教你写Python网络爬虫(1):网易云音乐歌单

    摘要:从零开始写爬虫,初学者的速成指南! 需要免费获取本文章讲解的视频+源码,关注+转发此文然后私信我回复"音乐"即可领取资料,也欢迎大家和我一起交流学习Python,共同成长 封 ...

  9. 良匠-手把手教你写NFT抢购软(五)

    良匠-手把手教你写NFT抢购软(五) 前言 本篇文章接上上一篇,如何用易语言去请求刚刚分析的接口. 操作 打开上次做的模板,和精易编程助手,先导入精易模块,再复制代码进去. 点击精易编程助手上面的生成 ...

  10. 手把手教你写网站:Python WEB开发技术实战

    摘要:本文详细介绍了Python WEB开发的基础入门.以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程.通过本文的学习可以快速掌握基于Django的Python WEB的开发 ...

最新文章

  1. sql 拆分_技术分享 | 基于分布式中间件的SQL改造指南
  2. MySQL5.6.35数据库多实例二进制安装
  3. 四字节对齐(DWORD-aligned)
  4. .Net学习难点讨论系列16 - 索引器
  5. 标志寄存器的详细解释
  6. python 处理xml pandas_Python数据处理分析,解决pandas中所有的Excel疑难杂症(上)
  7. dynamodb java_使用Java更新DynamoDB项
  8. 【elasticsearch系列】安装elasticsearch-head插件
  9. android和emui的版本对应,同为Android 操作系统的小米MIUI和华为EMUI, 谁更优秀?
  10. ws配置 zuul_spring cloud zuul 服务网关
  11. JAVA的图形性能,慢在哪里之分析
  12. 多媒体计算机相关知识,多媒体基础知识题库
  13. 或是独体字吗_独体字
  14. ECCV 2020 目标检测论文大盘点(49篇论文)
  15. 【白板动画制作软件】万彩手影大师教程 | 调节动作播放时长
  16. 用ado把excel数据写入oracle,如何将excel表格数据导入到oracle数据库对应的表中?!oracle导出excel文件...
  17. substr()函数
  18. Android 6.0 JNI原理分析 和 Linux系统调用(syscall)原理
  19. python中的del
  20. 虚拟机安装出现directory ezboot not found error loading image:CDMENU.EZB的问题解决方案

热门文章

  1. 直接获得TP-LINK路由器外网IP地址
  2. Kylin启动报错 ERROR: Check hive‘s usability failed, please check the status of your cluster
  3. 冰桶挑战,正在朝功利化和畸形化方向“扩散”
  4. c++小游戏大全(不定时更新)
  5. c语言假币问题的编程,假币问题 (C语言代码)
  6. flask中for循环
  7. 【2014-08-23】Beyong Coding
  8. 阿里云的ECS服务器1M宽带等于多少入网kbps和出网kbps
  9. mysql外联多表查询
  10. 使用Java实现给QQ邮箱发送验证码