利用chrome_remote_interface实现程序化、自动化Web安全测试

更新日期: 2019-07-06阅读: 2.7k标签: 测试

如果要问有哪些抓包神器或者流量分析工具?以下几款工具是必须要提的,burpsuite(跨平台)、fiddler(windows下抓包神器)、wireshark(经典网络抓包工具)、justniffer(与前面几个使用代理获取流量不一样的是,justniffer是基于网卡获取流量)等。以上这几款工具之前我有单独成文介绍过,如有需要可点击蓝色链接移步。

那么如果问有哪些程序化的抓包工具?(注明一下这里的程序化指的是可编程)首先burpsuite算一个,因为我们可以开发扩展工具(burpsuite插件开发之检测越权访问漏洞);另外fiddle也算一个,可以编辑配置文件,达到扩展功能,之前也介绍过。

那么如果问有哪些即可以实现程序化又可以实现自动化的抓包工具?(注明一下这里的自动化是指自动产生流量)这个问题有点拗口,你可能会想为什么一个抓包工具要负责产生流量,流量交给爬虫岂不是更好?这个问题暂且放一放,继续往下看。


自动化安全测试

平常我们经常会使用burpsuite等工具检测一个网站的安全性,检测方法不外乎使用浏览器访问网站且把流量代理到burpsuite上,然后在burpsuite上通过拦截、修改、重放流量等方式测试网站安全性。然而当要测试的网站非常多时,有没有一个更自动化、更省力的方式去测试呢?方案肯定是有的,简单来说要实现自动化web安全测试无非要解决几个问题,首先是流量怎么产生?然后是怎么从流量中分析出漏洞?


自动化测试方案:主动扫描器

市面上基于爬虫的主动扫描器就是一种自动化安全测试工具,首先它的流量是通过爬虫爬取url主动产生的,然后利用一些漏洞插件去构造不同的访问请求。短板:目前市面上扫描器爬虫大多基于web1.0,无法加载js渲染网页,而现在越来越多的网站使用web2.0技术实现前后端数据交互。


自动化测试方案:被动扫描器

一些大厂内部自研的被动扫描器,首先它的流量不是通过爬虫主动获取的,而是通过监听交换机等网络设备的网卡流量,然后利用一些漏洞插件去分析流量中存在漏洞的点。短板:适合大厂各业务线安全检查不适合测试某个特定的网站,因为需要人为访问网站产生流量。


自动化测试方案:selenium+流量获取工具+漏洞插件

selenium是一款网站自动化测试工具,可以程序化的操作浏览器,实现自动化产生流量。再结合抓包工具以及漏洞检测插件,应该就可以解决流量获取以及漏洞检测的问题。短板:用selenium只能实现一些简单的浏览器操作,对于检测复杂的网站系统,似乎不够用,而且速度很慢,性能很差。


自动化测试方案:chrome_remote_interface+漏洞插件

之前我介绍过headless chrome,也介绍过phantomjs等web2.0爬虫工具,目前推荐去学习使用headless-chrome。headless chrome工具是用来自动加载js,获取渲染后的页面源码,解决web2.0爬虫之困。而chrome_remote_interface是一个更底层的工具,可以用来分析协议,简单说就是可以分析整个渲染过程,以及截取分析过程中的流量。就类似您打开了chrome浏览器的审查元素功能,然后刷新一下页面,查看一下network信息。



chrome_remote_interface介绍

chrome_remote_interface是一个开源项目,项目地址,并且支持命令行、编码两种方式,且使用node.js开发。


安装使用

因为chrome_remote_interface是基于nodejs的,因此需要安装npm包管理工具。

yum install npm -y

然后创建一个目录,初始化一个项目

npm init

在目录下安装chrome_remote_interface

npm install chrome-remote-interface

创建一个简单的nodejs程序(nmask.js):

const CDP = require('chrome-remote-interface');
// node nmask.js https://nmask.cn
var options = process.argv;
var target_url = options[2];
CDP((client) => {
    // extract domains
    const {Network, Page} = client;
    
    // setup handlers
    Network.requestWillBeSent((params) => {
        console.log(params.request.url);
    });
    Page.loadEventFired(() => {
        client.close();
    });
    
    // enable events then start!
    Promise.all([
        Network.enable(),
        Page.enable()
    ]).then(() => {
        return Page.navigate({url: target_url});//输出请求的url
    }).catch((err) => {
        console.error(err);
        client.close();
    });
}).on('error', (err) => {
    console.error(err);
});

说明:在运行这段程序前,必须要在系统上安装chrome以及启动chrome headless监听模式,具体怎么安装chrome headless可以移步:headless chrome and api

启动chrome headless监听模式:

chrome --headless --remote-debugging-port=9222
或者
google-chrome --headless --remote-debugging-port=9222

然后另外开启一个窗口,运行nodejs:

node nmask.js https://thief.one

运行结果如下:(输出渲染过程中请求的所有url)



chrome_remote_interface for python

由于chrome_remote_interface是nodejs实现的,因此对于不熟悉nodejs的朋友来说coding成本比较高。然而好在已经有外国友人用python封装了一个工具,项目地址,虽然目前此项目尚处于初级阶段,但实实在在地解决了我的问题。


安装使用

基于是用python3.5开发的,那么就clone一下项目,直接安装吧:

git clone https://github.com/wasiher/chrome-remote-interface-python.git
python3 setup.py install

编写一个python版的程序(nmask.py):

