爬虫阿里巴巴

核心提示6月21日,一则刑事判决书出现在大众眼里,其中几位被告人用爬虫抓取服务器内容,一审判决认为他们触犯了《刑法》第 285 条”非法获取计算机信息系统数据罪”,判处有期徒刑和罚金XXX。底下的围观群众炸了:网友甲:刚学爬虫没多久,是不是要弃坑了

6月21日,一份刑事判决书出现在公众的眼前,判决书中几名被告用爬虫抓取了服务器的内容。一审判决认为,他们已触犯刑法第二百八十五条“非法获取计算机信息系统数据罪”,判处有期徒刑,并处罚金XXX元。

围观者下炸了:

网友:学爬虫没多久。要不要弃坑?网友:怎么办,跑吗?网友C:我像爬虫一样瑟瑟发抖。jpg网友D:爬虫工程师这个职位很酷吗?

但也有更理性的人,比如前雇主起诉前员工利用自己对系统的熟悉程度,伪造特定UA抓取内容,或者或许是自己留了后门。

再比如:不要慌。了解v2的人说其实不是爬虫。它从内部服务器窃取数据。

总之,爬虫技术的明星词汇又进入了大众的视野。值得庆幸的是,在不久前阿里云主办的先知大会上,雷锋网的嘉宾频道也听到了一个关于爬虫的话题。

主讲人是阿里云资深安全专家GG Bond。长期从事自动化安全测试工作,熟悉各种开发技术,擅长渗透测试和数据挖掘。

GG Bond介绍了如何基于历史经验和已知场景构建和实现一个动态爬虫。通过浏览器提供的无头调试方式,遍历网页的所有动态对象,自动填充输入表单的参数值,并触发对象上的绑定事件,有效解决了安全测试过程中的攻击面挖掘。

以下是GG邦德的演讲内容,由雷锋网整理。

在谈爬虫技术之前,先思考一个问题:我们为什么需要扫描爬虫?

根据大量的调查分析,国内大部分企业在做安全性测试的时候还停留在人肉的过程。自动化程度相对较低,在日常的安全检测过程中,企业投入了大量的人力成本进行重复性的工作。

毕竟人是有血有肉的,有时候会累,有时候会情绪化。可能一个公司的测试人员在心情不好的时候做测试,安全测试的最终结果是看心情的。只有攻击面和测试准备充分,才能保证。同时Web2.0框架非常活跃,导致很多失败。他们的爬虫无法识别整个网页的链接结构。

这时候就需要一个爬虫来帮助我们提高整个安全测试的效率。

首先,行业同行和安全工程师是如何实现爬虫的?我们举个例子。之前微信群里有个朋友说,他用下面的代码爬了seebug,但是没有得到结果。这是因为seebug网站利用了代码混淆的技术,并且更新频繁,最终导致之前纯静态的爬虫彻底失效。

如何解决静态爬虫的缺陷?

我们只需要引入一些新的技术,比如带有GS引擎的爬虫,就可以解决这个问题。可以用PIP安装一个安装包,用左边的代码把seebug的链接信息完整的爬出来。

这个项目是继承Google的无界面浏览器开发的。没有一个界面是像healless浏览器那样内置的,现在有四种。他们的缺点是使用很多第三方库非常不稳定。后来幻想曲出现了,但是幻想曲有很多问题无法修复。之后作者宣布不再维护,只能选择谷歌的无界面浏览器。

Google的phantomjs用于抓取主要有三个原因。第一,在谷歌大厂的支持下,谷歌浏览器占据全球第一,稳定率高,每隔几个小时就更新一个版本。另外,谷歌对W3C标准组织的支持是全球所有浏览器中最高的,兼容性也不错。

回到今天的话题,什么是启发式爬虫?

简而言之,启发式爬虫(heuristic crawler)是一种通过分析所有历史经验和看过的已知场景来构建和执行规则的爬虫。

接下来,让我们来看看整个启发式爬虫最佳实践过程。首先,爬虫可以看作是工厂流水线系统。在流水线系统中,必须有一个组长负责每条生产线的任务调度。在这里,罗普是组长。流程清晰后,每一步都各司其职。

首席爬虫经理负责任务调度和事件管理。做扫描爬虫的第一步是把URL发给任务调度的负责人,他会把这个任务发给下面,然后打开页面,进入加载状态。页面加载后,需要判断当前页面是否完整。例如,有时一些web服务器的网络性能很差,或者当GS报告错误或网站超时时,一些资源显示不完整。此时可以通过下图标注的三种状态来判断整个网页的结构是加载还是打开。

完成后,不做任何动作锁定整个浏览器页面,并让其打开另一个新页面,或者跳转到其他页面。

当整个网页加载完毕,锁定整个网页后就可以进入功能劫持阶段了。然后注入一个监听器来监控所有事件的变化以及事件触发的信息。当文件加载、函数劫持和监控都完成后,就可以编译任何绑定到输入框的事件,为某个输入参数值的例行判断做一些信息。

当我们发现页面上有一个表单时,可以通过分析表单的输入类型和名称来填充一些参数。以上过程全部完成后,你会得到当前页面所有信息的结果题。这时候你就可以过滤掉蠕虫病毒,返回给事件管理器,重复整个过程。

确定整体流程后,回到刚才的第一步,页面加载,输入,实现。

当一个页面被加载时,我们应该在什么时候注入我们的劫持代码?这里有几个州可供选择。第一个是在页面加载之后;二是等待页面加载,即当当前网络状态为all 空 idle时,则整个爬虫执行流程继续执行;或者判断是否加载并解析了整个网页的DOM树。

