Web功能简介

Web功能

  除了在客户端与服务器之间发送消息时使用的核心通信协议外,Web应用程序还使用许多不同的技术来实现其功能。任何具有一定功能的应用程序都会在其服务器与客户端组件中采用若干种技术。在向Web应用程序发动猛烈攻击前,渗透测试员必须对应用程序如何实现其功能、所使用技术的运作方式及其可能存在的弱点有一个基本的了解。

 

1.服务器端功能

 

  早期的万维网仅包含静态内容,Web站点由各种静态资源组成,如HTML页面与图片,当用户提交请求时,只需将它们加载到Web服务器,再传送给用户即可。每次用户请求某个特殊的资源时,服务器都会返回相同的内容。

  如今的Web应用程序仍然使用相当数量的静态资源。但它们主要向用户提供动态生成的内容。当用户请求一个动态资源时.服务器会动态建立响应,每个用户都会收到满足其特定需求的内容。

  动态内容由在服务器上执行的脚本或其他代码生成。在形式上,这些脚本类似于计算机程序:它们收到各种输人,并处理输人,然后向用户返回输出结果。

  当用户的浏览器提出访问动态资源的请求时,它并不仅仅是要求访问该资派的副本。通常它还会随请求提交各种参数,正是这些参数保证了服务器端应用程序能够生成适合各种用户需求的内容。HTTP请求使用3种主要方式向应用程序传送参数:

  • 通过URL查询字符串;
  • 通过REST风格的URL的文件路径;
  • 通过HTTPcookie ;
  • 通过在请求主体中使用POST方法。

  除了这些主要的输入源以外,理论上,服务器端应用程序还可以使用HTTP请求的任何一个部分作为输人。例如,应用程序可能通过User-Agent消息头生成根据所使用的浏览器类型而优化的内容。

  像常见的计算机软件一样,Web应用程序也在服务器端使用大量技术实现其功能,这些技术包括:

  • 脚本语言,如PHP, VBScript和Perl ;
  • Web应用程序平台.如ASP.NET和Java;
  • Web服务器.如Apache, IIS和Netscape Enterprise;
  • 数据库.如MSSQL, Oracle和MySQL;
  • 其他后端组件,如文件系统、基于SOAP的Web服务和目录服务;

1.1 Java平台

  近几年来,Java平台企业版(原J2EE )事实上已经成为大型企业所使用的标准应用程序。该平台由Sun公司开发(现在则属于Oracle公司)。它应用多层与负载平衡架构,非常适于模块化开发与代码重复利用。由于其历史悠久、应用广泛,因此开发者在开发过程中可以利用许多高质最的开发工具、应用程序服务器与框架。Java平台可在几种基础型操作系统上运行,包括Windows、Linux与Solaris,

  描述基于Java的Web应用程序时,往往会使用许多易于混淆的术语,读者应该对它们有所查觉。

  • Enterprise Java Bean(EJB)是一个相对重量级的软件组件,它将一个特殊业务功能的逻辑组合到应用程序中。EJB旨在处理应用程序开发者必须解决的各种技术挑战,如交易完整性。
  • 简单传统Java对象(Plain Old Java Object, POJO)是一个普通的Java对象,以区别如EJB之类的特殊对象。POJO常用于表示那些用户定义的、比INK更加简单且更加轻量级的对象以及用在其他框架中的对象。
  • Java Servlet-M应用程序服务器中的一个对象,它接收客户端的HTTP请求并返回HTTP响应。Servlet可使用大量接口来促进应用程序开发。

  由于PHP完全免费,简单易用,因此许多编写Web应用程序的初学者往往使用它作为首选语言。但是,由于历史原因.PHP框架的设计方法与默认配置导致程序员很容易不经意间在代码中引人安全漏洞.因此使用PHP编写的应用程序中可能包含大量安全漏洞。除此之外,PHP平台本身也存在若干缺陷,在平台上运行应用程序就可对其加以利用。

