XSS全称跨站脚本(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。跨站点脚本(XSS)攻击是一种注射型攻击,攻击者在可信的网页中嵌入恶意代码,用户访问可信网页时触发XSS而被攻击。
攻击者通过Web应用程序发送恶意代码,一般以浏览器脚本的形式发送给不同的终端用户。当一个Web程序的用户输入点没有进行校验和编码,将很容易的导致XSS。
通过在用户端注入恶意的可执行脚本,若服务器对用户的输入不进行处理或处理不严,则浏览器就会直接执行用户注入的脚本。
又称非持久型XSS,这种攻击方式往往具有一次性,只在用户单击时触发。
网站的搜索栏、用户登录入口、输入表单等地方,常用来窃取客户端cookies或钓鱼欺骗。
攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接受该目标用户的请求并进行处理,然后服务器把带有XSS的代码发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
又称持久型XSS,比反射型XSS更具有威胁性,并且可能影响到Web服务器自身的安全。攻击脚本将被永久的存放在目标服务器的数据库或文件中。
论坛、博客、留言板、网站的留言、评论、日志等交互处。
攻击者在发帖或留言的过程中,将恶意脚本连同正常信息一起注入到发布内容中。随着发布内容被服务器存储下来,恶意脚本也将永久的存放到服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在用户的浏览器中得到执行。
DOM(Document object model),使用DOM能够使程序和脚本能够动态访问和更新文档的内容、结构和样式。
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象的一种漏洞。DOM型XSS是基于js上的。不需要与服务器进行交互。
通过js脚本对对文档对象进行编辑,从而修改页面的元素。也就是说,客户端的脚本程序可以DOM动态修改页面的内容,从客户端获取DOM中的数据并在本地执行。由于DOM是在客户端修改节点的,所以基于DOM型的XSS漏洞不需要与服务器d端交互,它只发生在客户端处理数据的阶段。
用户请求一个经过专门设计的URL,它由攻击者提供,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本,当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。
标签
<IMG SRC=javascript:alert(String.formCharCode(88,83,83))>
<img STYLE="background-image:url(javascript:alert('XSS'))">
<img src="x" onerror=alert(1)>
标签<a href="https://www.baidu.com">baidua>
<a href="javascript:alert('xss')">aaa>
aaa>
<a href="javascript:aaa" onmouseover="alert(/xss/)">aaa>
<script>alert('xss')script>
aaa>
aaa>
aaa>
input
标签<input name="name" value="">
<input name="name" value=""><script>alert('xss')script>
<form method=post action="data:text/html;base64,">
<form method=post action="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
标签<iframe>
<iframe src="data:text/html,<script>alert('xss')</script>">iframe>
<iframe src="data:text/html;base64,">
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
<iframe>
<iframe src="javascript:prompt(`xss`)">iframe>
svg<>
标签<svg onload=alert(1)>
在线xss转码:https://www.toolmao.com/xsstranser
JS提供了四种字符编码的策略,
a
的编码为\141
a
的编码为\x61
a
的编码为\u0061
\n
和\r
以&
开头,以分号结尾的,如<
的编码为&1t;
十进制,十六进制的ASCII码或者Unicode字符编码。样式为数值;
如<
的编码为
<
(10进制)
<
(16进制)
这里为url全编码,也就是两次url编码
如alert
的url全编码为%25%36%31%25%36%63%25%36%35%25%37%32%25%37%34
如alert
的编码为String.fromCharCode(97,108,101,114,116)
输入验证
对用户提交的数据进行有效验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略除此以外的其他任何数据。
常见的检测或过滤:
数据消毒
除了在客户端验证数据的合法性,输入过滤中最重要的还是过滤和净化有害的输入,例如如下常见的敏感字符:
|| < > ' " & # javascript expression
对输出的数据进行编码,如HTML编码,就是让可能造成危害的信息变成无害。
两点注意点:
微软开发的,.Net平台下的,用于方式XSS攻击的类库,它提供了大量的编码函数来对用户输入的数据进行编码,可以实现基于白名单的输入的过滤和输出编码。
当Cookie在消息头中被设置为HttpOnly时,这样支持Cookie的浏览器将阻止客户端Javascript直接访问浏览器中的cookies,从而达到保护敏感数据的作用。
Noscript是一款免费的开源插件,该插件默认禁止所有脚本,但可以自定义设置允许通过的脚本。
使用WAF,比如软WAF,硬WAF、云WAF等。