1, 百度百科
XSS, 跨站脚本攻击 (Cross Site Scripting) 缩写为 CSS, 但这会与层叠样式表 (Cascading Style Sheets,CSS) 的缩写混淆. 因此, 通常将跨站脚本攻击缩写为 XSS.
XSS 攻击, 通常指的是通过利用网页开发时留下的漏洞, 通过巧妙的方法注入恶意指令代码到网页, 使用户加载并执行攻击者恶意制造的网页程序.
这些恶意网页程序通常是 JavaScript, 但实际上也可以包括 Java, VBScript,ActiveX, Flash 或者甚至是普通的 html.
攻击成功后, 攻击者可能得到包括但不限于更
高的权限(如执行一些操作), 私密网页内容, 会话和 cookie 等各种内容.
参考:[百度百科](https://baike.baidu.com/item/XSS攻击/954065?fr=aladdin)
***
2, 攻击条件
1)向 web 页面注入恶意代码;
2)这些恶意代码能够被浏览器成功的执行
***
3,XSS 攻击类型
1)反射型 XSS(非持久型跨站): 反射型跨站脚本漏洞, 最普遍的类型. 用户访问服务器 - 跨站链接 - 返回跨站代码.
这类通常使用 URL, 具体流程:
1攻击者构造出特殊的 URL, 其中包含恶意代码.
2用户打开带有恶意代码的 URL 时, 网站服务端将恶意代码从 URL 中取出, 拼接在 HTML 中返回给浏览器.
3恶意页面中的 JavaScript 打开一个具有漏洞的 HTML 页面并将其安装在用户电脑上.
4用户浏览器接收到响应后解析执行, 混在其中的恶意代码也被执行.
5恶意代码窃取用户数据并发送到攻击者的网站, 或者冒充用户的行为, 调用目标网站接口执行攻击者指定的操作.
反射型 XSS 跟存储型 XSS 的区别是: 存储型 XSS 的恶意代码存在数据库里, 反射型 XSS 的恶意代码存在 URL 里.
反射型 XSS 漏洞常见于通过 URL 传递参数的功能, 如网站搜索, 跳转等.
由于需要用户主动打开恶意的 URL 才能生效, 攻击者往往会结合多种手段诱导用户点击.
POST 的内容也可以触发反射型 XSS, 只不过其触发条件比较苛刻(需要构造表单提交页面, 并引导用户点击), 所以非常少见.
示例:
- `http://xxx/xsstest?key=<script>alert("XSS")</script>`
- `http://xxx/xsstest?key=<img src='w.123' onerror='alert("XSS")'>`
- `http://xxx/xsstest?key=<a onclick='alert("XSS")'>点我</a>`
2)存储型 XSS(持久型跨站): 最直接的危害类型, 跨站代码存储在服务器(数据库)
攻击流程:
1攻击者构造出特殊的 URL, 其中包含恶意代码.
2用户打开带有恶意代码的 URL.
3用户浏览器接收到响应后解析执行, 前端 JavaScript 取出 URL 中的恶意代码并执行.
4恶意代码窃取用户数据并发送到攻击者的网站, 或者冒充用户的行为, 调用目标网站接口执行攻击者指定的操作.
DOM 型 XSS 跟前两种 XSS 的区别: DOM 型 XSS 攻击中, 取出和执行恶意代码由浏览器端完成, 属于前端 JavaScript 自身的安全漏洞, 而其他两种 XSS 都属于服务端的安全漏洞.
示例:
1窃取用户信息, 如 cookie,token, 账号密码等.
`<script>alert("xss")</script>`
2生成一些恶意图片, 文字, 用户点击图片或文字, 跳转至相应目标网站
`<img onclick="window.location.href='http://xxx.com'"width='300'src='img/testxss.jpg'/>`
3劫持流量实现恶意跳转
`<script>window.location.href="http://xxx.com";</script>`
3)DOM 跨站(DOM XSS):DOM(document object model 文档对象模型), 客户端脚本处理逻辑导致的安全问题.
攻击流程:
1攻击者构造出特殊的 URL, 其中包含恶意代码.
2用户打开带有恶意代码的 URL.
3用户浏览器接收到响应后解析执行, 前端 JavaScript 取出 URL 中的恶意代码并执行.
4恶意代码窃取用户数据并发送到攻击者的网站, 或者冒充用户的行为, 调用目标网站接口执行攻击者指定的操作.
DOM 型 XSS 跟前两种 XSS 的区别: DOM 型 XSS 攻击中, 取出和执行恶意代码由浏览器端完成, 属于前端 JavaScript 自身的安全漏洞, 而其他两种 XSS 都属于服务端的安全漏洞.
参考:
[网络攻击 - XSS 攻击详解](https://www.cnblogs.com/mao2080/p/9460397.html)
[Web 安全之 XSS 攻击](https://www.cnblogs.com/stefanieszx11/p/8602138.html)
[前端安全系列(一): 如何防止 XSS 攻击?](https://www.freebuf.com/articles/web/185654.html)
***
4, 漏洞总结
1在 HTML 中内嵌的文本中, 恶意内容以 script 标签形成注入.
2在内联的 JavaScript 中, 拼接的数据突破了原本的限制(字符串, 变量, 方法名等).
3在标签属性中, 恶意内容包含引号, 从而突破属性值的限制, 注入其他属性或者标签.
4在标签的 href,src 等属性中, 包含 JavaScript: 等可执行代码.
5在 onload,onerror,onclick 等事件中, 注入不受控制代码.
6在 style 属性和标签中, 包含类似 background-image:url("javascript:..."); 的代码(新版本浏览器已经可以防范).
7在 style 属性和标签中, 包含类似 expression(...) 的 CSS 表达式代码(新版本浏览器已经可以防范).
5, 防御规则
1)不要在允许位置插入不可信数据
2)在向 HTML 元素内容插入不可信数据前对 HTML 解码
3)在向 HTML 常见属性插入不可信数据前进行属性解码
4)在向 HTML JavaScript DATA Values 插入不可信数据前, 进行 JavaScript 解码
5)在向 HTML 样式属性插入不可信数据前, 进行 CSS 解码
6)在向 HTML URL 属性插入不可信数据前, 进行 URL 解码
***
5, 防御攻击方法
1验证所有输入数据, 有效监测攻击;
2对所有输出数据进行适当编码, 防止任何已成功注入的脚本在浏览器端运行;
3输入长度做限制(对于不受信任的输入, 都应该限定一个合理的长度. 虽然无法完全防止 XSS 发生, 但可以增加 XSS 攻击的难度);
4禁止加载外域代码, 防止复杂的攻击逻辑;
5禁止外域提交, 网站被攻击后, 用户的数据不会泄露到外域;
6禁止内联脚本执行(规则较严格, 目前发现 GitHub 使用);
7禁止未授权的脚本执行(新特性, Google Map 移动版在使用);
8合理使用上报可以及时发现 XSS, 利于尽快修复问题;
9禁止 JavaScript 读取某些敏感 Cookie, 攻击者完成 XSS 注入后也无法窃取此 Cookie.
来源: https://www.cnblogs.com/nayli-blogs/p/11588783.html