1.2 Ruby On Rails

  Rails 1.0于2005年发布,主要侧重于模型-视图-控制器体系架构。Rail的主要优势在于,使用它能够以极快的速度创建成熟的数据驱动应用程序。如果开发者遵循Rails编码风格和命名约定,则可以使用Rails自动生成数据库内容的模型、修改该模型的控制器操作以及供应用程序用户使用的默认视图。与其他功能强大的新技术一样,人们已在Ruby On Rails中发现了一些漏洞。包括能够避开“安全模式”,这与在PHP中发现的漏洞类似。

  有关最近发现的漏洞的详细信息,请参阅www.ruby-lang.org/en/security/

1.3 SQL

  结构化查询语言(SQL)用于访问Oracle, MS-SQL服务器和MySQL等关系数据库中的数据。目前,绝大多数的Web应用程序都将基于SQL的数据库作为它们的后端数据仓库,而且,几乎所有应用程序的功能都需要以某种方式与这些数据仓库进行交互。

  关系数据库将数据存储在表中,每个表又由许多行和列构成。每一列代表一个数据字段,如“名称”或“电子邮件地址”.每一行则代表为这些字段中的一些或全部字段分配值的项。

  SQL使用查询来执行常用的任务,如读取、添加、更新和删除数据。例如,要检索用户的具有指定名称的电子邮件地址,应用程序可以执行以下查询:

 select email from users where name=’daf’

  要实现它们所需的功能,Web应用程序可能会将用户提交的输人组合到由后端数据库执行的SQL查询中。如果以危险的方式进行组合,攻击者就可以提交恶惫输人来干扰数据库的行为,从而读取和写人敏感数据。

1.4 XML

  可扩展标记语言(XML)是一种机器可读格式的数据编码规范。与其他标记语言一样.XML格式将文档划分为内容(数据)和标记(给数据作注解))。

  标记主要用标签表示,它们包括起始标签、结束标签和空元素标签:

  <tagname>
  </tagname>
  <tagname />

  起始和结束标签成对出现,其中可以包括文档内容或子元素:

  <pet>ginger</pet>
  <pets><dog>spot</dog><cat>paws</cat></pets>

  标签可以包含以名l值对出现的属性:  

<data version="2.1"><pets>...</pets></data>

  XML之所以可扩展,是因为它可以使用任意数放的标签和属性名。XML文档通常包含文档类型定义(DTD ), DTD定义文档中使用的标签、属性及其组合方式。

  服务器端和客户端Web应用程序广泛采用XML及由XML派生的技术。

1.5 Web服务

  虽然主要介绍Web应用程序攻击.但介绍的许多漏洞同样适用于Web服务。实际上,许多应用程序本质上就是一组后端Web服务的GUI前端。Web服务使用简单对象访问协议(SOAP)来交换数据。通常,SOAP使用HTTP协议来传送消息,并使用XML格式表示数据。典型的SOAP请求如下所示:

POST /doTransfer.asp HTTP/1.0

Host: mdsec-mgr.int.mdsec.net

Content-Type: application/soap+xml;  charset=utf-8

Content-Length: 891

<?xml version=一1.0'?>

<soap:Envelope xmlns:soap=”http://www.w3.org/2001/12/soap-envelope”>

<soap:Body>

        pre:Add :xmlns:pre.http://target/list.soap:encodingStyle=

"http://www.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消息中,就可能产生与SQL注人类似的漏洞。

  如果Web应用程序还直接公开Web服务,那么.我们还需要检查这些Web服务。即使前端应用程序是基于Web服务编写的,但它们在箱人处理以及服务本身所披露的功能方面仍存在区别。正常悄况下,服务器会以Web服务描述语言(WSDL)格式公布可用的服务和参数。攻击者可以使用soapUl之类的工具、基于已公布的WSDL文件创建示例请求,以调用身份验证Web服务.获得身份验证令牌.并随后提出任何Web服务请求。

