乐趣区

xss攻击执行原理分析

什么是 XSS?
xss 全称跨站脚本(Cross-site scripting), 是为不和层叠样式表 (Cascading Style Sheets, CSS) 的缩写混淆,故将跨站脚本攻击缩写为 XSS。是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及用户端脚本语言。

危害
XSS 带来的危害有:窃取用户 cookies,窃取个人信息;劫持会话,操纵用户网络数据;发起 ddos 攻击; 篡改页面、弹出广告等。

类型
1、非持久型

1.1 反射型 用户将带有 xss 攻击的代码作为用户输入传给服务端,服务端没有处理用户输入直接返回给前端。

1.2 DOM-based 型 DOM-based xss 是由于浏览器解析机制导致的漏洞,服务器不参与。因为不需要服务器传递数据,xss 代码会从 url 中注入到页面中,利用浏览器解析 script、某些标签的属性和方法触发 xss。

2、持久型 用户含有 xss 代码的输入被存储到数据库或者存储文件上。

xss 执行原理
造成 xss 代码执行的根本原因就在数据渲染到页面过程中,html 解析触发执行了 xss 脚本。

脚本的注入分两类:

1、直接注入 script 脚本。

2、通过某些标签的属性和事件。比如:

<img src="aaa.png" onerror="javascript:alert('xss');">
<a href="javascript:alert('xss');">xss</a>

直接注入 script 脚本:我们可能经常使用 jquery, 通过 html()方法去操作页面。这个时候就会触发 xss, 因为 jquery 的 html()方法设计初衷就是让 js 脚本执行。

原因是:jquery 解析到 script 就会通过 createElement(‘script’)创建一个 script 节点,而此时浏览器就会去执行这个 script; 同样的原生 js 的 api,innerHTML 也会把含有 script 脚本的字符串当成标签解析到浏览器,只不过因为浏览器加载 js 的原则:只会在页面加载时执行一次。所以通过 innerHTML 无法触发 xss。text()、innerText 等方法都是把含 xss 字符串当作文本节点,所以无法被解析成 html 节点,也就不会触发 xss。

通过属性和事件:

<img src="aaa.png" onerror="javascript:alert('xss')">

因为 img 标签未闭合所以会触发 onerror 事件,导致 xss 脚本执行。
通过属性和事件触发是依赖 html 标签注入到页面,在这个过程中会被 chrome 浏览器的 XSS Auditor 拦截。

防御
请记住一句:不要相信用户的输入。

XSS 防御的总体思路是:对输入 (和 URL 参数) 进行过滤,对输出进行转义。

退出移动版