查看连接请求部分。以下三个问题是Web2.0爬虫社区和Web1.0都关心的问题。当你抓取一个网页时,一些代码会从你的页面上跳走,甚至规则会在页面加载前就被转移走。

对于这个问题,每个人都给出了不同的解决方案,有人建议他们重新编译原代码。其实还有另外一种解决方案,就是插件机制,可以在另一个层面控制浏览器。如下所示,为每个浏览器插件提供了一个对象。在整个浏览器做出请求之前,可以在事件被触发的那一刻,网页打开之前,在这里添加一个功能。

比如上面123即将发生时,可以通过添加一个监控事件,将当前页面Web请求全部从反向锁定为链接。爬取页面时,没有跳开页面的功能,这样可以确定整个页面的完整性。我估计那些屏蔽视频广告的插件也是用这个功能来实现这个功能的。

另一个困扰我们的问题就是各种弹窗,甚至会遇到一些极端的开发。一些参数和地址刷新功能将被添加到网页中。如果要保证我们创建的爬虫能够顺利抓取整个页面,不被浏览器的陌生感所困,就需要直接劫持已知的能够造成网页阻塞的函数。

当页面加载后,你可以监听所有的弹出事件,只需弹出一个窗口,然后全部更改即可。关于超时函数,我们做一个原生函数,调用这个函数时,时间永久设置为0。后来也用这个方法调用任何控制时间的函数,把生命周期设为0,这样整个网页就不会因为一些开发的代码而被框住。

另一个爬虫社区非常关心如何获取AJAX请求信息。

有两种方法。一种使用拦截的功能,类似于被动扫描器的代理。浏览器提供了这个API的所有资源,只要网络请求信息能被这个方法截获并记录。

第二种简单粗暴的方法是直接用自己的函数劫持原生函数,记录请求信息。这里只需要劫持这些方法就可以扫描爬虫需要的所有功能。

当函数劫持过程完成后,开始分析整个网页下的所有节点信息和表单信息。有两种具体的方法可以做到这一点。例如,通过使用循环DOM的所有节点信息。另外,我们可以使用DOM提供的强大工具,通过自定义规则过滤文档中的节点,生成新的节点信息。我们可以预先定义相关规则来捕获节点信息。例如,我们可以监控所有相关信息,只要SRC在DOM的任何节点上。只要网页上的任何连接信息或图像的地址发生变化,都可以通过这种方法捕获。

当所有的信息都是通过DOM获取的时候,并不是所有的事件信息都需要再次触发。我们经常建议为特定场景匹配并执行它。比如浏览一些新闻网站,需要刷新滚屏才能刷出更多新闻,背后的技术就是监控翻页。比如在使用一些模态框的时候,需要点击网页上的一个按钮,这是一个绑定事件。点击它将弹出模式框来输入信息。比如社区型的知乎、雪球网站,为了实现新闻的实时分发,背后都有历史任务在运行。

得到整个节点信息和绑定信息后,可以选择触发这些事件信息。有两种触发事件信息,如下面的代码所示。上面有一个事件,事件的名字叫click。可以通过代码直接声明一个事件来直接触发它。执行这两行代码时,浏览器会弹出一个点击弹出窗口。另一个简单粗暴的方法是找到事件背后的价值。事件绑定背后的值是一个可以通过调用eval直接执行的代码。

当然,我们可以模拟任何事件。我们设计了用于安全测试的爬虫。在安全测试过程中,发现攻击面的数量决定了整个安全测试的效果。表单在Web场景中非常重要。比如我的登录页面和搜索页面的整个开发过程中,数据库的添加、修改、查询都与表单有关。遍历表单的方法有很多种,这里还有一种更方便的方法,直接使用原生对象,通过循环找出整个当前表单的登录框中有什么。

创建表单后,参数类型自动获取表单中输入框的字符长度,并为每个参数生成一个合适的值。同时可以调用node方法为表单设计一个值,也可以通过这个方法帮助按钮点击选项。当我们有一个表单时,我们可以实现自动填充。比如爬虫发现某个页面是登录界面,就可以判断其输入框的名称是否包含这些内容。如果是这样,它可以直接从这里选取一个名称并填写。当我们发现一个表单与之相关时,可以按照我们的规则得到英文名,然后等待另一个@,再随机挑选DOM的列表得到一个邮箱,自动填充。

整个过程介绍完后,再看一个爬虫演示,主要是抓取一个网页,抓取出网页中所有的信息图片、动态入口、元素。

演示下载地址:https://github.com/ring04h/papers/blob/master/xianzhi _爬虫_演示. mov

最后总结四点。

当我们在URL中发现孤立的数字时,90%都是动态参数。

爬行到一个页面结果时,发现pass中有多个链接,具有长度相近的一致性,生成方式为其他方式生成。我们可以判断存在多少个长度相同的链接。如果这个数字大于5或10,我们应该小心它是一个动态参数。

当我们解决伪静态问题时,伪静态中70%到80%的时间是通过单杠和反单杠来分析的。比如第一个连接是反斜杠伪静态,后面是单杠伪静态。我们把整个部分分开。这种分割是什么类型的值?如果是塑形,就打第一个。只要孤立数出现在某条路径上,就可能是动态参数。

此外,我们通过哈希来清除蠕虫。例如,如果有相同的链接,他们在123456789。我们只需要把这个链接的HASH参数剪成括号,最后看看它们出现的频率。如果出现的次数很多,说明这个参数是一个常数,它以固定的方式持有。如果参数后面的次数很宽松,只有1和2,那条路径后面的参数可能是动态参数。

以上内容来自阿里先知大会,雷编辑..

 
友情链接
鄂ICP备19019357号-22