2. 客户端功能

  服务器端应用程序要接收用户输人与操作,并向用户返回其结果,它必须提供一个客户端用户界面。由于所有Web应用程序都通过Web浏览器进行访问.因此这些界面共享一个技术核心。然而,建立这些界面的方法各不相同。而且,近些年来,应用程序利用客户端技术的方式也一直在发生急剧变化。

2.1 HTML

  HTML是建立Web界面所需的核心技术。这是一种用于描述浏览器所显示的文档结构的墓于标签的语言。最初,HTML只能对文本文档进行简单的格式化处理。如今,它已经发展成为一种应用丰富、功能强大的语言.可用于创建非常复杂、功能强大的用户界面。

XHTML是HTML的进化版本,它基于 XML,并采用比旧版HTML更严格的规范。之所以推出XHTML,部分是因为需要转而采用一种更加严格的HTMU际记标准,以避免由于浏览器必须接受不太严格的HTML格式而导致的各种攻击和安全问题。

2.2 超链接

  客户端与服务器之间的大量通信都由用户单击超链接驱动。Web应用程序中的超链接通常包含预先设定的请求参数.这些数据项不需由用户输人,而是由服务器将其插人用户单击的超链接的目标URL中,以这种方式提交。例如,Web应用程序中可能会显示一系列新闻报道链接,其形式如下:

<a href="?redir=/updates/update29.htm1">What’s happening?</a>

当用户单击这个链接时,浏览器会提出以下请求:

GET /news/8/?redir=/updates/update29.htm1 HTTP/1.1

    Host: mdsec.net

服务器收到查询字符串中的参数(newsid ).并使用它的值决定向用户返回什么内容。

2.3 表单

  虽然基于超链接的导航方法负责客户端与服务器之间的绝大多数通信,但许多Web应用程序还是需要采用更灵活的形式收集愉人,并接收用户输人。HTML表单是一种常见的机制,允许用户通过浏览器提交任意输人。以下是一个典型的HTTP表单:

<form action="/secure/login.php?app=quotations' method="post">
      username:  <input type-'text' name="username"><br>
      password:  <input type='password' name="password">
<input type="hidden" name='redir" value="/secure/home.php">
<input type='submit' name='submit' value-log in,>
</form>

 

当用户在表单中输人值并单击“提交”按钮时,浏览器将提出以下请求:

POST /secure/login.php?app=quotations HTTP/1.1
      Host:wahh-app. com
      Content-Type:  application/x-www-form-urlencoded
      Content-Length: 39
      Cookie:  SESS=GTnrpx2ss2tSWSnhXJGyGOLJ47MXRSjcFM6Bd
username=daf&password=foo&redir=/secure/home.php&submit=login

在这个请求中,有几个要点说明了请求如何使用各种因素控制服务器端处理过程:

  • 因为HTML表单标签中包含一个指定POST方法的属性.浏览器就使用这个方法提交表单.并将表单中的数据存人请求消息主体中。
  • 除用户输人的两个数据外,表单中还包含一个隐藏参数( redir)与一个提交参数(submit)这两个参数都在请求中提交,服务器端应用程序可使用它们控制其逻辑。
  • 与前面显示的超链接示例一样,负责表单提交的目标URL也包含一个预先设定的参数( app、该参数可用于控制服务器端的处理过程。)
  • 请求中包含一个cookie参数(SESS ),服务器在早先的响应中将其发布给浏览器。该参数可用于控制服务器端处理过程。

  前面的请求中包含一个消息头,它规定消息主体中的内容类型为x-www-form-urlencoded,这表示和URL查询字符串中的一样,消息主体中的参数也以名/值对表示。multipart/form-data是提交表单数据时可能遇到的另一种类型的内容。应用程序可在表单标签的enctype属性中要求浏览器使用多部分编码。使用这种编码形式,请求中的Content-Type消息头还会指定一个随机字符串.用它来分隔请求主体中的参数。例如,如果表单指定多部分编码,其生成的请求如下所示:

