freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

CNVD共享漏洞库批量爬取方法
2023-01-30 14:02:05
所属地 辽宁省

前期准备

注册该网页账号并登陆即可

需求分析

首先,我们需要该漏洞库的全部漏洞数据,但是,使用python书写爬虫会被反爬机制识别到,从而无法自动大量下载数据。这里,发现该网页有共享的xml数据,如果人工点击下载很耗时,因此,考虑使用JS脚本进行下载。

1675057646_63d759eeab1bd07d6b343.png!small?1675057647360


提供两种思路:

第一种是分别控制脚本挨个点击链接并翻页

第二种是直接请求每个链接获得数据

这里采用第二种思路,通过查看链接发现其均为https://www.cnvd.org.cn/shareData/download/ + 一个数字的形式,因此,直接使用循环遍历请求即可


代码编写

确定了思路之后,直接开始编写代码,但是遇到了一个问题,就是浏览器无法通过js请求直接保存为本地文件,这里借鉴了网上的一些方法,使用FileSaver.js这个脚本来实现js下载文件到本地

下载共享漏洞

首先,封装函数以调用FileSaver.js:

var downloadTextFile = function(mobileCode,a) {

if(!mobileCode) {

mobileCode = '';

}


var file = new File([mobileCode], a+".txt", { type: "text/plain;charset=utf-8" });

saveAs(file);}

然后,因为该页面使用了jQuery,因此可以直接使用封装好的ajax请求资源链接,书写代码循环遍历漏洞库:

var a = 358;var timer = setInterval(function(){

a = a+1;

if(a>1251){clearInterval(timer)}

$.ajax({method:'GET',url:'/shareData/download/'+a,success:function(res){

downloadTextFile(res,a)}})}, 5000)

a为资源链接后面的数字,经过观察,从358开始,到1651结束,结束的数字根据最新的漏洞xml链接而定,鼠标放在链接上,页面左下角就会显示链接:

1675057670_63d75a067adb3a2abd0bc.png!small?1675057671425


末尾的5000表示每隔5秒发送一次请求

下载方法:

1.打开CNVD漏洞库的页面

2.鼠标右键单击检查

3.点击console控制台后,慢慢下载完毕即可,有可能会出现错误,该网站有加速乐,下载的文件存放在浏览器设定的下载路径里

1675057726_63d75a3e97eae59c94867.png!small?1675057727362

总代码:

/* FileSaver.js
* A saveAs() FileSaver implementation.
* 1.3.2
* 2016-06-16 18:25:19
*
* By Eli Grey, http://eligrey.com
* License: MIT
*   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
*/

/*global self */
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */

/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */

