2、Web应用程序技术.docx
第3章Web应用程序技术Web应用程序运用各种不同的技术实现其功能。本章简要介绍渗透侧试员在攻击Wob应用程序时可能遇到的关键技术。我们将分析协议、服务器和客户端常用的技术以及用于在各种情形下呈现数据的编码方案。这些技术大都简洁易懂,驾驭其相关特性对于向Web应用程序发动有效攻击极其重要。3.1(HyperTextTransferPrOIOCol,超文本传输协议)是访问万维网运用的核心通信协议,也是今日全部Web应用程序运用的通信协议。最初,只是一个为获得基于文本的静态资源而开发的简洁协议,后来人们以各种形式扩展和利用它.使其能够支持如今常见的困难分布式应用程序。运用一种荃于消息的模型:客户端送出一条恳求消息,而后由服务器返回一条响应消息。该协议墓本上不须要连接,虽然运用有状态的TCP协议作为它的传输机制,但每次恳求与响应交换都自动完成,并且可能运用不同的TCP连接。3.1.1 恳求全部消息(恳求与响应)中都包含一个或几个单行显示的消息头(header),然后是一个强制空白行,最终是消息主体(可选)。以下是一个典型的恳求:GETauth488YourDetails.ashx?uid=129/1.1Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Referer:s:/Accept-1.anguage:zh-cn,zh;q=0.5User-Agent:Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.1;WDW64;Trident/4.0;S1.CC2NETC1.R2.0.50727;.NETC1.R3.5.30729;.NETC1.R3. 0.30729;.NET4.0C;InfoPath.3;.NET4.0E;FDM;。NETC1.R1.1.4322)Accept-Encoding:gzip,deflateHost:Connection:Keep-AliveCookie:SessionId=5870C71F3FD4968935CDB6682E545476每个恳求的第一行都由3个以空格间隔的项目组成。GET:一个说明方法的动词。最常用的方法为GET,它的主要作用是从Web服务器获得一个资派。GET恳求并没有消息主体,因此在消息头后的空白行中没有其他数据。所恳求的UR1.,该UR1.通常由所恳求的资源名称,以及一个包含客户端向该资源提交的参数的可选查询字符串组成。在该UR1.中,查询字符串以?字符标识,上面的示例中有一个名为uid、值为129的参数。运用的版本。因特网上常用的版本为1.0和1.1,多数阅读器默认运用1.l版本。这两个版本的规范之间存在一些差异;然而,当攻击Web应用程序时,渗透测试员可能遇到的唯差异是1.1版本必需运用Host恳求头。Accept:阅读器支持的MlME类型分别是text/html、application/xhtml+xmlapplication/xml和*/*,优先依次是它们从左到右的排列依次。详解:ACCePt表示阅读器支持的MIME类型;MlME的英文全称是MultipurposeInternetMailExtensions(多功能Internet邮件扩充服务),它是一种多用途网际邮件扩充协议,在1992年最早应用于电子邮件系统,但后来也应用到阅读器。text/html,application/xhtml+xml,application/xml都是MIME类型,也可以称为媒体类型和内容类型,斜杠前面的是lype(类型),斜杠后面的是SUbtyPe(子类型);type指定大的范围,subtype是type中范围更明确的类型,即大类中的小类。Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;text/html表示html文档;Application:用于传输应用程序数据或者二进制数据;application/xhtml+xml表示xhtml文档;application/xml表示xml文档。 Referer消息头用于表示发出恳求的原始UR1.(例如,因为用户单击页面上的一个链接)。请留意,在最初的规范中,这个消息头存在拼法错误,并且这个错误始终保留了下来。 Accept-1.anguage阅读器支持的语言分别是中文和简体中文,优先支持简体中文。详解:Accept-1.anguage表示阅读器所支持的语言类型;Zh-Cn表示简体中文;Zh表示中文;q是权重系数,范围0=<q<=1.q值越大,恳求越倾向于获得其“;”之前的类型表示的内容,若没有指定q值,则默认为1,若被赋值为0,则用于提示服务器哪些是阅读器不接受的内容类型。 USer-Agent消息头供应与阅读器或其他生成恳求的客户端软件有关的信息。请留意,由于历史缘由,大多数阅读器中都包含MoZilIa前缀。这是因为最初占支配地位的NetSCaPe阅读器运用了USe1.Agent字符串,而其他阅读器也希望让Web站点信任它们与这种标准兼容。与计算领域历史上的很多怪异现象一样,这种现象变得很普遍,即使当前版本的InternetExplorer也保留了这一,做法,示例的恳求即由InternetEXPlOrer提出。 HOSt消息头用于指定出现在被访问的完整UR1.中的主机名称。假如几个Web站点以相同的一台服务器为主机.就须要运用Host消息头.因为恳求第一行中的UR1.内通常并不包含主机名称。 Accept-Encoding阅读器支持的压缩编码是gzip和deflate COOkie消息头用于提交服务器向客户端发布的其他参数(请参阅本章后续内容了解更多详情)。 COnneetion表示长久的客户端与服务连接。X_FORWARDED_FOR是用来识别通过代理或负载均衡方式连接到Wcb服务器的客户端最原始的IP地址的恳求头字段。(请看图1)CTF大赛(内测版)小提示找到pas.ord,而且需要从http:/v*w.badu.co«逃入到第二关,需要把IP伪造为10.0.0.1!PasswordEnterpass进入籥二关urplntr<MK»vRePtWt5Wwx>owHolpf¾xc>oXSCoCCerTIntrUObKopeater:Se<¾unuer1.>occ¾er11JN100IC-eV->Rcc<jcsCRawYParamHc¾<aer¾tJHexPOSTpentestsetpl.phpHTTP/171Host:ctfj11oor三o三.comUser-Agent:Moz11laS.O(WindowsZT6.1;WOW6-4;rv三3-4.O)GQUkO/2。I。1Firfox3-4.0Accept:ttHtrrtapplcatfonxHtml-*-xmUapplication/xnril;c?-。9尸/-0.8Aecept-UariQ1.jaQe:NKYC.Nh:q=O.8#en-1.JS:q=O.-enjq=0.3Acuept-EZccocHcq:QNiQ,deflateRe*fc*rc*r:hittpzvwvw.bacd1.J.comX_FORWARDED_FOR:10.0.0.1UCCiCi'q;IHPV卜SSnj=ruuCicxzhjtJOpiHb9qWS6Gv7ConneetFon:keep-alveContent-Type:applcatfonx-wvv-form-urlncociclContent-UengtK:21password=111111111111响应以下是一个典型的响应:/1.1200OKDate:Tue,19Apr201109:23:32GMTServer:Microsoft-1IS6.OX-Powered-By:ASP.NETSet-Cookie:tracking=t18rk7joMx44S2Uu85nSWcX-AspCache-Control:no-cachePragma:no-cacheExpires:Thu,OlJan1970OO:OO:OOGMTContent-Type:text/html;charset=utf-8Content-1.ength:1067<IDOCTYPEhtmlPUB1.IC/W3CDTDXHTM1.1.0TransitionalEN-:/w3.org/TR/xhtmll/DTD/xhtmlltransitional,dtd,z><htmlXnIlnS=":/w3.ora1999xhtml*XheadXtitle>Yourdetails<title>每个响应的第一行由3个以空格间隔的项目组成。 运用的版本。 表示恳求结果的数字状态码。200是最常用的状态码.它表示胜利提交了恳求,正在返回所恳求的资源。 -一段文本形式的“缘由短语”,进一步说明响应状态。这个短语中可包含任何值,当前阅读器不将其用于任何目的。响应示例中的其他一些要点如下: SerVer消息头中包含一个旗标,指明所运用的Web服务器软件。有时还包括其他信息.如所安装的模块和服务器操作系统。其中包含的信息可能并不精确。 Se1.COOkie消息头向阅读器发送另个COOkie.它将在随后向服务器发送的恳求中由Cookie消息头返回。 Pragma消息头指示阅读器不要将响应保存在缓存中。Expires消息头指出响应内容已经过期.因此不应保存在缓存中。当返回动态内容时常常会发送这些指令,以确保阅读器随时获得最新内容。几乎全部的响应在消息头后的空白行下面都包含消息主体,COntent-Type消息头示这个消息主体中包含一个HTM1.文档。Content-1.ength消息头规定消息主体的字节长度。方法当渗透测试员攻击Web应用程序时,几乎确定会遇到最常用的方法:GET和POST0这些方法之间存在一些必需了解的重要差异,忽视这些差异可能会危及应用程序的平安。GET方法的作用在于获得资源。它可以用于UR1.查询字符串的形式向所恳求的资谏发送参数。这运用户可将一个包含动态资源的UR1.标注为书签,用户自己或其他用户随后可重®利用该书签来获得等价的资源(作用与标注为书签的搜寻查询相像)。UR1.显示在屏幕上.并被记录在很多地方,如阅读器的历史记录和Web服务器的访问日志中。假如单击外部链接,还可以用RCferer消息头将它们传送到其他站点。因此,请勿运用查询字符申传送任何敏感信息。POST方法的主要作用是执行操作。运用这个方法可以在UR1.查询字符申与消息主体中发送恳求参数。尽管仍旧可以将UR1.标注为书签,但书签中并不包含消息主体发送的任何参数。很多维护UR1.日志的位置及RCferer消息头也将这些参数解除在外。因为POST方法旨在执行操作,假如用户单击阅读器上的“后退”按钮,返回一个运用这种方法访问的页面,那么阅读器不会自动重新发送恳求,而是就即将发生的操作向用户发出带告.如图3-1所示。这样做可防止用户无意中多次执行同一个操作。因此.在执行某一操作时必需运用POST恳求。图3-1阅读器不会自动重新发送用户提出的P。ST恳求,因为这样做会导致多次执行某一操作除了GET和PoST方法以外.协议还支持很多其他因特别目的而建立的方法。须要了解的其他方法如下:HEADe这个方法的功能与GET方法相像,不同之处在于服务器不会在其响应中返回消息主体。服务器返回的消息头应与对应GET恳求返回的消息头相同。因此,这种方法可用于检查某一资源在向其提交GET恳求前是否存在。TRACE.这种方法主要用于诊断。服务器应在响应主体中返回其收到的恳求消息的具体内容。这种方法可用于检测客户端与服务器之间是否存在任何操纵恳求的代理服务器。OPTIONSo这种方法要求服务器报告对某一特别资源有效的方法。服务器通常返回一个包含Allow消息头的响应,并在其中列出全部有效的方法。PUTo这个方法试图运用包含在恳求主体中的内容,向服务器上传指定的资源。假如激活这个方法,渗透测试员就可以利用它来攻击应用程序。例如,通过上传随意一段脚本并在服务器上执行该脚原来攻击应用程序。还有很多其他与攻击Web应用程序没有干脆关系的方法。然而,假如激活某些危急的方法,Web服务器可能面临攻击风险。UR1.UR1.(UniformResource1.ocator,统一资源定位符)是标识WCb资源的唯一标识符.通过它即可获得其标识的资源。最常用的UR1.格式如下:protocol:/hostname:port/path/IfiIe?param=valucl这个结构中有几个部分是可选的。假如端口号与相关协议运用的默认值不同,则只包含端口号即可。用于生成前面的恳求的UR1.为:s:/除这种确定形式外,还可以相对某一特别主机或主机上的一个特别路径指定UR1.,例如:auth488YourDetails.ashx?uid=129YourDetails.ashx?uid=129Web页面常常运用这些相对形式描述Web站点或应用程序中的导航。3.1.5消息头支持很多不同的消息头,其中一些专用于特别用途。一些消息头可用在恳求与响应中,而其他一些消息头只能特地用在某个特定的消息中。下面列出渗透测试员在攻击Web应用程序时可能遇到的消息头。1 .常用消息头ConneCtiOn。这个消息头用于告知通信的另一端.在完成传输后是关闭TCP连接,还是保持连接开放以接收其他消息。Content-Encodingo这个消息头为消息主体中的内容指定编码形式(如gzip),一些应用程序运用它来压缩响应以加快传输速度。Content-1.ength0这个消息头用于规定消息主体的字节长度。(HEAD语法的响应例外.它在对应的GET恳求的响应中指出主体的长度。Content-Type.这个消息头用于规定消息主体的内容类型。例如,HTM1.文档的内容类型为text/html,Transfer-Encodingo这个消息头指定为便利其通过传输而对消息主体运用的任何编码。假如运用这个消息头.通常用它指定块编码。2 恳求消息头Accepto这个消息头用于告知服务器客户端情愿接受哪些内容,如图像类型、办公文档格式等。 Accept-Encodingo这个消息头用于告知服务器.客户端情愿接受哪些内容编码。 Authorizationo这个消息头用于为一种内置身份验证向服务器提交证书。 Cookieo这个消息头用于向服务器提交它以前发布的COOkie. Hosto这个消息头用于指定出现在所恳求的完整UR1.中的主机名称。 If-Modified-Sinceo这个消息头用于说明阅读器最终一次收到所恳求的资源的时间。假如自那以后资源没有发生改变,服务器就会发出一个带状态码304的响应,指示客户端运用资源的缓存副本。 If-None-Matcho这个消息头用于指定一个实体标签。实体标签是一个说明消息主体内容的标识符。当最终一次收到所恳求的资源时.阅读器提交服务器发布的实体标签。服务器可以运用实体标签确定阅读器是否运用资源的缓存副本。 Origino这个消息头用在跨域AjaXt求中,用于指示提出恳求的域。 Referero这个消息头用于指示提出当前恳求的原始UR1.。 User-Agento这个消息头供应与阅读器或生成恳求的其他客户端软件有关的信息。3,响应消息头 Access-Control-Allow-Origin.这个消息头用于指示可否通过跨域Ajax恳求获得资源。 Cache-Controlo这个消息头用于向阅读器传送缓存指令(如no-cache)。 ETago这个消息头用于指定一个实体标签。客户端可在将来的恳求中提交这个标识符。获得和If-None-Match消息头中相同的资源,通知服务器阅读器当前缓存中保存的是哪个版本的资源。Expireso这个消息头用于向阅读器说明消息主体内容的有效时间。在这个时间之前,阅读器可以运用这个资源的缓存副本。 1.ocationo这个消息头用于在重定向响应(那些状态码以3开头的响应)中说明重定向的目标。 Pragmao这个消息头用于向阅读器传送缓存指令(如no-cache). Servero这个消息头供应所运用的Web服务器软件的相关信息。 Set-Cookieo这个消息头用于向阅读器发布COokie.阅读器会在随后的恳求中将其返回给服务器。 WWW-Authenticate。这个消息头用在带401状态码的响应中,供应与服务器所支持的身份验证类型有关的信息。 X-Frame-Optionso这个消息头指示阅读器框架是否及如何加载当前响应。cookiecookie是大多数Web应用程序所依靠的协议的一个关键组成部分,攻击者常常通过它来利用Web应用程序中的漏洞。服务器运用cookie机制向客户端发送数据,客户端保存cookie并将其返回给服务器。与其他类型的恳求参数(存在于UR1.查询字符串或消息主体中)不同,无须应用程序或用户实行任何特别措施.随后的每一个恳求都会接着重新向服务器提交cookie:如前所述.服务器运用Set-Cookie响应消息头发布cookie:Set-Cookie:tracking=tI8rk7joMx44S2Uu85nSWc然后.用户的阅读器自动将下面的消息头添加到随后返回给同一服务器的恳求中:Cookie:tracking=tl8rk7joMx44S2Uu85nSWc如上所示.cookie一般由一个名/值对构成,但也可包含任何不含空格的字符串。可以在服务器响应中运用几个Set-Cookie消息头发布多个cookie.并可在同一个Cookie消息头中用分号分隔不同的Cookie,将它们全部返回给服务器。除cookie的实际位外,Set-Cookie消息头还可包含以下任何可选属性,用它们限制阅读器处理cookie的方式。 expireso用于设定COC)kie的有效时间。这样会使阅读器将COokie保存在永久性的存储器中,在随后的阅读器会话中重复利用.直到到期时间为止。假如没有设定这个属性,那么CoOkie仅用在当前阅读器会话中。 domaino用于指定COOkie的有效域。这个域必需和收到COokie的域相同,或者是它的父域。 patho用于指定COOkie的有效UR1.路径。 Secureo假如设置这个属性.则仅在S恳求中提交cookie. Onlyo假如设置这个属性,将无法通过客户端JaVaSCriPt干脆访问COOkie.上述每一个cookie属性都可能影响应用程序的平安.其造成的主要不利影响在于攻击者能够干脆对应用程序的其他用户发动攻击。请参阅第12章和第13章了解更多详情。状态码每条响应消息都必需在第一行中包含一个状态码,说明恳求的结果。依据代码的第一位数字,可将状态码分为以下5类。 Ixx-供应信息。 2xx一恳求被胜利提交。 3xx一客户端被重定向到其他资源。 4xx-恳求包含某种错误。 5x一服务器执行恳求时遇到错误。还有大量特别状态码,其中很多状态码仅用在特别状况下。下面列出渗透测试员在攻击WCb应用程序时最有可能遇到的状态码及其相关的缘由短语。 100Continueo当客户端提交一个包含主体的恳求时.将发送这个响应。该响应表示己收到恳求消息头.客户端应接着发送主体。恳求完成后,再由服务器返回另一个响应。 200Ok0本状态码表示己胜利提交恳求,且响应主体中包含恳求结果。 201Created.PUT恳求的响应返回这个状态码,表示恳求己胜利提交。 301MovedPermanently。本状态码将阅读器永久重定向到另外一个在1.ocation消息头中指定的UR1.。以后客户端应运用新UR1.替换原始UR1.。 302Found.本状态码将阅读器短暂重定向到另外一个在1.ocation消息头中指定的UR1.客户端应在随后的恳求中复原运用原始UR1. 304NotModified.本状态码指示阅读器运用缓存中保存的所恳求资源的副本。服务器运用If-Modified-Since与工f-None-Match消息头确定客户端是否拥有最新版本的资源。 400BadRcqucste本状态码表示客户端提交了一个无效的恳求。当以某种无效的方式修改恳求时(例如在UR1.中插人一个空格符),可能会遇到这个状态码。 401UnaUthoriZCd.服务器在许可恳求前要求进行身份验证。WWW-Authenticate消息头具体说明所支持的身份验证类型。 403Forbidden0本状态码指出,不管是否通过身份验证,禁止任何人访问被恳求的资源。 404NotFoundo本状态码表示所恳求的资源并不存在。 405MethodNotAllowedo本状态码表示指定的UR1.不支持恳求中运用的方法。例如,假如试图在不支持PUT方法的地方运用该方法,就会收到本状态码。 413RequestEntityToo1.arge.假如在本地代码中探查缓冲器滋出瀚洞并就此提交超长数据串.则本状态码表示恳求主体过长,服务器无法处理。 414RequestURIToo1.onge与前一个响应类似,本状态码表示恳求中的UR1.过长,服务器无法处理。 500TnternalServerErroro本状态码表示服务器在执行恳求时遇到错误。当提交无法预料的输人、在应用程序处理过程中造成无法处理的错误时,通常会收到本状态码。应当细致检查服务器响应的全部内容,了解与错误性质有关的详情。 503ServiceUnavailableo通常,本状态码表示尽管Web服务器运转正常.并且能够响应恳求,但服务器访问的应用程序还是无法作出响应。应当进行核实,是否因为执行了某种行为而造成这个结果。S运用一般的非加密TCP作为其传输机制.因此,处在网络适当位置的攻击者能够截取这个机制。S本质上与一样,都属于应用层协议.但S通过平安传输机制一平安套接层(SeCUreSocket1.ayer,SS1.)一日专送数据。这种机制可爱护通过网络传送的全部数据的隐密性与完整性,显著降低非人侵性拦截攻击的可能性。不管是否运用SS1.进行传输,恳求与响应都以完全相同的方式工作。代理代理服务器是一个协调客户端阅读器与目标Web服务器之间访问的服务器。当配置浏览器运用代理服务器时.它会将全部恳求提交到代理服务器,代理服务器再将恳求转送给相关Web服务器。并将响应返回给阅读器。大多数代理还运用其他服务,如缓存、验证与访问限制。值得留意的是,假如运用代理服务器,的工作机制会出现两方面的差异。 器主机名称,在非标准UR1.中,还包括端口号)插人恳求中。代理服务器将提取主机名称和端口,并运用这些信息将恳求指向正确的目标Web服务器。 当运用S时.阅读器无法与代理服务器进行SS1.握手.因为这样做会破坏平安隧道,使通信易于遭遇拦截攻击。因此.阅读器必需将代理作为一个纯悴的TCP级中继,由它传递阅读器与目标呢b阅读器之间的全部网络数据,并与阅读器进行正常的SS1.握手。阅读器运用CONNEeT方法向代理服务器提交一个HTT州清求.并指定UR1.中的目标主机名称与端口号.从而建立这种中继。假如代理允许该恳求,它会返回一个含200状态码的响应,始终开放TCP连接.从今以后作为目标Web服务器的纯梓TCP级中继。从某种程度上说,攻击Web应用程序时最有用的工具是一个处在阅读器与目标Web站点之间的专用代理服务器,运用它可以拦截并修改全部运用S的清求与响应。我们将在第4章起先分析如何运用这种工具。身份验证拥有自己的用户身份验证机制,运用不同的身份验证方窠。 Basico这是种特别简洁的身份验证机制。它在恳求消息头中随每条消息以Base64编码字符申的形式发送用户证书。 NT1.Mo这是一种质询响应式机制,它运用某个WindoWSNT1.M协议版本。 Digesto这是种质询响应式机制,它伴同用户证书起运用个随机值MD5校验和。虽然组织内部常常运用这些身份验证协议访问内联网服务,但因特网上的Web应用程序基本很少运用它们。3.2Web功能除了在客户端与服务器之间发送消息时运用的核心通信协议外,Web应用程序还运用很多不同的技术来实现其功能。任何具有确定功能的应用程序都会在其服务器与客户端组件中采纳若干种技术。在向Web应用程序发动猛烈攻击前,渗透测试员必需对应用程序如何实现其功能、所使用技术的运作方式及其可能存在的弱点有一个基本的了解。服务器端功能早期的万维网仅包含峥态内容。Web站点由各种静态资源组成,如HTM1.页面与图片;当用户提交恳求时,只需将它们加载到Web服务器,再传送给用户即可。每次用户恳求某个特别的资源时,服务器都会返回相同的内容。如今的Web应用程序仍旧运用相当数量的静态资源。但它们主要向用户供应动态生成的内容。当用户恳求一个动态资源时.服务器会动态建立响应,每个用户都会收到满意其特定需求的内容。动态内容由在服务器上执行的脚本或其他代码生成。在形式上,这些脚本类似于计算机程序:它们收到各种输人,并处理输人,然后向用户返回输出结果。当用户的阅读器提出访问动态资源的恳求时,它并不仅仅是要求访问该资派的副本。通常它还会随恳求提交各种参数。正是这些参数保证了服务器端应用程序能够生成适合各种用户需求的内容。恳求运用3种主要方式向应用程序传送参数: 通过UR1.查询字符串; 通过REST风格的UR1.的文件路径; 通过cookie; 通过在恳求主体中运用PoST方法。除了这些主要的输人源以外,理论上,服务器端应用程序还可以运用恳求的任何一个部分作为输人。例如,应用程序可能通过USerAgent消息头生成依据所运用的阅读器类型而优化的内容。像常见的计算机软件一样.Web应用程序也在服务器端运用大赞技术实现其功能。这些技术包括: 脚本语言,如PHP,VBSCriPt和Perl; Web应用程序平台.如ASP.NET和Java; Web服务器.如Apache,IIS和NetscapeEnterprise; 数据库.如MS-SQ1.,OraCIe和MySQ1.; 其他后端组件,如文件系统、基于SOAP的Web服务和书目服务。本书将具体介绍这些技术及其相关漏洞。下面将介绍一些可能遇到的最常见的Web应用程序平台和语言。1. JaVa平台近几年来,Java平台企业版(原J2EE)事实上已经成为大型企业所运用的标准应用程序。该平台由SUn公司开发(现在则属于OraCIe公司)。它应用多层与负载平衡架构,特别适于模块化开发与代码重复利用。由于其历史悠久、应用广泛,因此.开发者在开发过程中可以利用很多高质最的开发工具、应用程序服务器与框架。Java平台可在几种基础型操作系统上运行,包括Windows.1.inux与Solaris,描述基于Java的Web应用程序时,往往会运用很多易于混淆的术语.读者应当对它们有所苦觉。 EnterpriseJavaBean(EJB)是一个相对重量级的软件组件,它将一个特别业务功能的逻辑组合到应用程序中。EJB旨在处理应用程序开发者必需解决的各种技术挑战,如交易完整性。 简洁传统JaVa对象(PIainOIdJaVaObjeet,POJO)是一个一般的JaVa对象,以区分如EJB之类的特别对象。POJo常用于表示那些用户定义的、比INK更加简洁且更加轻量级的对象以及用在其他框架中的对象。 JaVaSerVlet-M应用程序服务器中的一个对象,它接收客户端的恳求并返回响应。Servlet可运用大量接口来促进应用程序开发。由于PHP完全免费,简洁易用,因此很多编写Web应用程序的初学者往往运用它作为首选语言。但是,由于历史缘由.PHP框架的设计方法与默认配置导致程序员很简洁不经意间在代码中引人平安漏洞.因此运用PHP编写的应用程序中可能包含大量平安漏洞。除此之外,PHP平台本身也存在若干缺陷,在平台上运行应用程序就可对其加以利用。请参阅第19章了解有关PHP应用程序常见漏洞的详情。2. RubyOnRailsRails1.0于2005年发布,主要侧重于模型-视图-限制器体系架构。Rail:的主要优势在于,运用它能够以极快的速度创建成熟的数据驱动应用程序。假如开发者遵循Rails编码风格和命名约定,则可以运用RaiIS自动生成数据库内容的模型、修改该模型的限制器操作以及供应用程序用户运用的默认视图。与其他功能强大的新技术一样,人们已在RUbyOnRailS中发觉了一些翻洞.包括能够避开“平安模式”,这与在PHP中发觉的漏洞类似。有关最近发觉的漏洞的具体信息,请参阅。3. SQ1.结构化查询语言(SQ1.)用于访问Oracle,MS-SQ1.服务器和MySQ1.等关系数据库中的数据。目前,绝大多数的Web应用程序都将基于SQ1.的数据库作为它们的后端数据仓库,而且,几乎全部应用程序的功能都须要以某种方式与这些数据仓库进行交互。关系数据库将数据存储在表中,每个表又由很多行和列构成。每一列代表一个数据字段,如“名称”或“电子邮件地址”.每一行则代表为这些字段中的一些或全部字段安排值的项。SQ1.运用查询来执行常用的任务,如读取、添加、更新和删除数据。例如,要检索用户的具有指定名称的电子邮件地址,应用程序可以执行以下查询:selectemailfromuserswherename=,daf'要实现它们所需的功能,Web应用程序可能会将用户提交的输人组合到由后端数据库执行的SQ1.查询中。假如以危急的方式进行组合,攻击者就可以提交恶惫输人来干扰数据库的行为,从而读取和写人敏感数据。我们将在第9章中介绍这些攻击,并具体说明SQ1.语言及其用法。4. XM1.可扩展标记语言(XU1.)是一种机器可读格式的数据编码规范。与其他标记语言一样.XM1.格式将文档划分为内容(数据)和标记(给数据作注解)。标记主要用标签表示,它们包括起始标签、结束标签和空元素标签:<tagname></tagname><tagname/>起始和结束标签成对出现,其中可以包括文档内容或子元素:<pet>ginger</pet><pets><dog>spot<dog><cat>paws<cat><pets>标签可以包含以名1值对出现的属性:<dataVerSiOn="2.1"XPets><pets><data>XM1.之所以可扩展,是因为它可以运用随意数放的标签和属性名。XM1.文档通常包含文档类型定义(DTD),DTD定义文档中运用的标签、属性及其组合方式。服务器端和客户端Web应用程序广泛采纳XU1.及由XM1.派生的技术.我们将在本章后面部分介绍这些内容。5. Web月艮务虽然本书主要介绍Web应用程序攻击.但本书介绍的很多漏洞同样适用于Web服务。事实上,很多应用程序本质上就是一组后端Web服务的GUI前端。Web服务运用简洁对象访问协议(SOAP)来交换数据。通常,SOAP运用协议来传送消息,并运用XM1.格式表示数据。典型的SOAP恳求如下所示:POSTdoTransfer.asp/1.0Content-Type:app1ication/soap+xml;charset=utf-8Content-1.ength:891<?xmlversion=-1.0,?><soap:Envelopexmlns:soap=,ww.w3.org/2001/12/soap-envelope”><soap:Body>pre:Add:xmlns:pre.:/targetlist.SoapiencodingStyle=:/w3.org/2001/12/soap-encodingl><Account><FromAccount>18281008<FromAccount><Amount>1430<Amount><ClearedFunds>False<ClearedFunds><ToAccount>08447656<ToAccount><Account></pre:Add></soap:Body></soap:Envelope>在运用阅读器访问Web应用程序时很可能会遇到SOAP,服务器端应用程序运用它与各种后端系统进行通信。假如将用户提交的数据干脆组合到后端SOAP消息中,就可能产生与SQ1.注人类似的漏洞。我们将在第10章具体介绍这些问题。假如Web应用程序还干脆公开Web服务,那么.我们还须要检查这些Web服务。即使前端应用程序是基于Web服务编写的,但它们在箱人处理以及服务本身所披露的功能方面仍存在区分。正常悄况下,服务器会以Web服务描述语言(WSD1.)格式公布可用的服务和参数。攻击者可以运用soapUl之类的工具、基于已公布的WSD1.文件创建示例恳求,以调用身份验证Web服务.获得身份验证令牌.并随后提出任何Web服务恳求。客户端功能服务器端应用程序要接收用户输入与操作,并向用户返回其结果,它必需供应一个客户端用户界面。由于全部WCb应用程序都通过WCb阅读器进行访问.因此这些界面共享一个技术核心。然而,建立这些界面的方法各不相同。而且,近些年来,应用程序利用客户端技术的方式也始终在发生急剧改变。1 .HTM1.HTM1.是建立Web界面所需的核心技术。这是一种用于描述阅读器所显示的文档结构的墓于标签的语言。最初,HTM1.只能对文本文档进行简洁的格式化处理。如今,它已经发展成为种应用丰富、功能强大的语言.可用于创建特别困难、功能强大的用户界面。XHTM1.是HTM1.的进化版本,它基于XM1.,并采纳比旧版HTM1.更严格的规范。之所以推出XHTM1.,部分是因为须要转而采纳种更加严格的HTMU际记标准,以避开由于阅读器必需接受不太严格的HTM1.格式而导致的各种攻击和平安问题。有关HTM1.及相关技术的详情,请参阅下面的几节。2 .超链接客户端与服务器之间的大量通信都由用户单击超链接驱动。Web应用程序中的超链接通常包含预先设定的恳求参数.这些数据项不需由用户输人,而是由服务器将其插人用户单击的超链接的目标UR1.中,以这种方式提交。例如,Web应用