POST /secure/login.php?app=quotations HTTP/1.1
Host: wahh-app.com
Content-Type: multipart/form-data; boundary ------------- 7d71385d0ala
Content-Length: 369
Cookie:  SESS=GTnrpx2ss2tSWSnhXJGyGOLJ47MXRsjCFM6Hd
---------d7l385d0ala
Content一Disposition: form-data; name="username"
daf
7d71385d0a1a
Content-Disposition:  form-data; name='password'
foo
--------------d71385d0ala
Content-Disposition: form-data; name="redir"
/secure/home.php
--------------d71385d0ala
Content-Disposition: form-data: name=”submit'
log in
---------------7d71385d0a1a—

2.4 CSS

  层叠样式表(CSS)是一种描述以标记语言编写的文档的表示形式的语言。在Web应用程序中.CSS用于指定HTML内容在屏幕上(以及打印页面等其他媒介中)的呈现方式。

  现代的Web标准力求将文档的内容与其表示形式尽可能地区分开来。这种区分具有许多好处,包括简化和缩小HTML页面.更易于更新网页的格式以及提高可访问性等。

  CSS以各种格式化规则为革础,这些规则可以通过不同的详细程度进行定义。如果多个规则与一个文档元素相匹配,在这些规则中定义的不同属性将进行“层叠”,从而将适当的样式属性组合应用于该元素。

  CSS语法使用选择器来定义一类标记元素(应将一组指定的属性应用于这些元素)。例如下面的CSS规则定义使用<<h2>标签标记的标题的前景颜色:

 h2{color:  red;}

在Web应用程序安全的早期阶段.CSS在很大程度上被人们所忽略,人们认为它们不可能造成安全威胁。今天,CSS本身正不断成为安全漏洞的来源,并且被攻击者作为传送针对其他类型的漏洞的人侵程序的有效手段

2.5 JavaScript

超链接与表单可用于建立能够轻易接收大多数Web应用程序所需愉人的丰富用户界面。然而.许多应用程序使用一种更加分布式的模型,不仅使用客户端提交用户数据与操作,还通过它执行实际的数据处理,这样做主要出于两个原因:

  • 改善应用程序的性能.因为这样可在客户端组件上彻底执行某些任务,不需要在服务器间来回发送和接收请求与响应。
  • 提高可用性,因为这样可根据用户操作动态更新用户界面.而不需要加载服务器传送的全新HTML页面。

JavaScript是一种相对简单但功能强大的编程语言,使用它可方便地以各种仅使用HTML无法实现的方式对Web界面进行扩展,JavaScript常用于执行以下任务:

  • 确认用户输人的数据.然后将其提交给服务器避免因数据包含错误而提交不必要的请求。
  • 根据用户操作动态修改用户界面,例如,执行下拉菜单和其他类似于非Web界面的控制。
  • 查询并更新浏览器内的文档对象模型( Document Object Model. DOM ),控制浏览器行为(稍后就会介绍浏览器DOM)

2.6 VBScript

VBScript可用于替代只有Internet Explorer浏览器才支持的JavaScript, VBScript以Visual Basic为基础,并可以与浏览器DOM进行交互。但通常而言,VBScript环如JavaScript强大和成熟。

由于VBScript只能在特定浏览器中使用.今天的Web应用程序已经很少使用VBScript。从安全角度看,我们之所以对它感兴趣,是因为在使用JavaScript无法传送人侵程序时,攻击者可以通过它来传送针对跨站点脚本之类漏洞的人侵程序(请参阅第12章))。

2.7 文档对象模型

文档对象模型(DOM)是可以通过其API查询和操纵的HTML文档的抽象表示形式。

  DOM允许客户端脚本按id访问各个HTML元家并以编程方式访问这些元家的结构。DOM还可用于读取和更新当前URL和cookie等数据。另外.DOM还包括一个事件模型,以便于代码钩住各种事件如表单提交、通过链接导航及键击。

  浏览器DOM操纵是墓于Ajax的应用程序采用的关键技术。

