XSS攻击
XSS(Cross Site Scripting) 攻击,跨站脚本攻击,因为缩写 CSS 和层叠样式表(Cascading Style Script)冲突,所以改为 XSS。
XSS 攻击者在 Web 页面插入恶意的脚本,当用户访问该页面时,嵌入到页面中的恶意脚本执行,从而攻击用户。
非持久型XSS(反射型XSS)
通过特定手法(如电子邮件、网站论坛发布包装链接等),诱使用户去访问一个包含恶意代码的 URL,当受害者点击该链接的时候,恶意代码就会直接在受害者主机上的浏览器执行。
原理
一个简易的假设如下,输入一个脚本得到一个脚本结果。
- 客户端访问指定页面(漏洞页面);
- 在表单(搜索框)中输入 XSS 代码(
<script>alert(1)</script>
),提交,即访问(http://test.com/?=<script>alert(1)</script>
); - 服务器收到请求,解析,并返回响应内容(含有 XSS 代码);
- 浏览器解析响应(解析过程中会执行 XSS 代码);
- alert(1) 被执行。
条件
- 页面对特殊字符未转义
特点
- 即时性,不进行服务器存储;
- 需要诱使用户点击;
- 盗取用户信息。
防御
- 页面渲染的所有内容应该来自服务端;
- 对特殊字符做转义处理(传向服务器的数据和服务器传来的数据);
- 对重要的 cookie 设置 httpOnly,避免 cookie 被客户端恶意的 JS 窃取。
持久型XSS(存储型XSS)
通过特定手法(留言板),将XSS代码提交存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交 XSS 代码,而是从服务器解析之后加载出来。
原理
一个简易的假设如下,输入一个脚本存储到服务器,每次在请求指定页面时,都会直接读取解析到之前在该页面存储的 XSS 代码。
- 客户端访问指定页面(漏洞页面);
- 在表单(留言板)中输入 XSS 代码(
<script>alert(1)</script>
),提交; - 服务器收到请求,解析,并返回响应内容(含有 XSS 代码);
- 浏览器解析响应(解析过程中会执行 XSS 代码);
- alert(1) 被执行;
- 再次访问该页面,浏览器自动解析留言内容;
- alert(1) 被执行。
条件
须同时满足以下条件。
- 后端对前端的 POST 请求未做转义就直接入库;
- 后端从数据库中取出的数据未做转义就直接输出给前端;
- 前端拿到后端的数据未做转义就直接渲染成 DOM。
特点
- 植入在数据库中;
- 危害面广;
- 盗取用户信息。
防御
对需要达成 XSS 的条件进行阻断。
- 后端对前端的 POST 请求须做转义再入库;
- 后端从数据库中取出的数据须做转义再输出给前端;
- 前端拿到后端的数据须做转义再渲染成 DOM。
DOM-based XSS
通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。
原理
- 攻击者构造出特殊的URL、在其中可能包含恶意代码;
- 用户打开带有恶意代码的URL;
- 用户浏览器收到响应后解析执行。前端使用js取出url中的恶意代码并执行;
- 执行时,恶意代码窃取用户数据并发送到攻击者的网站中,那么攻击者网站拿到这些数据去冒充用户的行为操作。调用目标网站接口执行攻击者一些操作。
条件
存在下列任何一个就有可能触发。
- 使用document.write直接输出数据。
- 使用innerHTML直接输出数据。
- 使用location、location.href、location.replace、iframe.src、document.referer、window.name等。
特点
- 仅发生在客户端,服务器不参与。
防御
- 前端页面对特殊字符做转义;
- 少用满足条件的代码,尽可能做代码替换(纯文本时 innerText、textContent 比 innerHTML 更贴切)。
常见特殊字符转义表
特殊字符 | 转义字符 |
---|---|
& | & |
< | < |
> | > |
空格 | |
‘ | ' |
“ | " |
/ | / |
原文作者: ShanYi Hui
原文链接: http://huishanyi.club/2020/07/15/Web安全/XSS攻击/
版权声明: 转载请注明出处(必须保留作者署名及链接)