在本节中,将解释什么是跨站脚本攻击,描述不同种类的跨站脚本漏洞,并说明如何查找和防止跨站脚本攻击。
什么是跨站脚本(XSS)?
跨站脚本(也称XSS)是一种Web安全漏洞,允许攻击者破坏用户与易受攻击应用程序的交互。
它允许攻击者绕过旨在将不同的网站相互隔离的同源策略,将攻击者伪装成受害者用户,执行用户能够执行的任何操作,并访问用户的任意数据。
如果受害者用户在应用程序中具有特权访问权限,那么攻击者可能能够完全控制应用程序的所有功能和数据。
XSS是如何工作的?
跨站脚本的工作原理是操纵易受攻击的网站,以便将恶意JavaScript返回给用户。当恶意代码在受害者的浏览器中执行时,攻击者可以完全破坏他们与应用程序的交互。
XSS漏洞验证
我们可以通过注入导致我们自己的浏览器执行一些任意JavaScript的Payload来确认大多数类型的XSS漏洞。
长期以来,最常见的是使用alert()函数,因为它简短、无害,并且在成功调用时很难错过。事实上,我们可以通过在模拟受害者的浏览器中调用alert()来解决我们大多数XSS试验问题。
不过,如果使用Chrome的话,会有一个小问题。从92版本开始(2021年7月20日),跨域iframe可能会被禁止调用alert()。
XSS攻击的类型有哪些?
XSS攻击主要分为三种类型:
●反射型XSS,恶意脚本来自当前的HTTP请求。
●存储型XSS,其中恶意脚本来自网站的数据库。
●基于DOM的XSS,漏洞存在于客户端代码而不是服务器端代码中。
XSS可以用来做什么?
利用跨站脚本漏洞的攻击者通常能够:
●冒充或伪装成受害者用户。
●执行用户能够执行的任何操作。
●捕获用户的登录凭据。
●对网站进行虚拟污损。
●将木马注入网站。
XSS漏洞的影响
XSS攻击的实际影响通常取决于应用程序的性质、功能和数据以及受感染用户的状态,例如:
●在浏览型的应用中,所有用户都是匿名的,所有信息都是公开的,因此影响通常很小。
●在包含敏感数据(例如银行交易、电子邮件或医疗记录)的应用程序中,影响通常会很严重。
●如果受感染的用户在应用程序中具有提升的权限,那么影响通常会很严重,允许攻击者完全控制易受攻击的应用程序并破坏所有用户及其数据。
如何查找和测试XSS漏洞
使用自动化工具扫描可以快速可靠地发现绝大多数XSS漏洞。
手动测试反射和存储型XSS通常涉及向应用程序的每个入口点提交一些简单唯一的输入(例如短的字母数字字符串),识别在HTTP响应中返回所提交输入的每个位置,并单独测试每个位置以确定是否可以使用适当改造的输入来执行任意JavaScript,通过这种方式,可以确定XSS发生的上下环境并选择合适的Payload来利用它。
手动测试由URL参数引起的基于DOM型的XSS也涉及类似的过程:
在参数中放置一些简单唯一输入,使用浏览器的开发人员工具在DOM中搜索该输入,并测试每个位置以确定它是否可利用。
但是,其他类型的DOM型XSS更难检测,要在非基于URL的输入(如document.cookie)或非基于HTML的接收器(如setTimeout)中查找DOM型漏洞,除了审查JavaScript代码,没有什么可以替代的方式。
如何防止XSS攻击
在某些情况下,通过编写代码防止跨站脚本攻击不是很难,但是根据应用程序的复杂性及其处理用户可控数据的方式,可能会更加困难。
一般来说,有效防止XSS漏洞可能涉及以下措施的组合:
●到达时过滤输入。在接收到用户输入时,尽可能严格地根据预期或有效输入进行过滤。
●在输出上编码数据。在HTTP响应中输出用户可控数据时,对输出进行编码以防止其被解释为活动内容。根据输出上下文,这可能需要应用HTML、URL、JavaScript和CSS编码的组合。
●使用适当的响应标头。为了防止HTTP响应中不包含任何HTML或JavaScript的XSS,可以使用Content-Type和X-Content-Type-Options标头来确保浏览器以我们想要的方式解释响应。
●内容安全策略。作为最后一道防线,可以使用内容安全策略(CSP)来降低仍然可能发生的任何XSS漏洞的严重性。
有关跨站脚本的常见问题
●XSS漏洞有多常见?
XSS漏洞非常普遍,并且可能是最常出现的Web安全漏洞。
●XSS攻击有多常见?
很难获得在实际中XSS攻击的可靠数据,但与其他漏洞相比,它可能被利用的频率较低。
●XSS和CSRF有什么区别?
XSS涉及使网站返回恶意JavaScript,而CSRF涉及诱使受害用户执行他们不打算执行的操作。
●XSS和SQL注入有什么区别?
XSS是针对应用程序用户的客户端漏洞,而SQL注入是针对应用程序数据库的服务器端漏洞。
●如何在PHP中防止XSS?
使用允许的字符白名单过滤输入,并使用类型提示或类型转换。使用HTML上下文的htmlentities和ENT_QUOTES转义输出,或JavaScript上下文的JavaScript Unicode转义。
●如何在Java中防止XSS?
使用允许字符的白名单过滤输入,并使用注入Google Guava之类的库对HTML上下文的输出进行HTML编码,或对JavaScript上下文使用JavaScript Unicode转义。
SQL注入攻击-检索隐藏的数据
HTTP Host头漏洞攻击-概念梳理
原文始发于微信公众号(H君网安白话):跨站脚本攻击XSS-概念梳理
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论