2.8 Ajax

  Ajax是一组编程技术,用于在客户端创建旨在模拟传统桌面应用程序的流畅交互和动态行为的用户界面。

  Ajax是“异步JavaScript和XML”的缩写.尽管今天的Web Ajax请求既不需要是异步请求.也不使用XML,

  最早的Web应用程序基于完整的页面。每个用户操作,如单击链接或提交表单,都会启动窗口级别的导航事件,导致服务器加载新页面。这种运行方式会导致不连续的用户体验,在应用程序收到来自服务器的庞大响应并重新显示整个页面时,会出现长时间的延迟。

  使用Ajax,一些用户操作将由客户端脚本代码进行处理,并且不需要重新加载整个页面。相反,脚本会“在后台”执行请求,并且通常会收到较小的响应,用于动态更新一部分用户界面。例如,在基于Ajax的购物应用程序中,如果用户单击“添加到购物车”按钮,应用程序将启动一个后台请求,在服务器端更新用户的购物车记录,随后.一个轻量级响应会更新用户屏幕上显示的购物车中商品的数址。浏览器中的整个页面几乎保持不变.这样就为用户带来更快速、更满愈的体验。

  Ajax使用的核心技术为XMLHttpRequest,经过一定程度的标准整合之后,这种技术现在已转化为一个本也JavaScript对象,客户端脚本可以通过该对象提出后台请求,而无须窗口级别的导航事件。尽管其名称仅包含请求.但XMLHttpRequest允许在请求中发送以及在响应中接收任意数目的内容。虽然许多Ajax应用程序确实使用XML对消息数据进行格式化,但越来越多的Ajax倾向于使用其他表示方法来交换数据

  值得注意的是.虽然大多数Ajax应用程序确实与服务器进行异步通信,但这并不是必需的。在某些情况下,如执行特殊操作时.可能需要阻止用户与应用程序进行交互。这时,由于不需要重新加载整个页面.Ajax将提供更加无缝的体验。

  以前,使用Ajax已在Web应用程序中引人了一些新的漏洞。从更广义的角度看,使用Ajax会在服务器端和客户端引人更多潜在的攻击目标,因而增加了典型应用程序的受攻击面。在设计针对其他漏洞的更加高效的人侵程序时,攻击者也可以利用Ajax技术。