#! -*- coding:utf-8 -*-
'''
__author__="nMask"
__Date__="7 Jun 2018"
__Blog__="https://thief.one"
__version__="1.0"
__py_version__="3.5"
'''
import asyncio
import chrome_remote_interface
class callbacks(object):
    ''' callback class '''
    target_url = ''
    result = []
    async def start(tabs):
        await tabs.add()
    async def tab_start(tabs, tab):
        await tab.Page.enable()
        await tab.Network.enable()
        await tab.Page.navigate(url=callbacks.target_url)
    async def network__response_received(tabs, tab, requestId, loaderId, timestamp, type, response, **kwargs):
        '''
        print(response.requestHeaders)
        print(dir(response))
        more response attribute https://chromedevtools.github.io/devtools-protocol/tot/Network#type-Response
        '''
        try:
            body = tabs.helpers.old_helpers.unpack_response_body(await tab.Network.get_response_body(requestId=requestId))
        except tabs.FailResponse as e:
            print('[Error]', e)
        else:
            print(response.url,response.status,len(body))
            callbacks.result.append((response.url,response.status,len(body)))
    async def page__frame_stopped_loading(tabs, tab, **kwargs):
        print("[Info]Finish")
        tabs.terminate()
    async def any(tabs, tab, callback_name, parameters):
        pass
if __name__=="__main__":
    callbacks.target_url = "http://www.baidu.com"
    asyncio.get_event_loop().run_until_complete(chrome_remote_interface.Tabs.run('localhost', 9222, callbacks))
    print(callbacks.result)

说明:同样的在运行这段代码前,先运行chrome headless监听程序。

然后运行该程序:

python nmask.py


说明:运行程序,最终得到渲染过程中请求的url、响应码、响应内容长度。


Chrome Debugging Protocol

无论是nodejs版本的chrome-remote-interface还是python版本的,实现的底层都是基于Chrome Debugging Protocol接口,官方文档,因此在使用chrome-remote-interface过程中,可以查询一下这个文档。比如python版本中network__response_received函数,是封装了Chrome Debugging Protocol接口Network.ResponseReceived函数,而此函数接受的参数,以及一些属性方法等都可以在该文档中查询。


解决文章开头的问题

文章开头还留了一个问题,有哪些即可以实现程序化又可以实现自动化的抓包工具?想想chrome-remote-interface能干啥?其一可以使用nodejs、python(可能还有其他语言封装的项目)编程,底层接口文档比较完善;其二用它来写web2.0爬虫,访问页面产生流量,当然区别web1.0爬虫,这里的流量是完整的流量,相当于人工打开浏览器访问网页;其三可以获取流量,并且进行分析。第一点功能实现了程序化,第二三点功能实现了自动化。

最后让我们回过头看一下前文提到的自动化测试方案–主动扫描器,其短板就是没法解决web2.0爬虫的困境,而chrome-remote-interface恰恰可以解决,发挥下想象力,其前途应该无限!

来自: https://thief.one/2018/06/07/1/ 


 

链接: https://fly63.com/article/detial/4042

测试工具比较:选Jest,不选Mocha

Jest的未来看起来非常令人激动!看到Jest推陈出新如此快速,我感觉它将很快成为整个React生态系统中大部分项目的首选工具。我建议,应该把测试迁移到Jest上去。

你需要了解的前端测试“金字塔”

如果您正在测试前端应用程序,则应该了解前端测试金字塔。在本文中,我们将看到前端测试金字塔是什么,以及如何使用它来创建全面的测试套件。

web网页性能测试工具都有哪些

作为前端开发,我们不仅需要满足产品需求功能的实现,同时也需要对自己做的网站进行安全、易用性、性能等方面的考虑。随着目前技术不断进步,web页面的性能测试工具也在不断完善,通过这些工具,我们可以客观的评价web网站的质量水平。

js单元测试工具-jest自动化测试

jest 是 facebook 开源的,用来进行单元测试的框架,可以测试 javascipt 和 react。jest 提供了非常方便的 API,可以对下面的场景方便的测试:一般函数、异步函数、测试的生命周期、react 测试

web测试要点、方法_web端测试大全总结

web测试大全,测试web网站有哪些点呢?主要包括:功能测试、兼容性测试、安全测试、输入框测试、用户权限测试等

前端性能测试工具整理简介_性能测试工具都有哪些?

前端性能测试工具都有哪些:Favicon、Open Graph、图片优化-压缩图像、CSS 优化-Autoprefixer、Purifycss、minify CSS、减少载入时间、GZIP、CDN、优化平台-Sentry、Google Tag Manager

不用写代码,也能做好接口测试

本文你将了解到:1、接口测试基本概念,包含什么是接口,什么是接口测试,为什么要做接口测试;2、接口测试用例设计,3、怎样不用写代码,也能快速的根据开发的API文档完成接口自动化测试脚本

Selenium打开浏览器加载慢的原因

在自动化元素定位操作中经常使用智能等待来加强定位的强壮性,主要就是因为WebDriver没有提供页面加载场景的方法;在使用JavaScript知识的突然心生灵感,可以使用JavaScript来配合验证页面加载,结果发现我真是井底之蛙。

power assert_更智能、优雅的全方位 assert 断言库

在写测试代码时,以往我们需要翻阅文档,学习各种 API 才能明白如何操作断言。而现在我们可以透过 power-assert 的 assert 方法来减轻调试压力。不仅如此,它还提供更加直观,具体的运行效果,帮助 DEBUG。写测试代码,其实可以很容易。

常用的web网站负载/压力/性能测试工具

在网站上线发布之前,我们除了必要的安全、功能测试外,往往还需要进行压力测试。通过模拟实际应用的软硬件环境及用户使用过程的系统负荷,长时间或超大负荷地运行测试软件。包括:Apache JMeter 、LoadRunner、NeoLoad等

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!