Web 安全漏洞之 XSS 攻击

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

什么是 XSS 攻击

XSSCross-Site Scripting又称跨站脚本XSS的重点不在于跨站点而是在于脚本的执行。XSS是一种经常出现在 Web 应用程序中的计算机安全漏洞是由于 Web 应用程序对用户的输入过滤不足而产生的。

常见的 XSS 攻击有三种反射型、DOM-based 型、存储型。 其中反射型、DOM-based 型可以归类为非持久型 XSS 攻击存储型归类为持久型 XSS 攻击。

1.反射型

反射型 XSS 一般是攻击者通过特定手法如电子邮件诱使用户去访问一个包含恶意代码的 URL当受害者点击这些专门设计的链接的时候恶意代码会直接在受害者主机上的浏览器执行。

对于访问者而言是一次性的具体表现在我们把我们的恶意脚本通过 URL 的方式传递给了服务器而服务器则只是不加处理的把脚本“反射”回访问者的浏览器而使访问者的浏览器执行相应的脚本。反射型 XSS 的触发有后端的参与要避免反射性 XSS必须需要后端的协调后端解析前端的数据时首先做相关的字串检测和转义处理。

此类 XSS 通常出现在网站的搜索栏、用户登录口等地方常用来窃取客户端 Cookies 或进行钓鱼欺骗。

整个攻击过程大约如下

2.DOM-based 型

客户端的脚本程序可以动态地检查和修改页面内容而不依赖于服务器端的数据。例如客户端如从 URL 中提取数据并在本地执行如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本而这些脚本没有经过适当的过滤和消毒那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URLlocation.hashlocation.searchdocument.referrer 等。

整个攻击过程大约如下

3.存储型

攻击者事先将恶意代码上传或储存到漏洞服务器中只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客都有可能会执行这段恶意脚本因此储存型XSS的危害会更大。

存储型 XSS 一般出现在网站留言、评论、博客日志等交互处恶意脚本存储到客户端或者服务端的数据库中。

整个攻击过程大约如下

XSS 攻击的危害

XSS 可以导致

1.攻击劫持访问
2.盗用 cookie 实现无密码登录
3.配合 csrf 攻击完成恶意请求
4.使用 js 或 css 破坏页面正常的结构与样式等

防御方法

1. XSS 防御之 HTML 编码

应用范围将不可信数据放入到 HTML 标签内例如div、span等的时候进行HTML编码。

编码规则将 & < > " ’ / 转义为实体字符或者十进制、十六进制。

示例代码

 function encodeForHTML(str, kwargs){return ('' + str).replace(/&/g, '&amp;').replace(/</g, '&lt;') // DEC=> &#60; HEX=> &#x3c; Entity=> &lt;.replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;') // &apos; 不推荐因为它不在HTML规范中.replace(/\//g, '&#x2F;');}; 

HTML 有三种编码表现方式十进制、十六进制、命名实体。例如小于号<可以编码为 “十进制> <”, “十六进制=> <”, “命名实体=> <” 三种方式。对于单引号'由于实体字符编码方式不在 HTML 规范中所以此处使用了十六进制编码。

2. XSS 防御之 HTML Attribute 编码

应用范围将不可信数据放入 HTML 属性时不含src、href、style 和事件处理属性进行 HTML Attribute 编码

编码规则除了字母数字字符以外使用 &#xHH;(或者可用的命名实体)格式来转义ASCII值小于256所有的字符​​​​​​​

示例代码

 function encodeForHTMLAttibute(str, kwargs){let encoded = '';for(let i = 0; i < str.length; i++) {let ch = hex = str[i];if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {hex = '&#x' + ch.charCodeAt(0).toString(16) + ';';}encoded += hex;}return encoded;}; 

3. XSS 防御之 JavaScript 编码

作用范围将不可信数据放入事件处理属性、JavaScirpt值时进行 JavaScript 编码

编码规则除字母数字字符外请使用\xHH格式转义ASCII码小于256的所有字符

示例代码

 function encodeForJavascript(str, kwargs) {let encoded = '';for(let i = 0; i < str.length; i++) {let cc = hex = str[i];if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {hex = '\\x' + cc.charCodeAt().toString(16);}encoded += hex;}return encoded;}; 

4. XSS 防御之 URL 编码

作用范围将不可信数据作为 URL 参数值时需要对参数进行 URL 编码

编码规则将参数值进行 encodeURIComponent 编码

示例代码

 function encodeForURL(str, kwargs){return encodeURIComponent(str);}; 

5. XSS 防御之 CSS 编码

作用范围将不可信数据作为 CSS 时进行 CSS 编码

编码规则除了字母数字字符以外使用\XXXXXX格式来转义ASCII值小于256的所有字符

示例代码

 function encodeForCSS (attr, str, kwargs){let encoded = '';for (let i = 0; i < str.length; i++) {let ch = str.charAt(i);if (!ch.match(/[a-zA-Z0-9]/) {let hex = str.charCodeAt(i).toString(16);let pad = '000000'.substr((hex.length));encoded += '\\' + pad + hex;} else {encoded += ch;}}return encoded;}; 

后记

在任何时候用户的输入都是不可信的。对于 HTTP 参数理论上都要进行验证例如某个字段是枚举类型其就不应该出现枚举以为的值对于不可信数据的输出要进行相应的编码此外httpOnlyCSPX-XSS-ProtectionSecure Cookie 等也可以起到有效的防护。

XSS 漏洞有时比较难发现所幸当下React、Vue等框架都从框架层面引入了 XSS 防御机制一定程度上解放了我们的双手。 但是作为开发人员依然要了解 XSS 基本知识、于细节处避免制造 XSS 漏洞。框架是辅助我们仍需以人为本规范开发习惯提高 Web 前端安全意识。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6