XSS漏洞原理
XSS攻击可以分为三种:反射型、存储型和DOM型
- 反射型 XSS
反射型XSS又称非持久型XSS ,这种攻击往往具有一次性。
攻击方式:攻击者通过电子邮件等方式将包含 XSS 代码的恶意链接发送给目标用户;
当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器;
浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
- 存储型 XSS
存储型XSS 又称持久型XSS,攻击脚本将被永久的存放再目标服务器的数据库或文件中,具有很高的隐蔽性。
攻击方式:这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中;
随着帖子被服务器存储下来,恶意脚本也永久地被存放在服务器地后端存储器中;
当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。
例如恶意攻击者在留言板中加入以下代码:
<script>alert(/XSS/)</script> #在PHP等语言中alert表示弹窗
浏览这个留言板的用户就会看到一个XSS的弹窗。
- DOM 型 XSS
DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。
DOM型XSS其实是反射型XSS的一种特殊类型,它是基于DOM文档对象模型的一种漏洞。
攻击方式:用户请求一个经过专门设计过的URL,它由攻击者提交,并且其中包含XSS代码。
服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞
XSS常用语句及编码绕过。
XSS常用测试语句:
<script>alert(1)</script>
<img src=x onerror=alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
<script>alert(document.cookie)</script> : 弹出当前页面cookie
常见的XSS的绕过编码有JS编码、HTML实体编码和URL编码。
- JS编码
JS 编码提供了四种字符编码的策略:
三个八进制数字,如果个数不够,在前面补0。
两个十六进制数字,如果个数不够,在前面补0。
四个十六进制数字,如果个数不够,在前面补0。
对一些控制字符,使用特殊的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 。