var saveAs = saveAs || (function(view) {
"use strict";
// IE <10 is explicitly unsupported
if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
return;
}
var
  doc = view.document
  // only get URL when necessary in case Blob.js hasn't overridden it yet
, get_URL = function() {
    return view.URL || view.webkitURL || view;
}
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
, can_use_save_link = "download" in save_link
, click = function(node) {
    var event = new MouseEvent("click");
    node.dispatchEvent(event);
}
, is_safari = /constructor/i.test(view.HTMLElement) || view.safari
, is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent)
, throw_outside = function(ex) {
    (view.setImmediate || view.setTimeout)(function() {
        throw ex;
    }, 0);
}
, force_saveable_type = "application/octet-stream"
// the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
, arbitrary_revoke_timeout = 1000 * 40 // in ms
, revoke = function(file) {
    var revoker = function() {
        if (typeof file === "string") { // file is an object URL
            get_URL().revokeObjectURL(file);
        } else { // file is a File
            file.remove();
        }
    };
    setTimeout(revoker, arbitrary_revoke_timeout);
}
, dispatch = function(filesaver, event_types, event) {
    event_types = [].concat(event_types);
    var i = event_types.length;
    while (i--) {
        var listener = filesaver["on" + event_types[i]];
        if (typeof listener === "function") {
            try {
                listener.call(filesaver, event || filesaver);
            } catch (ex) {
                throw_outside(ex);
            }
        }
    }
}
, auto_bom = function(blob) {
    // prepend BOM for UTF-8 XML and text/* types (including HTML)
    // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
    if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
        return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});
    }
    return blob;
}
, FileSaver = function(blob, name, no_auto_bom) {
    if (!no_auto_bom) {
        blob = auto_bom(blob);
    }
    // First try a.download, then web filesystem, then object URLs
    var
          filesaver = this
        , type = blob.type
        , force = type === force_saveable_type
        , object_url
        , dispatch_all = function() {
            dispatch(filesaver, "writestart progress write writeend".split(" "));
        }
        // on any filesys errors revert to saving with object URLs
        , fs_error = function() {
            if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
                // Safari doesn't allow downloading of blob urls
                var reader = new FileReader();
                reader.onloadend = function() {
                    var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
                    var popup = view.open(url, '_blank');
                    if(!popup) view.location.href = url;
                    url=undefined; // release reference before dispatching
                    filesaver.readyState = filesaver.DONE;
                    dispatch_all();
                };
                reader.readAsDataURL(blob);
                filesaver.readyState = filesaver.INIT;
                return;
            }
            // don't create more object URLs than needed
            if (!object_url) {
                object_url = get_URL().createObjectURL(blob);
            }
            if (force) {
                view.location.href = object_url;
            } else {
                var opened = view.open(object_url, "_blank");
                if (!opened) {
                    // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
                    view.location.href = object_url;
                }
            }
            filesaver.readyState = filesaver.DONE;
            dispatch_all();
            revoke(object_url);
        }
    ;
    filesaver.readyState = filesaver.INIT;

    if (can_use_save_link) {
        object_url = get_URL().createObjectURL(blob);
        setTimeout(function() {
            save_link.href = object_url;
            save_link.download = name;
            click(save_link);
            dispatch_all();
            revoke(object_url);
            filesaver.readyState = filesaver.DONE;
        });
        return;
    }

    fs_error();
}
, FS_proto = FileSaver.prototype
, saveAs = function(blob, name, no_auto_bom) {
    return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
}
;
// IE 10+ (native saveAs)
if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
return function(blob, name, no_auto_bom) {
    name = name || blob.name || "download";

    if (!no_auto_bom) {
        blob = auto_bom(blob);
    }
    return navigator.msSaveOrOpenBlob(blob, name);
};
}

FS_proto.abort = function(){};
FS_proto.readyState = FS_proto.INIT = 0;
FS_proto.WRITING = 1;
FS_proto.DONE = 2;

FS_proto.error =
FS_proto.onwritestart =
FS_proto.onprogress =
FS_proto.onwrite =
FS_proto.onabort =
FS_proto.onerror =
FS_proto.onwriteend =
null;

return saveAs;
}(
typeof self !== "undefined" && self
|| typeof window !== "undefined" && window
|| this.content
));
// `self` is undefined in Firefox for Android content script context
// while `this` is nsIContentFrameMessageManager
// with an attribute `content` that corresponds to the window

if (typeof module !== "undefined" && module.exports) {
module.exports.saveAs = saveAs;
} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) {
define("FileSaver.js", function() {
return saveAs;
});
}
var downloadTextFile = function(mobileCode,a) {
if(!mobileCode) {
mobileCode = '';
}

var file = new File([mobileCode], a+".txt", { type: "text/plain;charset=utf-8" });
saveAs(file);
}
var a = 358;
var timer = setInterval(function(){
a = a+1;
if(a>1251){clearInterval(timer)}
$.ajax({method:'GET',url:'/shareData/download/'+a,success:function(res){
downloadTextFile(res,a)}}
)}, 2000)

如下图,CNVD漏洞库爬取大概不到半个小时就都下载完成,可以使用python批量修改成xml格式,看需求。

1675058215_63d75c27f2cd633b4cd00.png!small?1675058216579


# 网络爬虫 # 安全漏洞库 # 数据爬虫
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录