——用心做事,国内最可靠的信息安全培训服务商!第3章Web应用程序技术Web应用程序使用各种不同的技术实现其功能。本章简要介绍渗透侧试员在攻击Web应用程序时可能遇到的关键技术。我们将分析HTTP协议、服务器和客户端常用的技术以及用于在各种情形下呈现数据的编码方案。这些技术大都简单易懂,掌握其相关特性对于向Web应用程序发动有效攻击极其重要。3.1HTTPHTTP(HyperTextTransferProtocol,超文本传输协议)是访问万维网使用的核心通信协议,也是今天所有Web应用程序使用的通信协议。最初,HTTP只是一个为获取基于文本的静态资源而开发的简单协议,后来人们以各种形式扩展和利用它.使其能够支持如今常见的复杂分布式应用程序。HTTP使用一种荃于消息的模型:客户端送出一条请求消息,而后由服务器返回一条响应消息。该协议墓本上不需要连接,虽然HTTP使用有状态的TCP协议作为它的传输机制,但每次请求与响应交换都自动完成,并且可能使用不同的TCP连接。3.1.1HTTP请求所有HTTP消息(请求与响应)中都包含一个或几个单行显示的消息头(header),然后是一个强制空白行,最后是消息主体(可选)。以下是一个典型的HTTP请求:GET/auth/488/YourDetails.ashx?uid=129HTTP/l.1Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Referer::zh-cn,zh;q=0.5User-Agent:Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.1;WDW64;Trident/4.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;.NET4.OC;InfoPath.3;.NET4.OE;FDM;。NETCLR1.1.4322)Accept-Encoding:gzip,deflateHost:mdsec.netConnection:Keep-AliveCookie:SessionId=5870C7lF3FD4968935CDB6682E545476每个HTTP请求的第一行都由3个以空格间隔的项目组成。GET:一个说明HTTP方法的动词。最常用的方法为GET,它的主要作用是从Web服务器获取一个资派。GET请求并没有消息主体,因此在消息头后的空白行中没有其他数据。所请求的URL,该URL通常由所请求的资源名称,以及一个包含客户端向该资源提交的参数的可选查询字符串组成。在该URL中,查询字符串以?字符标识,上面的示例中有一个名为uid、值为129的参数。使用的HTTP版本。因特网上常用的HTTP版本为1.0和1.1,多数浏览器默认使用1.1版本。这两个版本的规范之间存在一些差异;然而,当攻击Web应用程序时,渗透测试员可能遇到的唯一差异是1.1版本必须使用Host请求头。Accept:浏览器支持的MIME类型分别是text/html、application/xhtml+xml、博客系统测试方案application/xml和*/*,优先顺序是它们从左到右的排列顺序。详解:Accept表示浏览器支持的MIME类型;MIME的英文全称是MultipurposeInternetMailExtensions(多功能Internet邮件扩充服务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到浏览器。text/html,application/xhtml+xml,application/xml都是MIME类型,也可以称为媒体类型和内容类型,斜杠前面的是type(类型),斜杠后面的是subtype(子类型);type指定大的范围,subtype是type中范围更明确的类型,即大类中的小类。Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;text/html表示html文档;Application:用于传输应用程序数据或者二进制数据;application/xhtml+xml表示xhtml文档;application/xml表示xml文档。Referer消息头用于表示发出请求的原始URL(例如,因为用户单击页面上的一个链接)。请注意,在最初的HTTP规范中,这个消息头存在拼写错误,并且这个错误一直保留了下来。Accept-Language浏览器支持的语言分别是中文和简体中文,优先支持简体中文。详解:Accept-Language表示浏览器所支持的语言类型;zh-cn表示简体中文;zh表示中文;q是权重系数,范围0=q=1,q值越大,请求越倾向于获得其“;”之前的类型表示的内容,若没有指定q值,则默认为1,若被赋值为0,则用于提醒服务器哪些是浏览器不接受的内容类型。User-Agent消息头提供与浏览器或其他生成请求的客户端软件有关的信息。请注意,由于历史原因,大多数浏览器中都包含Mozilla前缀。这是因为最初占支配地位的Netscape浏览器使用了User-Agent字符串,而其他浏览器也希望让Web站点相信它们与这种标准兼容。与计算领域历史上的许多怪异现象一样,这种现象变得很普遍,即使当前版本的InternetExplorer也保留了这一做法,示例的请求即由InternetExplorer提出。Host消息头用于指定出现在被访问的完整URL中的主机名称。如果几个Web站点以相同的一台服务器为主机.就需要使用Host消息头.因为请求第一行中的URL内通常并不包含主机名称。Accept-Encoding浏览器支持的压缩编码是gzip和deflateCookie消息头用于提交服务器向客户端发布的其他参数(请参阅本章后续内容了解更多详情)。Connection表示持久的客户端与服务连接。博客系统测试方案X_FORWARDED_FOR是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。(请看图1)图13.1.2HTTP响应以下是一个典型的HTTP响应:HTTP/1.1200OKDate:Tue,19Apr201109:23:32GMTServer:Microsoft-IIS/6.0X-Powered-By:ASP.NETSet-Cookie:tracking=tI8rk7joMx44S2Uu85nSWcX-AspNet-Version:2.0.50727Cache-Control:no-cachePragma:no-cacheExpires:Thu,01Jan197000:00:00GMTContent-Type:text/html;charset=utf-8Content-Length:1067IDOCTYPEhtmlPUBLIC一//W3C//DTDXHTML1.0Transitional//EN二一transitional.dtdhtmlxmlns=*headtitleYourdetails/title每个HTTP响应的第一行由3个以空格间隔的项目组成。博客系统测试方案使用的HTTP版本。表示请求结果的数字状态码。200是最常用的状态码.它表示成功提交了请求,正在返回所请求的资源。一段文本形式的“原因短语”,进一步说明响应状态。这个短语中可包含任何值,当前浏览器不将其用于任何目的。响应示例中的其他一些要点如下:Server消息头中包含一个旗标,指明所使用的Web服务器软件。有时还包括其他信息.如所安装的模块和服务器操作系统。其中包含的信息可能并不准确。Set-Cookie消息头向浏览器发送另一个cookie.它将在随后向服务器发送的请求中由Cookie消息头返回。Pragma消息头指示浏览器不要将响应保存在缓存中。Expires消息头指出响应内容已经过期.因此不应保存在缓存中。当返回动态内容时常常会发送这些指令,以确保浏览器随时获得最新内容。几乎所有的HTTP响应在消息头后的空白行下面都包含消息主体,Content-Type消息头示这个消息主体中包含一个HTML文档。Content-Length消息头规定消息主体的字节长度。3.1.3HTTP方法当渗透测试员攻击Web应用程序时,几乎肯定会遇到最常用的方法:GET和POST。这些方法之间存在一些必须了解的重要差异,忽略这些差异可能会危及应用程序的安全。GET方法的作用在于获取资源。它可以用于URL查询字符串的形式向所请求的资谏发送参数。这使用户可将一个包含动态资源的URL标注为书签,用户自己或其他用户随后可重复利用该书签来获取等价的资源(作用与标注为书签的搜索查询相似)。URL显示在屏幕上.并被记录在许多地方,如浏览器的历史记录和Web服务器的访问日志中。如果单击外部链接,还可以用Referer消息头将它们传送到其他站点。因此,请勿使用查询字符申传送任何敏感信息。POST方法的主要作用是执行操作。使用这个方法可以在URL查询字符申与消息主体中发送请求参数。尽管仍然可以将URL标注为书签,但书签中并不包含消息主体发送的任何参数。许多维护URL日志的位置及Referer消息头也将这些参数排除在外。因为POST方法旨在执行操作,如果用户单击浏览器上的“后退”按钮,返回一个使用这种方法访问的页面,那么浏览器不会自动重新发送请求,而是就即将发生的操作向用户发出带告.如图3-1所示。这样做可防止用户无意中多次执行同一个操作。因此.在执行某一操作时必须使用POST请求。图3-1浏览器不会自动重新发送用户提出的POST请求,因为这样做会导致多次执行某一操作除了GET和POST方法以外.HTTP协议还支持许多其他因特殊目的而建立的方法。需要了解的其他方法如下:HEAD。这个方法的功能与GET方法相似,不同之处在于服务器不会在其响应中返回消息主体。服务器返回的消息头应与对应GET请求返回的消息头相同。因此,这种方法可用于检查某一资博客系统测试方案源在向其提交GET请求前是否存在。TRACE.这种方法主要用于诊断。服务器应在响应主体中返回其收到的请求消息的具体内容。这种方法可用于检测客户端与服务器之间是否存在任何操纵请求的代理服务器。OPTIONS。这种方法要求服务器报告对某一特殊资源有效的HTTP方法。服务器通常返回一个包含Allow消息头的响应,并在其中列出所有有效的方法。PUT。这个方法试图使用包含在请求主体中的内容,向服务器上传指定的资源。如果激活这个方法,渗透测试员就可以利用它来攻击应用程序。例如,通过上传任意一段脚本并在服务器上执行该脚本来攻击应用程序。还有许多其他与攻击Web应用程序没有直接关系的HTTP方法。然而,如果激活某些危险的方法,Web服务器可能面临攻击风险。3.1.4URLURL(UniformResourceLocator,统一资源定位符)是标识Web资源的唯一标识符.通过它即可获取其标识的资源。最常用的URL格式如下:protocol://hostname[:port]/[path/Ifile[?param=valuel这个结构中有几个部分是可选的。如果端口号与相关协议使用的默认值不同,则只包含端口号即可。用于生成前面的HTTP请求的URL为:=129除这种绝对形式外,还可以相对某一特殊主机或主机上的一个特殊路径指定URL,例如:/auth/488/YourDetails.ashx?uid=129YourDetails.ashx?ui