2.9 JSON

  JavaScript对象表示法(JSON)是一种可用于对任意数据进行序列化的简单数据交换格式。JSON可直接由JavaScript解释器处理。Ajax应用程序经常使用JSON,以替换最初用于数据传翰的XML格式。通常,如果用户执行某个操作,客户端JavaScript将使用XMLHttpRequest将该操作传送到服务器。服务器则返回一个包含JSON格式的数据的轻量级响应。然后.客户端脚本将处理这些数据.并对用户界面进行相应地更新。

  例如.基于Ajax的Web邮件应用程序可能提供显示所选联系人的详细资料的功能。如果用户单击某位联系人.浏览器将使用XMLHttpRequest检索所选联系人的详细资料,并使用JSON返回这些资料:

  “name“:”Mike Kemp”,

  “id":"8041148671“

  “email*:’fkwitt@layerone.com“

  客户端脚本将使用JavaScript解释器来处理JSON响应并撰于其内容更新用户界面的相关部分。此外,当前的应用程序还将JSON用于封装传统上位于请求参数中的数据。例如,如果用户更新联系人的详细资料.则可以使用以下请求将新信息传送至服务器:

  POST /contacts HTTP/1.0

  Content-Type:    application/x-www-form-urlencoded

  Content-Length:  89

  Contact=(“name”:”Mike Kemp”。'id':"8041148671","email":"pikey@

  clappymonkey.com"}

  &submit=update

2.10 同源策略

  同源策略是浏览器实施的一种关键机制,主要用于防止不同来源的内容相互干扰。基本上.从一个网站收到的内容可以读取并修改从该站点收到的其他内容.但不得访问从其他站点收到的内容。

  如果不使用同源策略.那么,当不知情的用户浏览到某个恶意网站时,在该网站上运行的脚本代码将能够访问这名用户同时访问的任何其他网站的数据和功能。这样.该恶意站点就可以从用户的网上银行进行转账、阅读用户的Web邮件,或在用户网上购物时拦截他的信用卡信息。为此,浏览器实施限制,只允许相同来源的内容进行交互。

  实际上,将这一概念应用于各种Web功能和技术会导致各种复杂情况和风险。关于同源策略.需要了解的一些主要特点如下。

  • 位于一个域中的页面可以向另一个域提出任意数量的请求(例如.通过提交表单或加载图像)。但该页面本身无法处理上述请求返回的数据。
  • 位于一个域中的页面可以加载来自其他域的脚本并在自己的域中执行这个脚本。这是因为脚本被假定为包含代码.而非数据,因此跨域访问并不会泄露任何敏感信息。
  • 位于一个域中的页面无法读取或修改属于另一个域的cookie或其他DOM数据。

    这些特点可能导致各种跨域攻击,如诱使用户执行操作和捕获数据。此外,由于浏览器扩展技术以各种方式实施同源限制,这一问题变得更加复杂。

2.11 HTML5

  HTML5是对HTML标准的重大更新。当前,HTML5仍处在开发阶段,仅在浏览器中进行了小规模实施。从安全角度看.我们对HTML5感兴趣主要出于以下原因:

  • 它引人了各种可用于传送跨站点脚本及实施其他攻击的新标签、属性和API。
  • 它对XMLHttpRequest这一核心Ajax技术进行了修改,在某些情况下可以实现双向跨域交互。这可能导致新的跨域攻击。
  • 它引人了新的客户端数据存储机制,这可能导致用户隐私问题以及新型攻击,如客户端SQL注人。

2.12 ”Web 2.0"

  近些年来,Web 2.0这个专业术语已经成为一个流行词汇,用于Web应用程序领域内的各种相关趋势(尽管并不准确)的描述,这些趋势包括:

  • 大量使用Ajax执行各种异步后台请求;
  • 使用各种技术提高跨域集成;
  • 在客户端使用各种新技术,包括XML. JSON和Flex ;
  • 采用更先进的技术来支持用户生成的内容、信息共享和交互。

  和技术领域的所有新技术一样,这些趋势也造成了各种安全漏洞。但是,总体而言,这些漏洞并未形成新的Web应用程序安全问题Web 2.0相关的漏洞在很大程度上与这种趋势出现之前的漏洞相同,或派生自之前的漏洞。总的来说,"Web 2.0安全”是一个错误的概念,它对于我们考虑重要的问题并无帮助。

2.13 浏览器扩展技术

  除JavaScript功能外,一些Web应用程序还通过采用浏览器扩展技术.使用定制代码从各方面扩展浏览器的内置功能。这些组件可配置为字节码.由适当的浏览器插件执行.或需要在客户计算机上安装本地可执行程序。在攻击Web应用程序时,可能遇到的厚客户端技术包括:

  • Java applet;
  • ActiveX控件;
  • Flash对象;
  • Silverlight对象。

3.2.3 状态与会话

  在一些应用程序中,状态信息保存在客户端组件而非服务器中。服务器在响应中将当前的数据传送给客户端,客户端再在请求中将其返回给服务器。当然.由于通过客户端组件传送的任何数据都可被用户修改,因此,应用程序需要采取措施阻止攻击者更改这些状态信息,破坏应用程序的逻辑。ASP.NET平台利用隐藏表单字段ViewState保存与用户的Web界面有关的状态信息,从而减轻服务器的工作负担。默认情况下.ViewState的内容中还包括一个密钥散列,以防止受到破坏。

  因为HTTP协议本身并没有状态.为使用正确的状态数据处理每个请求,大多数应用程序需要采用某种方法在各种请求中重新确认每一名用户的身份。通常,应用程序会向每名用户发布一个令牌.对用户会话进行唯一标识.从而达到这一目的。这些令牌可使用任何请求参数传输.但许多应用程序往往使用HTTP cookie来完成这项任务。

posted @ 2021-12-29 00:17  咸鱼不翻身~  阅读(657)  评论(0编辑  收藏  举报