2.3 Web应用程序的内容与功能
随着应用程序功能越来越多,结构越来越复杂,对其进行有效的解析就显得格外重要。我们不但要了解应用程序的功能,更要知道应用程序运行机制的每一个方面、核心安全机制及其在服务器和客户端上使用的技术,这样就可以确定应用程序可能存在的漏洞和主要受攻击面。
2.3.1 抓取站点内容——网络爬虫介绍
网络爬虫(又被称为网页蜘蛛、网络机器人,在FOAF社区中间更常被称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外,一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
1.网络爬虫的组成结构
在网络爬虫的系统框架中,主过程由控制器、解析器、资源库3部分组成。控制器的主要工作是负责给多线程中的各个爬虫线程分配工作任务。解析器的主要工作是下载网页,进行页面的处理,主要是将一些JS脚本标签、CSS代码内容、空格字符、HTML标签等内容处理掉,爬虫的基本工作由解析器完成。资源库用来存放下载到的网页资源,一般都采用大型的数据库存储,如Oracle数据库,并对其建立索引。
(1)控制器。
控制器是网络爬虫的中央控制器,它主要负责根据系统传过来的URL链接,分配一线程,然后启动线程调用爬虫爬取网页的过程。
(2)解析器。
解析器是网络爬虫的主要部分,其负责的工作主要有:下载网页的功能,对网页的文本进行处理,如过滤功能、抽取特殊HTML标签的功能、分析数据功能。
(3)资源库。
资源库是用来存储网页中下载下来的数据记录的容器,并提供生成索引的目标源。中大型的数据库产品有Oracle、Sql Server等。
2.聚焦爬虫工作原理以及关键技术概述
网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成部分。传统爬虫从一个或若干个初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列,然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
相对于通用网络爬虫,聚焦爬虫还需要解决3个主要问题。
(1)对抓取目标的描述或定义。
(2)对网页或数据的分析与过滤。
(3)对URL的搜索策略。
抓取目标的描述和定义是决定网页分析算法与URL搜索策略如何制订的基础。而网页分析算法和候选URL排序算法是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在。这两个部分的算法又是紧密相关的。
图2-7所示为网络爬虫分布示意图。
图2-7 网络爬虫分布示意图
3.抓取目标描述
现有聚焦爬虫对抓取目标的描述可分为基于目标网页特征、基于目标数据模式和基于领域概念3种。
基于目标网页特征的爬虫所抓取、存储并索引的对象一般为网站或网页。根据种子样本获取方式可分为以下3种。
(1)预先给定的初始抓取种子样本。
(2)预先给定的网页分类目录和与分类目录对应的种子样本,如Yahoo!分类结构等。
(3)通过用户行为确定的抓取目标样例,分为:① 用户浏览过程中显示标注的抓取样本;② 通过用户日志挖掘得到访问模式及相关样本。
其中,网页特征可以是网页的内容特征,也可以是网页的链接结构特征,等等。
2.3.2 Wireshark抓包步骤详解
Wireshark是非常流行的网络封包分析软件,功能十分强大,可以截取各种网络封包,显示网络封包的详细信息。使用Wireshark的人必须了解网络协议,否则就看不懂Wireshark了。
为了安全考虑,Wireshark只能查看封包,而不能修改封包的内容,或者发送封包。
Wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以Wireshark看不懂HTTPS中的内容。如果处理HTTP、HTTPS还是用Fiddler,其他协议如TCP, UDP就用Wireshark。
图2-8所示为Wireshark开始界面。
图2-8 Wireshark开始界面
Wireshark是捕获机器某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡,双击进入捕获界面,如图2-9所示。
图2-9 Wireshark捕获界面
Wireshark捕获界面主要分为这几个部分。
(1)Display Filter(显示过滤器),用于过滤。
使用过滤是非常重要的,初学者使用Wireshark时,将会得到大量的冗余信息,在几千甚至几万条记录中,以至于很难找到自己需要的部分。过滤器会帮助我们在大量的数据中迅速找到所需要的信息。
(2)Packet List Pane(封包列表),显示捕获到的封包、有源地址和目标地址及端口号。
封包列表的面板中显示编号、时间戳、源地址、目标地址、协议、长度以及封包信息,可以看到不同的协议用了不同的颜色显示。
(3)Packet Details Pane(封包详细信息),显示封包中的字段。
这个面板是最重要的,用来查看协议中的每一个字段。
各行信息分别如下。
Frame:物理层的数据帧概况。
Ethernet II:数据链路层以太网帧头部信息。
Internet Protocol Version 4:互联网层IP包头部信息。
Transmission Control Protocol:传输层T的数据段头部信息,此处是TCP。
Hypertext Transfer Protocol:应用层的信息,此处是HTTP协议。
(4)Dissector Pane(16进制数据)。
(5)Miscellanous(地址栏,杂项)。
利用Wireshark软件进行抓包捕获数据的操作如图2-10所示。
图2-10 抓包捕获数据
步骤1 选中你要截取的数据包,双击该条目。
步骤2 弹出的显示框是该数据包的详细信息。
2.3.3 Web应用程序的传递参数解析
Web页面是动态和交互的,Web页面之间的数据交换往往存在一些参数的传递。不管是通过哪种语言平台编写Web页面处理程序,其参数传递的方式方法类似且多种多样。常见方式主要包括通过URL地址、Application/Session、Cache、Cookies以及基于服务器文件或数据库等。
URL地址传递参数方式在Web页面程序处理中非常常见,其形式是以页面地址后面附带参数的方式浏览页面,如“http://test.net/Expert/PostNew.asp? room=301”,其中“room=301”即传递的参数名称和值。以ASP.NET程序中URL参数传递处理为例,其简单处理过程如下。
发送页面处理程序a.aspx:
Send_url = "b.aspx? name=" + paraValue; Response.Redirect(s_url);
接收页面处理程序b.aspx:
Receive_value=Request.QueryString["name"];
URL地址传递参数方式的特点主要表现在以下几个方面。
(1)URL地址法简洁易用,可同时传递多个字符型参数。
(2)URL地址法可以很方便地在页面之间切换并传递参数,无须额外的处理,基于正常情况下不会产生性能损失。
(3)URL传递参数长度受限,最大为2K。
(4)URL只能传递字符型参数。
(5)信息泄露。URL地址在客户端可见,会泄露信息,可能被黑客用来攻击系统。
在Web应用程序使用URL地址作为传递参数的过程中可能会出现以下几种常见的应用问题。
(1)因URL传递参数长度受限,最大为2K,在应用中可能会出现超出范围时的处理错误。
(2)URL只能传递字符型参数,在应用中,经常会传递一些中文名的参数或URL地址,因为发送页面和接收页面的字符编码方式不一样而导致参数解析处理错误,参数包含中文时出现乱码或者参数接收错误。
(3)Web程序中对字符编码的方法多种多样,但是有些方法对一些特殊字符,如! @ # $&* ( ) = : / ; ? + ’中的某些不能进行编码,因此对参数中包含某些特殊字符时不能正确处理,当参数中包含这些特殊字符时,软件接收处理出现异常。
(4)URL可以传递一定长度大小字符型参数,在应用中通过URL接收的参数经常需要进行逻辑处理,如类型转换或者数字计算操作等,处理过程中开发人员可能会对参数在界面输入时限制处理不充分,而且开发人员在后续逻辑处理中过分信任传递过来的参数而未进行充分逻辑判断,导致在后续的逻辑处理中出现边界处理或者类型转换的错误,从而程序出现异常甚至崩溃。
(5)URL地址中的参数经常与数据库SQL语句中的参数关联,如果开发人员对SQL语句参数化处理不完善,通过URL地址传递参数也容易引起SQL注入问题,参数中包含特殊字符、类型或者长度不符合要求时导致程序出错,甚至可以通过这个入口破坏或者获取数据库信息;
(6)URL显示传递参数,容易产生信息泄露问题,一些关键信息URL地址在客户端可见,这些信息可能被黑客用来攻击系统。
针对采用URL地址传递参数的Web程序,为发现及解决其应用问题,可通过以下几个方面进行测试。
(1)分析软件需求,是否需要处理超过2K大小的参数,如需要则通过Web界面控件或者URL输入超出2K大小参数进行测试,通过这种方式可以发现软件是否可以正常处理超出2K大小参数的需求问题;如无须求也可以通过此测试检测软件在参数大小超过2K时是否进行了相应的限制或者错误处理。
(2)通过Web界面控件或者URL输入中文字符参数进行测试,检测软件在接收页面时处理是否正常,是否出现乱码或者异常错误。
(3)通过Web界面控件或者URL输入各种特殊字符,如! @ # $& * ( ) = : / ; ? + ’等,检测软件接收处理是否正常,是否可以显示处理必需的特殊字符。
(4)通过Web界面控件或者URL输入参数边界值,同时包括输入各种类型参数,检测软件运行是否正常。
(5)通过Web界面控件或者URL输入包含跟数据库SQL语句相关的一些特殊字符参数和一些关键字符串等,检测软件是否存在SQL注入问题,同时也可以采用一些安全测试工具对URL输入参数进行SQL注入的渗透测试。
(6)检测URL参数中是否包含关键信息,并可通过安全测试工具进行恶意破坏或者攻击测试。
针对URL地址传递参数应用问题,在应用中有以下建议。
(1)在安全性要求较高的系统中不推荐使用这种方法,只适合在一些安全性要求不高、页面逻辑比较简单的场合。
(2)对参数长度超出2K的传递建议不要采取此方式。
(3)对地址信息进行编码,且保证发送页面和接收页面编码和解码方式对应一致。
(4)对从URL地址中接收的参数信息进行边界和类型校验。
(5)为防止信息泄露,对URL传递的参数进行加密处理,同时需要考虑加密和解密过程的性能损失。
(6)为防止信息泄露,也可对URL进行重写,经过一定算法重组的URL信息,在IE中不显示真正的参数或者网页链接信息。
Web页面参数传递方式多种多样,各有优缺点,用户在开发和测试过程中,针对各自特点选择相应方式进行设计和相关处理。在Web页面处理程序测试过程中,测试人员应先充分了解Web页面参数传递采用的方式,如果采用URL地址进行参数传递,则根据其特点和应用中常见的问题,采用正确的方法进行测试,以解决各种应用问题,提高Web应用程序的质量。