渗透测试步骤

(1)根据在应用程序解析过程中得到的结果(请参阅第4章了解相关内容),检查应用程序的关键功能。

(2)找到一项可用于代表不知情的用户执行某种敏感操作的应用程序功能,该功能仅依赖cookie来追踪用户会话,并且使用攻击者能够提前决定的请求参数,也就是说,其中并不包含任何会话令牌或其他无法预测的数据。

(3)创建一个HTML页面,它不需要进行任何用户交互即可提出所需请求。对于GET请求,可以使用<img>标签,并通过src参数设置易受攻击的URL。对于POST请求,可以建立一个表单,其中包含实施攻击所需全部相关参数的隐藏字段,并将其目标设置为易受攻击的URL。可以使用JavaScript在页面加载时自动提交该表单。

(4)登录应用程序后,使用同一个浏览器加载专门设计的HTML页面。确认应用程序是否执行所需操作。

img004  提示  由于引入了其他攻击向量,CSRF攻击的可能性改变了许多其他类型的漏洞的影响范围。例如,如果某项管理功能接受参数中的用户标识符,然后显示与指定用户有关的信息。该功能受到严格的访问控制,但它的uid参数中包含SQL注入漏洞。由于应用程序管理员为可信用户,并且在任何情况下都能够完全控制数据库,因此,这种SQL注入漏洞被认为风险较低。但是,由于该功能并不执行任何管理操作(根据最初的设计),因此其并未采取防范CSRF的措施。从攻击者的角度看,该功能与专门供管理员执行任意SQL查询的功能一样重要。如果可以注入一个执行某种敏感操作,或通过带外通道检索数据的查询,那么即使是非管理用户也可以通过CSRF实施这种攻击。

img007 验证与CSRF

由于实施CSRF攻击需要在受害用户的会话中执行某种特权操作,因此,在实施攻击时,用户需要登录到应用程序。

一个存在大量危险的CSRF漏洞的位置,是家庭DSL路由器使用的Web界面。这些设备大多包含敏感功能,如打开面向互联网的防火墙上的所有端口。由于这些功能通常并未采取防范CSRF的措施,并且多数用户也没有修改设备的默认内部IP地址,因此,它们易于受到由恶意外部站点传送的CSRF攻击。但是,相关设备通常需要进行验证才能执行敏感操作,而且许多用户并未登录他们的设备。

如果设备的Web界面使用基于表单的验证,则可以通过首先使用户登录设备,然后执行经过验证的操作,从而实施两步攻击。由于大多数用户并未修改这类设备的默认证书(可能认为该Web界面只能通过内部家庭网络访问),因此,攻击者的网页可以首先提出包含默认证书的登录请求。然后,设备会在用户的浏览器中设置一个会话令牌,随后的任何请求,包括由攻击者生成的请求,将自动传送该令牌。

在其他情况下,攻击者可能需要受害用户以攻击者自身的用户账户登录应用程序才能实施特定的攻击。以一个允许用户上传并存储文件的应用程序为例。这些文件随后可以进行下载,但只能由上传它们的用户下载。假设由于没有对文件内容进行过滤,该功能可用于实施保存型XSS攻击(请参阅第12章了解相关内容)。该漏洞似乎并不会造成任何伤害,因为攻击者只能用它来攻击自己。但实际上,通过使用CSRF技巧,攻击者可以利用保存型XSS漏洞来攻破其他用户。如上文所述,攻击者的网页可以提出一个CSRF请求,强制受害用户使用攻击者的证书登录。然后,攻击者的网页可以提出另一个CSRF请求,以下载某个恶意文件。用户的浏览器处理该文件时,攻击者的XSS有效载荷将会执行,用户在易受攻击的应用程序中的会话将被攻破。虽然受害者当前是使用攻击者的账户登录的,但是,攻击并未就此结束。如第12章所述,XSS有效载荷可以在用户的浏览器中持续存在,并执行任意操作,因而可以让用户注销其在易受攻击的应用程序中的会话,并诱使其使用自己的证书登录。

img007 防止CSRF漏洞

由于浏览器自动在随后的每个请求中将cookie返回给发布cookie的Web服务器,CSRF漏洞因此产生。如果某个Web应用程序主要依赖HTTP cookie传送会话令牌,那么它本身就易于受到这种攻击。

防范CSRF攻击的标准方法,是将HTTP cookie与其他追踪令牌的方法相结合。这类方法通常采用其他通过HTTP隐藏表单字段传输的令牌。在每次提交请求时,应用程序除确认会话cookie外,还核实表单是否传送了正确的令牌。如果攻击者无法确定该令牌的值,就无法构建跨域请求,也就无法执行所需的操作。

img001  注解  本章后面部分将介绍,即使使用CSRF令牌受到可靠保护的功能也可能易于受到用户界面(UI)伪装攻击。

以这种方式使用反CSRF令牌时,必须为这些令牌提供与正常的会话令牌相同的保护。如果攻击者能够预测发布给其他用户的令牌值,他就能够确定提出CSRF请求所需的所有参数,因而仍然能够实施攻击。此外,如果反CSRF令牌未与所属用户的会话相关联,攻击者就可以在自己的会话中获得一个有效令牌,并将此令牌用在针对其他用户的会话的CSRF攻击中。