XSS介绍
跨站脚本攻击(简称XSS),是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种,他允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响
XSS攻击可以分为三种
-
反射型XSS
-
存储型XSS
-
DOM型XSS
原理
- 反射型XSS
反射型XSS又称非持久型XSS,这种攻击方式具有一次性
攻击方式:
攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户,当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给被攻击者
当浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞
- 存储型XSS
存储型XSS又称持久型XSS,攻击脚本将被永久存储在服务器的数据库或文件中,具有很高的隐蔽性
攻击方式:
存储型XSS常见于论坛,博客,留言板,攻击者在发帖过程中,将恶意脚本连同正常信息一起注入帖子内容中,随着帖子被服务器存储下来,恶意脚本也永久的被存放在服务器的后端存储器中
当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在他们浏览器执行
- DOM型XSS
DOM全称Document Object Model 使用DOM 可以使程序脚本动态访问更新文档内容
DOM型XSS其实是一种特殊的反射型XSS,它是基于DOM文档对象模型的一种漏洞
攻击方式:
用户请求一个专门经过设计的URL,他由攻击者提交,而且其中包含XSS代码,服务器响应不会以任何形式包含攻击者的脚本,当用户浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞
常用语句和编码绕过
-
常用测试语句
-
<script>alert(1)</script>
-
<img src=x οnerrοr=alert(1)>
-
<svg οnlοad=alert(1)>
-
<a href=javascript:alert(1)>
-
-
常见的XSS绕过编码有JS编码,HTML实体编码和URL编码
- JS编码(JS提供了四种字符编码策略)
-
三个八进制数字,如果个数不够,在前边补零
-
两个十六进制数字,如果个数不够,在前边补零
-
四个十六进制数字,如果字数不够,在前边补零
-
对于一些控制字符,使用特殊的C类型转义风格(如\n和\r)
- HTML实体编码
命名实体:以&开头,以分号结尾,如”<”的编码是”<”
字符编码:十进制,十六进制,ASCII码或Unicode字符编码,样式为”&#数值;”
如”<”可以编码为”<”和”<”
- URL编码
这里的URL编码,也是两次URL全编码的结果,如果alert被过滤,结果为%25%36%31%25%36%63%25%36%35%25%37%%32%25%37%34
使用XSS编码测试时,需要考虑HTML渲染的顺序,特别是针对多种编码组合时,要选择合适的编码方式进行测试
- XSS漏洞修复意见
因为XSS漏洞涉及输入和输出两部分,所以其修复也分为两部分
过滤输入的数据,包括单引号,双引号,大于号,小于号等非法字符
对输出到页面的数据进行相应的编码转换,包括HTML实体编码,JS编码等