在本节中,我们将解释XSS和CSRF之间的区别,并讨论CSRF token是否有助于防止XSS攻击。
1. XSS和CSRF有什么区别?
跨站脚本攻击(或XSS)允许攻击者在受害用户的浏览器中执行任意JavaScript。
跨站请求伪造(或CSRF)允许攻击者诱导受害用户执行他们不打算执行的操作。
XSS漏洞的后果通常比CSRF漏洞更严重:
CSRF通常只应用于用户能够执行的操作的子集。许多应用程序通常实现CSRF防御,但忽略了一两个暴露的操作。相反,一个成功的XSS利用通常可以诱导用户执行任何用户能够执行的操作,而不管该漏洞出现在什么功能中。
CSRF可以被描述为“单向”漏洞,因为攻击者可以诱导受害者发出HTTP请求,但他们不能从该请求得到响应。相反,XSS是“双向的”,因为攻击者的注入脚本可以发出任意请求,读取响应,并将数据转移到攻击者选择的外部域。
2. CSRF token能防止XSS攻击吗?
一些XSS攻击确实可以通过有效使用CSRF token来防止。考虑一个简单的XSS漏洞,可以像这样简单地利用它:
https://insecure-website.com/status?message=<script>/*+Bad+stuff+here...+*/</script>复制
现在,假设脆弱函数包含一个CSRF token:
https://insecure-website.com/status?csrf-token=CIwNZNlR4XbisJF39I8yWnWX9wX4WFoz&message=<script>/*+Bad+stuff+here...+*/</script>复制
假设服务器正确地验证了CSRF token,并在没有有效 token的情况下拒绝请求,那么 token确实可以防止利用XSS漏洞。这里的线索就在名称中:“跨站脚本”,至少反射型,涉及跨站请求。通过阻止攻击者伪造跨站点请求,应用程序可以防止对XSS漏洞的轻微利用。
这里有一些重要的注意事项:
如果反射型XSS漏洞存在于站点上不受CSRF token保护的功能中的任何地方,那么可以以正常方式利用该XSS。
如果站点上存在可利用的XSS漏洞,那么可以利用该漏洞使受害用户执行操作,即使这些操作本身受到CSRF token的保护。在这种情况下,攻击者的脚本可以请求相关页面以获得有效的CSRF token,然后使用该 token执行受保护的操作。
CSRF token不能保护存储的XSS漏洞。如果受CSRF token保护的页面也是存储的XSS漏洞的输出点,那么可以以正常的方式利用该XSS漏洞,当用户访问该页面时,XSS payload将执行。