在上一节中,我们介绍了一些应用程序如何将用户提交的数据合并到后端HTTP请求中,以 请求用户无法直接访问的服务。更常见的情况是,应用程序可能会将用户输入嵌入任何类型的后端HTTP请求,包括那些以常规名/值对传输参数的请求。由于应用程序通常会有效代理用户提交的URL或参数,因而这种行为往往易于受到攻击。针对这种功能的攻击可以分为以下类别:
服务器端HTTP重定向:
攻击者可以通过这种方法指定任意资源或URL,然后再由后端应用程序服务器请求这些资源或URL。
HTTP参数注入(HPI):
攻击者可以通过这种方法在应用程序服务器提出的后端HTTP请求中注入任意参数。如果攻击者注入后端请求中已存在的参数,就可以利用HTTP参数污染(HPP)攻击覆盖服务器指定的原始参数值。
如果应用程序接受用户可控制的输入,并将其合并到使用后端HTTP请求检索的URL中,这种行为就会导致服务器端重定向漏洞。用户提交的输入中可能包含被检索的完整URL,或者应用程序可能会对该URL进行某种处理,如添加标准的后缀。
后端HTTP请求可能指定公共因特网上的某个域,或者指定用户无法直接访问的内部服务器。所请求的内容可能对应用程序的功能非常关键,如支付网关的接口;或者较为次要,如从第三方提取的内容。这种技巧常用于将几个单独的内部和外部应用程序组件结合到一个前端应用程序中,再由该应用程序代表这些组件实施访问控制和会话管理。如果攻击者能够控制后端HTTP请求中的IP地址或主机名,他就可以使应用程序服务器连接到任意资源,有时甚至能够检索后端响应的内容。
以下面的前端请求为例,其中的loc参数用于指定客户端希望查看的CSS文件的版本:
如果没有在loc参数中为URL指定确认机制,攻击者就可以指定任何主机名来替代online.wahh-blogs.net。应用程序将检索指定的资源,导致攻击者将应用程序用作潜在的敏感后端服务的代理服务器。在下面的示例中,攻击者使应用程序连接到后端SSH服务:
应用程序的响应包含所请求的SSH服务的旗标:
攻击者可以利用服务器端HTTP重定向漏洞,将易受攻击的应用程序作为开放的HTTP代理服务器,以实施各种其他攻击。
攻击者可以将该代理服务器用于攻击互联网上的第三方系统。恶意流量针对的是运行易受攻击的应用程序的服务器上的目标。
攻击者可以将该代理服务器用于连接到组织内部网络中的任意主机,从而访问无法通过因特网直接访问的目标。
攻击者可以将该代理服务器用于反向连接在应用程序服务器本身上运行的其他服务,从而突破防火墙的限制,并利用信任关系来避开身份验证。
最后,攻击者可以通过使应用程序在响应中包含受控的内容,利用代理功能实施跨站点脚本等攻击(请参阅第12章了解详细信息)。