http://mdsec.net/search/128/
除使用file:协议来指定本地文件系统上的资源外,攻击者还可以使用http:等协议让服务器通过网络提取资源。这些URL可以指定任意主机、IP地址和端口。攻击者可以利用它们与后端系统上无法通过因特网直接访问的网络服务进行交互。例如,以下攻击尝试连接到在专用IP地址192.168.1.1的端口25上运行的邮件服务器:
通过这种技巧可以实施各种攻击,如下所示。
攻击者可以将应用程序作为代理服务器使用,从应用程序能够访问的任何Web服务器上检索敏感内容,包括那些在组织内部的专用非路由地址空间运行的内容。
攻击者可以利用后端Web应用程序中的漏洞,只要这些漏洞可以通过URL加以利用。
攻击者可以通过攻击大量IP地址和端口号,对后端系统上的开放端口进行测试。在某些情况下,可以使用时间性差异来推断所请求的端口的状态。其他时候,应用程序可能会在响应中返回某些服务的服务标题(service banner)。
最后,如果应用程序检索外部实体,但并不在响应中返回该实体,则攻击者仍然可以通过无期限地读取某个文件流,从而实施拒绝服务攻击。
SOAP(Simple Object Access Protocol,简单对象访问协议)是一种使用XML格式封装数据、基于消息的通信技术。各种在不同操作系统和架构上运行的系统也使用它来共享信息和传递消息。它主要用在Web服务中;通过浏览器访问的Web应用程序常常使用SOAP在后端应用程序组件之间进行通信。
由不同计算机执行单项任务以提高性能的大型企业应用程序经常使用SOAP。采用Web应用 程序作为现有应用程序前端的情况也经常可以见到SOAP的身影。这时,应用程序通常使用SOAP在不同的组件之间通信,以确保模块性和互用性。
由于XML是一种解释型语言,因此,和前面描述的其他示例一样,SOAP也易于受到代码注入攻击。XML元素通过元字符<、>和/以语法形式表示。如果用户提交的数据中包含这些字符,并被直接插入SOAP消息中,攻击者就能够破坏消息的结构,进而破坏应用程序的逻辑或造成其他不利影响。
以一个银行应用程序为例,一名用户正使用下面的HTTP请求进行转账:
在处理这个请求的过程中,应用程序在两个后端组件之间传送下面的SOAP消息:
注意消息中的XML元素如何与HTTP请求中的参数对应起来,以及应用程序如何添加ClearedFunds元素。这时,应用程序逻辑确定账户中没有足够的资金可进行转账,并将这个元素(ClearedFunds)的值设为False,因此收到SOAP消息的组件将拒绝转账。
在这种情况下,攻击者可以通过各种方法注入SOAP消息,从而破坏应用程序的逻辑。例如,提交下面的请求会在最初的元素之前插入另外一个ClearedFunds元素(同时保持SQL语法的有效性)。如果应用程序处理它遇到的第一个ClearedFunds元素,那么即使账户中没有资金,也可以成功进行转账。
另一方面,如果应用程序处理它遇到的后一个ClearedFunds元素,攻击者就可以在ToAccount参数中注入一个类似的攻击。
另一种类型的攻击是使用XML注释完全删除原始SOAP消息中的一个元素,并用攻击者自己 设计的元素代替被删除的元素。例如,下面的请求通过Amount参数注入一个ClearedFunds元素,为ToAccount元素建立一个起始标签,开始一段注释,并在ToAccount参数中结束注释,从而保持XML语法的有效性:
另一种攻击是尝试在一个注入的参数内完成整个SOAP消息,并将消息的剩余部分注释掉。但是,由于没有结束注释与起始注释相匹配,这种攻击会生成完全错误的XML语法,从而被许多XML解析器拒绝。这种攻击并不能在所有XML解析库中起作用,它只对定制或自主研发的XML解析器奏效。