入侵检测的前期技术储备(一)
web应用程序提供了大量的技术来实现他们的功能,本章简要介绍一下当你入侵一个web应用程序的时候可能会遇到的关键技术。其中,http协议作为客户端和服务端通用的技术,我们会重点介绍一下,其他还包括在不同情况下的数据编码方式。这些技术通常都很容易理解,并且了解这些技术的相关特性对之后展开有效的入侵是很重要的。
如果你对web应用所使用的技术已经很熟悉,并且确信本章不会再给你更多新的内容的话,你可以直接跳过本章节。如果你还是在学习web应用是如何工作的,那么在继续进行后面章节的具体的漏洞之前,你应该首先阅读本章。关于本章所涉及知识的更深入学习,我推荐阅读David Gourley 和Brian Totty所著的《HTTP:The Definitive Guide》这本书,以及相关的万维网联盟网站www.w3.org。(consortium 财团,联营企业,and also the website of the World Web Web Consortium at www.w3.org)
The HTTP Protocol
超文本传输协议(HyperText Transfer Protocol)是用在万维网上的核心交互协议,也是当前所有web应用程序所使用的主要协议。它原本是一个简单的协议,主要用来获取静态的文本型资源。之后,http协议经过一系列的扩充和改变以适应当前复杂的web应用,而这些应用到现在已经非常普遍了。(It has since been extended and leveraged in various ways to enable it to support the complex distributed applications that are now commonplace.)
HTTP协议使用基于消息的(message-based)模型,在这个模型中,客户端发送一个request message , 服务端便返回一个response message。HTTP协议本质上(essentially)是无连接的(connectionless):尽管http协议使用有状态的tcp协议作为传输协议,但每次request和response都是一次独立的交互,并使用不同的tcp连接。(although http uses the stateful tcp protocol as its transport mechanism , each exchange of the request and response is an aotonomous transaction and may use a different tcp connection .)
HTTP Request
所有的http消息都包含有一个或多个消息头(message headers),每个消息头各占一行,消息头之后跟一个强制的(mandatory)空行,空行后面跟着可选的消息体(message body)。一个传统的HTTP请求如下所示:
GET /webgoat/attack?Screen=58&menu=5 HTTP/1.1 Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: zh-CN Accept-Encoding: gzip, deflate Referer: http://localhost/webgoat/attack User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9;ZHCN) Host: localhost Cookie: JSESSIONID=493BA6404AD7D05D0155F3692D36B35B Connection:keep-Alive
每个http请求的第一行都包含有三个元素,以空格隔开:
1、HTTP请求的方法(method)。最常见的方法是GET,主要用来从服务器端获取数据。注意GET请求没有消息体,因此在消息头之后的空行后面就不再有其他数据了。
2、请求的URL地址。URL通常是要请求的资源的功能名称,名称后面是可选的客户端传递过来的一些查询字符串参数。查询参数在URL中以“?”作为指示。比如,在上面的请求中就包含了两个参数,参数Screen的值为58,参数menu的值为5
3、所使用的http协议的版本。通用的http协议版本只有1.0和1.1这两个,大多数浏览器默认情况下使用的是1.1版本。在这两个版本协议的说明书(specification)中是有一些不同的。但是,在你入侵一个web应用程序的时候,你只需要记住下面一点不同就足够了:在1.1版本的协议里,request的Host头是强制要求的。
下面是在本例request里的一些其他请求头的说明:
1、Referer头表示本次请求是在哪个URL地址发出的,比如用户点击了一个超链接(indicate the URL from which the request originated)。你可能注意到在最初的HTTP协议规范里面这个单词是拼错的(misspelled,正确的单词应该是reference 引用。)
2、User-Agent头表示生成该请求的浏览器或软件的信息。你可能注意到大多数浏览器都使用Mozilla作为前缀,这是有历史原因的。User-Agent消息头最初是Netscape浏览器所使用,其他浏览器厂商想要插足该领域于是沿用了这一标准,经过计算机历史的变迁以及一系列巧合,该标准稳固到沿用至今,甚至在最新版本的IE浏览器中也在使用。
3、Host头来确定要访问的完整的URL的主机名称(the hostname that appeared in the full URL being accessed)。这在当前一个主机托管多个web站点的情况下就显得很重要了,因为在第一行要请求的URL地址中是不包含主机名称的。
4、Cookie头是向服务器提交额外的参数,这些参数是在一开始的请求中服务器提供给客户端的。(described in more detail later )
HTTP Response
一个传统的HTTP response如下所示:
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Pragma: No-cache Cache-Control: no-cache Expires: Thu, 01 Jan 1970 08:00:00 CST Content-Type: text/html;charset=ISO-8859-1 Date: Sun, 25 Mar 2012 06:26:20 GMT Content-Length: 35295 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />……(以下内容省略)
每个HTTP response的第一行也包含三个元素,以空格隔开:
1、使用的HTTP协议版本。
2、服务器对请求结果的状态码。200是最常见的状态码,表示请求成功执行并返回所请求的数据。
3、对上面请求状态码的简要描述,如本例中的OK。对浏览器来讲,这个文本型的描述是没有什么用处的。
response的其他消息头含义如下:
1、Server头表示服务器所使用的软件,有时候会包含更详细的信息比如已安装的单元(modules)以及服务器操作系统。当然,这些信息有时候并不准确。
2、Set-Cookie头向浏览器设置cookie值,这个值会在接下来的交互中由浏览器重新提交给服务器,比如如今基于cookie的身份验证机制。
3、Prams头告知浏览器是否在缓存中存储本次响应的内容,Expired头表示缓存内容的过期时间。这种结构通常用在动态网站中,网站内容是根据用户请求动态生成的,确保用户始终能获取到内容的最新版本。
几乎所有的response的消息头之后的空行后都会跟上消息体。Content-type头表示返回的消息体的类型,Content-Length表示消息体的byte长度。如本例中消息体类型是html类型,长度为35295。
HTTP Method
当入侵一个web网站的时候,你将基本上都是在处理(exclusively)最常用的两个方法:GET和POST。我们需要详细的了解一下这两个方法中一些重要的不同点,如果一个web网站忽视了它们的话,将会影响到web程序的安全(as they can affect an application’s security if overlooked)。
GET方法是设计用来从服务器端获取数据的(retrieve resources)。它可以在所请求资源的URL地址后面添加请求参数,这样用户就能将这个地址加入到书签或收藏夹中以便下次使用,或者将该地址分享给其他用户。该URL地址会显示在浏览器地址栏里,并且会在很多地方留下日志信息,比如浏览器的历史记录和web服务器的访问日志。当访问其他域的网站的时候,该URL地址也会放到request的Refer头中传输。因此,查询参数中是不能存放敏感信息的。
POST方法是被设计用来执行一些行为(perform actions)。用这个方法的时候,请求参数既可以放在URL后面的查询参数里,也可以放在message body里。尽管POST请求的URL也可以添加到书签,但存放到message body里的数据就被排除在外了(excluded)。同样的,这些参数也不会出现在web服务器的日志以及Refer头中。因为POST方法是用来执行一些行为的,假设用户发送了POST请求之后,点击了浏览器的返回上一页按钮,那么浏览器将不会重新提交该表单,而是向用户发出一个警告是否重新提交表单,这样可以防止用户一些无意识的行为。因此,对于一些重要的操作,应当使用POST方法来提交。
除了GET和POST之外,http协议还提供了大量的方法。我们并不需要去了解所有的方法,但下面的几个方法在学习入侵的过程中是需要了解的。
1、HEAD方法。该方法跟GET方法的request是一样的,区别在于当服务器收到HEAD方法的请求的时候,服务器的response将只有response head而没有response body。因此,这个方法可以进行快速的目录遍历与扫描。
2、TRACE方法。该方法是用来诊断的(designed for diagnostic purposes)。服务器在接受到该方法的请求后,会在response的response body中放入它收到的request message的完整内容。通过这个方法,可以用来检测浏览器和服务器之间是否存在代理服务器。
3、OPTION方法。用来获取服务器究竟支持哪些方法。所支持的方法会放在response的Allow头中。
4、PUT方法。该方法用来向服务器上传数据,所上传的数据包含在request的request body中。如果一个服务器支持该方法的话,那么这台服务器死定了。
posted on 2012-05-04 09:31 len_sround 阅读(237) 评论(0) 收藏 举报
浙公网安备 33010602011771号