跨站点请求伪造
- 危害:可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务
- 可能原因:应用程序使用的认证方法不充分
- 技术分析:即使是格式正确、有效且一致的请求也可能已在用户不知情的情况下发送。因此,Web 应用程序应检查所有请求以发现其不合法的迹象。此测试的结果指示所扫描的应用程序没有执行此操作。此脆弱性的严重性取决于受影响应用程序的功能。例如,对搜索页面的 CSRF 攻击的严重性低于对转账或概要文件更新页面的 CSRF 攻击。如果某个 Web 服务器设计为接收客户机的请求时无任何机制来验证该请求是否确实是客户机发送的,那么攻击者就有可能诱导客户机向该 Web 服务器误发请求,而该请求将视为真实请求。这可通过 URL、图像装入、XMLHttpRequest 等来完成,并可导致数据暴露或意外的代码执行。如果用户当前已登录到受害者站点,请求将自动使用用户的凭证(包括会话 cookie、IP 地址和其他浏览器认证方法)。通过使用此方法,攻击者可伪造受害者的身份,并以其身份提交操作
- 修订建议:
有多种减轻威胁的技巧:
[1] 策略:库或框架
使用不允许此弱点出现的经过审核的库或框架,或提供更容易避免此弱点的构造。
例如,使用能防御 CSRF 的软件包,例如 OWASP CSRFGuard -
http://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet
另一个示例为“ESAPI 会话管理”控件,其中包括针对 CSRF 的组件 -
http://www.owasp.org/index.php/ESAPI
[2] 确保应用程序中没有跨站点脚本编制问题 (CWE-79),因为通过使用攻击者控制的脚本可绕过大部分 CSRF 防御。
[3] 为每个表单生成唯一的现时标志,将现时标志放到表单中,并在接收表单时验证现时标志。请确保现时标志是不可预测的 (CWE-330)
-
http://www.cgisecurity.com/articles/csrf-faq.shtml
请注意,通过使用 XSS (CWE-79) 可绕过这一点。
[4] 识别特别危险的操作。在用户执行危险操作时,发送单独的确认请求以确保是用户自己希望执行该操作。请注意,通过使用 XSS
(CWE-79) 可绕过这一点。
[5] 使用“两次提交的 cookie”方法,如 Felten 和 Zeller 所述:
在用户访问站点时,该站点应生成伪随机值,并将其设置为用户机器上的 cookie。站点应要求每次表单提交都包括该值作为表单和 cookie
值。向站点发送 POST 请求时,只有表单和 cookie 值相同时才应将该请求视为有效。
由于同源策略,攻击者无法读取或修改 cookie
中存储的值。要以用户的身份成功提交表单,攻击者必须正确猜出伪随机值。如果伪随机值的保密性很强,这将是极端困难的。此技巧需要 JavaScript,因此对于禁用了
JavaScript 的浏览器可能无效 -
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.147.1445
请注意,使用 XSS (CWE-79) 有可能绕过这一点,或者在使用支持攻击者从 HTTP 请求中读取原始头的 Web
技术时也有可能绕过这一点。
[6] 请勿对触发状态更改的任何请求使用 GET 方法。
[7] 检查 HTTP Referer 头以查看请求是否源自预期的页面。这可能会破坏合法功能,因为用户或代理可能已出于隐私原因而禁止发送
Referer。请注意,通过使用 XSS (CWE-79) 可绕过这一点。
攻击者可能使用 XSS 来生成欺骗性的 Referer,或从允许使用其 Referer
的页面生成恶意请求。